awk 스크립트에서 셸 변수를 사용하려면 어떻게 해야 합니까?
외부 셸 변수를 전달하기 위한 몇 가지 방법을 찾았습니다.awk
대본이 좀 헷갈리네요'
그리고."
.
먼저 셸 스크립트를 사용해 보았습니다.
$ v=123test
$ echo $v
123test
$ echo "$v"
123test
그리고 나서 awk를 시도했습니다:
$ awk 'BEGIN{print "'$v'"}'
$ 123test
$ awk 'BEGIN{print '"$v"'}'
$ 123
왜 다른 거죠?
마지막으로 해봤습니다.
$ awk 'BEGIN{print " '$v' "}'
$ 123test
$ awk 'BEGIN{print ' "$v" '}'
awk: cmd. line:1: BEGIN{print
awk: cmd. line:1: ^ unexpected newline or end of string
저는 이것에 대해 혼란스러워요.
#쉘 변수를 가져오는 중입니다.
awk
여러 가지 방법으로 수행될 수 있습니다.어떤 사람들은 다른 사람들보다 낫습니다.이 정도면 대부분 커버할 수 있을 거예요댓글 남겨주세요. v1.5
사용.-v
(가장 좋은 방법, 가장 휴대성이 뛰어납니다.)
를 사용합니다.-v
옵션: (P.S. 뒤에 공백을 사용합니다.)-v
그렇지 않으면 휴대성이 떨어집니다.예.,awk -v var=
것은 아니다.awk -vvar=
)
variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two
이 옵션은 대부분과 호환되어야 합니다.awk
변수는 에서 사용할 수 있습니다.BEGIN
차단할 수도 있습니다.
변수가 여러 개인 경우 다음을 수행합니다.
awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'
경고합니다.에드 모튼이 쓴 것처럼 탈출 시퀀스는 그렇게 해석될 것입니다\t
현실이 됩니다tab
그리고 아니다\t
그게 당신이 찾는 거라면요다음을 사용하여 해결할 수 있습니다.ENVIRON[]
또는 다음을 통해 액세스합니다.ARGV[]
추신 세로 막대나 다른 regexp 메타 문자를 구분 기호로 가지고 있다면 다음과 같습니다.|?(
이중 탈출을 해야 합니다예: 세 개의 세로 막대가 있습니다.|||
된다-F'\\|\\|\\|'
. 을(를) 사용할 수도 있습니다.-F"[|][|][|]"
.
프로그램/기능 여관에서 데이터를 가져오는 예제입니다.
awk
(여기에 날짜가 사용됩니다.)
awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'
셸 변수의 내용을 regexp로 테스트하는 예:
awk -v var="$variable" '$0 ~ var{print "found it"}'
코드 블록 후 변수입니다.
여기 변수가 있습니다.awk
코드입니다. 이 기능은 잘 작동합니다.BEGIN
차단합니다.
variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file
- 다중 변수를 추가합니다.
awk '{print a,b,$0}' a="$var1" b="$var2" file
- 이 방법으로 다른 필드 구분 기호를 설정할 수도 있습니다.
FS
각 파일에 대해 선택합니다.
awk 'some code' FS=',' file1.txt FS=';' file2.ext
- 코드 블록 뒤의 변수는 다음에 대해 작동하지 않습니다.
BEGIN
차단합니다.
echo "input data" | awk 'BEGIN {print var}' var="${variable}"
여기 스트링이요
변수를 추가할 수도 있습니다.awk
셸(Bash 포함)에서 다음 문자열을 사용합니다.
awk '{print $0}' <<< "$variable"
test
이것은 다음과 같습니다.
printf '%s' "$variable" | awk '{print $0}'
추신: 이것은 변수를 파일 입력으로 처리합니다.
ENVIRON
입력하세요
TrueY가 쓰는 대로 다음을 사용할 수 있습니다.ENVIRON
인쇄하기 위해 사용합니다.AWK를 실행하기 전에 변수를 설정하면 다음과 같이 인쇄할 수 있습니다.
X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash
ARGV
입력하세요
Steven Penny가 쓰듯이, 당신은 사용할 수 있습니다.ARGV
데이터를 awk로 가져옵니다.
v="my data"
awk 'BEGIN {print ARGV[1]}' "$v"
my data
데이터를 BEGIN뿐만 아니라 코드 자체에 넣으려면 다음과 같이 하십시오.
v="my data"
echo "test" | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var, $0}' "$v"
my data test
코드 내 변수: 주의하여 사용하십시오.
이 때 변수를 할 수 있습니다.awk
코드지만, 지저분하고 읽기 힘듭니다.Charles Duffy
이 버전도 코드 주입의 대상일 수 있습니다.만약 가 변수에 나쁜 것을 추가하면, 그 변수는 '변수'의 일부로 실행됩니다.awk
이것은 코드 내의 변수를 추출하여 작동하므로 변수가 코드 내의 일부가 됩니다.
'만들다'를 만들어 보세요.awk
변수를 사용하면 동적으로 변경될 수 있지만 일반 변수에는 사용하지 마십시오.
variable="line one\nline two"
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
다음은 코드 주입의 예입니다.
variable='line one\nline two" ; for (i=1;i<=1000;++i) print i"'
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
1
2
3
.
.
1000
이렇게 많은 명령어를 추가할 수 있습니다.awk
잘못하다 잘못된 명령으로 충돌시킬 수도 있습니다.유효하지 않은 명령으로 충돌시킬 수도 있습니다.
그러나 이 접근법의 한 가지 유효한 사용법은 기호를 awk에 전달하여 일부 입력(예: 단순 계산기)에 적용하려는 경우입니다.
$ calc() { awk -v x="$1" -v z="$3" 'BEGIN{ print x '"$2"' z }'; }
$ calc 2.7 '+' 3.4
6.1
$ calc 2.7 '*' 3.4
9.18
셸 변수 값으로 채워진 awk 변수를 사용하여 awk가 해석하기 전에 셸 변수를 확장하여 awk 스크립트 텍스트의 일부로 만들어야 합니다(아래 Ed M의 주석 참조).
추가 정보:
큰따옴표를 사용합니다.
변수는 항상 큰따옴표로 묶는 것이 ."$variable"
그렇지 않으면 여러 줄이 긴 단일 줄로 추가됩니다.
예를 들어 다음과 같습니다.
var="Line one
This is line two"
echo $var
Line one This is line two
echo "$var"
Line one
This is line two
큰따옴표 없이 얻을 수 있는 기타 오류는 다음과 같습니다.
variable="line one\nline two"
awk -v var=$variable 'BEGIN {print var}'
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ backslash not last character on line
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ syntax error
또한 작은 따옴표를 사용하여 변수의 값을 확장하지 않습니다.
awk -v var='$variable' 'BEGIN {print var}'
$variable
AWK 및 변수에 대해 자세히 알아봅니다.
이 FAQ를 읽어 보십시오.
옛날에는 잘 지내던 것 같아요.ENVIRON
awk 기본 제공 해시는 전혀 언급되지 않았습니다.사용 예는 다음과 같습니다.
$ X=Solaris awk 'BEGIN{print ENVIRON["X"], ENVIRON["TERM"]}'
Solaris rxvt
명령줄 옵션을 전달할 수 있습니다. -v
변수 이름(변수 이름)을 합니다.v
( )와 값()이 있습니다=
환경 변수()의 )입니다"${v}"
다음을 수행합니다.
% awk -vv="${v}" 'BEGIN { print v }'
123test
아니면 좀 더 하게 말씀드리자면 (더 적은 수치로) 표현해 주세요.v
s) 다음을 수행합니다.
% environment_variable=123test
% awk -vawk_variable="${environment_variable}" 'BEGIN { print awk_variable }'
123test
ARGV를 사용할 수 있습니다.
v=123test
awk 'BEGIN {print ARGV[1]}' "$v"
본문으로 계속 들어가려면 ARGC를 조정해야 합니다.
awk 'BEGIN {ARGC--} {print ARGV[2], $0}' file "$v"
방금 @Jotne의 "for loop"에 대한 답변을 바꿨습니다.
for i in `seq 11 20`; do host myserver-$i | awk -v i="$i" '{print "myserver-"i" " $4}'; done
로그 파일 행의 시작 부분에 날짜를 삽입해야 했고 다음과 같이 처리됩니다.
DATE=$(date +"%Y-%m-%d")
awk '{ print "'"$DATE"'", $0; }' /path_to_log_file/log_file.log
저장하기 위해 다른 파일로 리디렉션할 수 있습니다.
프로 팁입니다.
매번 모든 내용을 입력할 필요가 없도록 이 기능을 처리하는 기능을 만드는 것이 편리할 수 있습니다.선택한 솔루션을 사용하면 다음을 얻을 수 있습니다.
awk_switch_columns() {
cat < /dev/stdin | awk -v a="$1" -v b="$2" " { t = \$a; \$a = \$b; \$b = t; print; } "
}
그리고 그걸 사용하세요...
echo 'a b c d' | awk_switch_columns 2 4
Output:
a d c b
언급URL : https://stackoverflow.com/questions/19075671/how-do-i-use-shell-variables-in-an-awk-script 입니다.
'programing' 카테고리의 다른 글
단순 파이프로 소수점 2자리까지 제한합니다. (0) | 2023.04.25 |
---|---|
Angular 4에서 실시간 창 크기 변화를 감지합니다. (0) | 2023.04.25 |
SQL 구문을 사용하여 기본 키 제약 조건을 변경하려면 어떻게 해야 합니까? (0) | 2023.04.25 |
/bin/sh: apt-get: 찾을 수 없습니다. (0) | 2023.04.25 |
셀 범위에 수식을 설정합니다. (0) | 2023.04.25 |