이것이 awk의 기능인지는 모르겠지만 awk 프로그램 파일을 사용하고 $0
vs를 사용하면 .$1
-f
bash command line
다음 테스트 파일을 가져옵니다.
a b c , e,f
a b c , e,f
a b c , e,f
a b c , e,f
a b c , e,f
a,bc, x
Bash 명령줄에서 다음 명령을 사용할 때:
awk "{ print $1 }" sample_input.txt
다음과 같은 결과가 나타납니다.
a b c , e,f
a b c , e,f
a b c , e,f
a b c , e,f
a b c , e,f
a,bc, x
보시다시피 이는 $1이 아닌 $0의 출력입니다. $0은 빈 줄만 출력합니다.
이제 awk 명령에서 동일한 명령을 사용하면 올바른 출력을 얻습니다.
{ print $1 }
awk -f test.awk sample_input.txt
a
a
a
a
a
a,bc,
우분투 18.04를 사용하고 있습니다.이거 좀 이상한 기능인가요 awk
?
답변1
이것은 이상한 기능은 아니지만 awk
쉘이 큰따옴표 안의 변수를 처리하는 일반적인 방식 때문입니다.
지휘 중
awk "{ print $1 }" sample_input.txt
awk
코드가 큰따옴표로 묶여 있기 때문에 쉘은 $1
첫 번째 위치 인수(일반적으로 스크립트 또는 쉘 함수의 첫 번째 명령줄 인수)의 값을 대체합니다. 값이 비어 있거나 설정되지 않은 경우 awk
스크립트 는
awk "{ print }" sample_input.txt
그 효과는 다음과 같습니다.
cat sample_input.txt
쉘 확장을 방지하려면 스크립트를 $1
작은따옴표로 묶으십시오 awk
.
awk '{ print $1 }' sample_input.txt
POSIX 표준은 큰따옴표와 작은따옴표를 사용하여 셸의 동작을 설명합니다.
문자를 작은따옴표(
''
)로 묶으면 작은따옴표 안에 있는 각 문자의 리터럴 값이 유지됩니다. 작은따옴표 안에는 작은따옴표가 포함될 수 없습니다.큰따옴표( )로 묶인 문자는 다음과 같이 백틱, , 및
""
문자를 제외하고 큰따옴표 안의 모든 문자의 리터럴 값을 유지합니다 .<dollar-sign>
<backslash>
$
매개변수 확장은 도입 후에도
<dollar-sign>
특별한 의미를 유지 해야 합니다.(매개변수 확장 참조), 명령 대체 형태(명령 대체 참조) 및 산술 확장(산술 확장 참조).[...]
(https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_02_02)