어색한 스크립트에서 셸 변수를 사용하려면 어떻게 해야 하나요?

외부 셸 변수를 awk 스크립트에 전달하는 몇 가지 방법을 찾았지만 에 대해 혼란스러워합니다.

먼저 셸 스크립트로 시도해 보았습니다:

$ v=123test
$ echo $v
123test
$ echo "$v"
123test

그런 다음 어색하게 시도했습니다:

$ 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 

혼란스럽습니다.

질문에 대한 의견 (2)
해결책

셸 변수를 awk로 가져오기

로 가져오는 방법은 여러 가지가 있습니다. 어떤 방법은 다른 방법보다 낫습니다. 여기서는 대부분의 방법을 다룹니다. 의견이 있으시면 아래에 남겨 주세요.


v` 사용(가장 좋은 방법, 가장 휴대성이 좋음)

v옵션 사용: (참고로-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\t가 아닌 실제 이 되도록 해석됩니다. ENVIRON[]을 사용하여 해결하거나ARGV[]`를 통해 액세스할 수 있습니다.

PS 세 개의 세로 막대를 구분 기호 |||로 사용할 경우 이스케이프할 수 없으므로 `-F"[|][|][|][|]"를 사용하세요.

프로그램/함수에서 awk로 데이터를 가져오는 예제(여기서는 날짜가 사용됨)

awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'

코드 블록 뒤에 변수

여기서는 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

이런 식으로 변수를 사용하면 BEGIN 블록에서 작동하지 않습니다:

echo "input data" | awk 'BEGIN {print var}' var="${variable}"

여기 문자열

변수를 지원하는 셸(Bash 포함)에서 [here-string][1]을 사용하여 awk에 변수를 추가할 수도 있습니다:


awk '{print $0}' 
해설 (6)

좋은 세 것으로 보인다 '환경' [태그: awk] 내장현 해시라고 전혀 언급하지 않고 있다. 예를 들어 사용.

$ X=Solaris awk 'BEGIN{print ENVIRON["X"], ENVIRON["TERM"]}'
Solaris rxvt
해설 (3)

셸 변수에서 백슬래시를 처리하는 방법에 따라 이 중 하나를 사용합니다(avar는 어색한 변수, svar는 셸 변수):

awk -v avar="$svar" '... avar ...' file
awk 'BEGIN{avar=ARGV[1];ARGV[1]=""}... avar ...' "$svar" file

자세한 내용 및 기타 옵션은 http://cfajohnson.com/shell/cus-faq-2.html#Q24 을 참조하세요. 위의 첫 번째 방법은 거의 항상 최선의 선택이며 가장 명확한 의미를 갖습니다.

해설 (0)

명령줄 옵션]1 -v에 변수 이름(v)과 환경 변수 값(=)을 함께 전달할 수 있습니다("${v}&quot):

% awk -vv="${v}" 'BEGIN { print v }'
123test

또는 v를 훨씬 적게 사용하여 더 명확하게 만들 수도 있습니다:

% environment_variable=123test
% awk -vawk_variable="${environment_variable}" 'BEGIN { print awk_variable }'
123test
해설 (0)

Argv 활용할 수 있습니다.

v=123test
awk 'BEGIN {print ARGV[1]}' "$v"

단, 앞으로 이어질 경우 몸에 조정하십시오 합니다 아리스:

awk 'BEGIN {ARGC--} {print ARGV[2], $0}' file "$v"
해설 (0)

난 이미 데이트였어 삽입하려면 로그 파일의 맨 앞에 선 및 it& # 39 의 수행되 그것을비유하사 다음과 같습니다.

DATE=$(date +"%Y-%m-%d")
awk '{ print "'"$DATE"'", $0; }' /path_to_log_file/log_file.log

다른 파일 리디렉션합니다 저장할 수 있습니다.

해설 (2)

그냥 변경일 @Jotne& # 39 에 대한 해답 loop&quot ";).

for i in `seq 11 20`; do host myserver-$i | awk -v i="$i" '{print "myserver-"i" " $4}'; done
해설 (1)