awk에서 $1, ${1} 및 $"1"의 차이점

awk에서 $1, ${1} 및 $"1"의 차이점

스크립트를 처리하는 동안 다음 스크립트에 오류가 발생합니다.

file * | awk '{ ${1}=""; print substr(${0},2) }';

다음 두 스크립트는 모두 성공적으로 실행됩니다.

file * | awk '{ $"1"=""; print substr($"0",2) }';

그리고

file * | awk '{ $1=""; print substr($0,2) }';

매개변수 대체 에 관한 모든 것이 아닌가요 $1, ${1}, $"1"? 내 awk문법에 문제가 있는 걸까요?

답변1

awk껍질이 아닙니다. awk자체 문법, 구문 및 의미가 있습니다. 은 구문상 올바른 코드 ${1}는 아니지만 와 는 둘 다 입니다 (그리고 에서는 동일합니다 ). 에서는 대체 항목이 아닙니다.awk$1$"1"awkawk

그 중 은 awk현재 $1입력 레코드의 첫 번째 필드를 나타내며 $0전체 입력 레코드를 나타내며 셸에서는 $1첫 번째 위치 매개변수(일반적으로 스크립트 또는 함수 명령줄의 첫 번째 매개변수)를 나타내며 $0일반적으로 현재 쉘 또는 쉘 스크립트의 이름.

쉘 변수와 awk변수도 완전히 별개입니다. 그렇기 때문에 셸에서 스크립트로 값을 "가져와야" 하는 경우 awk명령줄 플래그를 사용하여 해당 변수를 설정해야 합니다.-vawk

$ awk -v var="$var" '{...}'

awk다음과 같이 스크립트에 쉘 변수 값을 제공 할 수도 있습니다 .

$ awk '{...}' var="$var"

이것은거의-v변수가 var모든 블록에서 비어 있다는 점을 제외하면 with 를 사용하는 것과 동일한 작업입니다 BEGIN. 블록 BEGIN이 실행됩니다앞으로입력 데이터 보기 및 변수 설정뒤쪽에그러한 블록의 실행.

너도 할 수 있어

$ awk '{...}' var="$value1" file1 var="$value2" file2

이로 인해 변수는 방금 처리된 쉘 변수의 값을 가져온 var다음 방금 처리된 쉘 변수의 값을 가져옵니다.$value1file1$value2file2

그렇다면문서이전 예의 이름 var="$value1"( var="42"예: 완벽하게 유효한 Unix 파일 이름)을 사용하면 파일은 다음과 같습니다.아니요처리됩니다. 또한 명령줄의 쉘 파일 이름 글로빙 패턴이 이름이 변수에 대한 할당처럼 보이는 파일을 선택하면 해당 할당이 스크립트에서 활성화됩니다 awk.

관련 정보