*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
\n
ttl
\n
set one two three
2=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}'