awk -v 변수 할당

awk -v 변수 할당

*nix/awk 초보자입니다. 아래의 간단한 awk -v 예제 구문에 어떤 문제가 있는지 궁금합니다.

# this line produces the expected result, 'xyz'
echo "abc xyz" | /usr/bin/awk -v ttl="$2" '{print $2}'

# but this line does not, it prints a blank line
echo "abc xyz" | /usr/bin/awk -v ttl="$2" '{print ttl}'

위의 -v 옵션에 내가 뭘 잘못하고 있는 걸까요?

도움을 주셔서 미리 감사드립니다.

답변1

첫 번째 예를 살펴보겠습니다.

echo "abc xyz" | /usr/bin/awk -v ttl="$2" '{print $2}'

그러면 awk변수가 두 번째 셸 스크립트 매개변수¹로 설정됩니다. awk그런 다음 코드는 변수를 무시하고 변수를 다음으로 바꿉니다.표준 입력, 즉. xyz유일한 라인으로. 인쇄하면 ttl비어 있음을 알 수 있습니다.

기본적으로 첫 번째는 $2쉘에 의해 수행되는 쉘 매개변수 확장이고, 두 번째는 각 라인에 대해 평가되는 awk필드( $숫자 2에 적용되는 연산자, 쓸 수도 있습니다. $ 2또는 $ (1 + 1)...)입니다.표준 입력통과 awk.

이제 두 번째 예를 고려해 보겠습니다.

echo "abc xyz" | /usr/bin/awk -v ttl="$2" '{print ttl}'

그러면 awk변수가 두 번째 쉘 스크립트 매개변수 1로 설정됩니다. 그런 다음 코드는 awk비어 있는 각 줄에 대해 해당 변수를 인쇄합니다.표준 입력.

쉘 컨텍스트에서 $2쉘 스크립트에 대한 두 번째 인수입니다. 명령줄에서 직접 실행하면 "두 번째 인수"²가 없으므로 비어 있습니다. 그러나 스크립트로 실행하면 값이 있을 수 있습니다.

#!/bin/sh -
printf 'This is $2: %s\n' "$2"

파일에 저장 demo하고 실행 가능하게 만듭니다 chmod a+x demo. 이제 실행하고 관찰하세요:

./demo one
./demo one two
./demo one two three

불행하게도 귀하는 달성하려는 목표를 알려주지 않았으므로 귀하의 요구 사항에 대한 솔루션을 제안할 수 없습니다. 하지만 이 답변에서 메시지를 얻으시길 바랍니다.

출력할 필드를 지정 하려면 다음을 ttl사용할 수 있습니다.

$ echo "abc xyz" | awk -v ttl=2 '{print $ ttl}'
xyz

1 그러나 구문을 사용할 때 값의 -v var=value이스케이프 시퀀스 (예: \n, ... )는 awk에 의해 확장되므로 포함하는 경우 대신 개행 문자가 포함됩니다.\v$2\nttl\n

set one two three2=two² 이는 사전에 실행하지 않았거나 일부 쉘에서 실행하지 않은 경우 argv=(one two three)쉘에서 위치 매개변수를 동적으로 변경하는 방법입니다 .

답변2

두 번째 경우에는 $2값이 없습니다. 스크립트에는 $2가치가 있습니다 awk. 다음과 같이 설정하면:

AAA="test123"
echo "abc xyz" | /usr/bin/awk -v ttl="$AAA" '{print ttl}'

AAA쉘 환경에서 얻은 변수 값을 인쇄합니다.

특정 변수에 명시적으로 사용하려는 경우 awk다음과 같이 할 수 있습니다.

echo "abc xyz" | /usr/bin/awk  '{ttl=$2;print ttl}'

관련 정보