커맨드 라인을 통해 awk vars를 설정하는 두 가지 방법이 있습니까?


10

프로그램 텍스트 다음awk명령 줄에서 awk 변수를 설정 하여 O'Reilly 예제 (1997)를 발견했습니다 . 작동하지만 man / info awk 에서이 구문을 찾을 수 없습니다 . 방금 놓쳤습니까? 사용되지 않습니까 ...? 매뉴얼에서 본 유일한 구문은 옵션입니다.-v

awk '/home/{print foo, bar}' foo="cat" bar="dog" /proc/$$/cmdline

산출: cat dog

답변:


11

실제로 POSIX에 있습니다 awk(POSIX 2008 링크, 이전 버전에서도 가능했습니다). 옵션 섹션에 -v설명되어 있고 다른 방법은 피연산자 섹션에 있습니다.

-v마지막에 파일 이름으로 과제를 전달하는 것과 전달하는 것에 는 차이가 있습니다.

  • -v:

응용 프로그램은 대입 인수가 대입 피연산자와 동일한 형식인지 확인해야합니다. 지정된 변수 할당 은 BEGIN 패턴과 관련된 동작을 포함하여 awk 프로그램을 실행하기 전에 발생해야합니다 (있는 경우). 이 옵션을 여러 번 지정할 수 있습니다.

  • 파일 이름과 혼합 :

[...] 이러한 각 변수 할당 은 다음 파일을 처리하기 직전에 발생해야합니다 ( 있는 경우). 따라서 첫 번째 파일 인수 이전의 할당은 BEGIN 작업 (있는 경우) 후에 실행되고 마지막 파일 인수 이후의 할당은 END 작업 (있는 경우) 전에 발생합니다. 파일 인수가 없으면 표준 입력을 처리하기 전에 할당을 실행해야합니다.

예:

$ cat input 
hello
hello
$ awk -v var=one 'BEGIN{print var} /hello/{print var} END{print var}' \
    var=two input var=three input var=four
one
two
two
three
three
four

와! 흥미로운 제어 포인트가 추가됩니다. 감사합니다 ...
Peter.O

1
내 첫 "와우!" 여전히 보유하고 있지만 Arcege의 답변 을 자세히 살펴보면 다소 강화되었습니다 ... 나는 "var = three"라는 실제 파일로 테스트했습니다 ... 변수 할당awk 보다 우선 순위를 부여했습니다 ... 이것은 주요한 결과입니다 즉. 에서 모든 파일 이름이 양식을 가지고 경우, 그것은 무시됩니다 및 변수가 설정됩니다 ...이 충돌을 피할 수있는 유일한 방법은 현재 작업 디렉토리에 그 파일 이름을 보장함으로써 것 같다 항상해야한다 접두어 상대 경로 :./var=three
Peter.O

@ Peter.O, 그렇습니다 -v. 이는 구문이 도입 된 이유이기도 합니다. 당신은 생각해야 -v향후, 할당을 할 수있는 좋은 방법으로 구문.
dubiousjim

@ Peter.O, 파일 이름이 유효한 변수 할당 인 경우 " gotcha "에 대한 훌륭한 점. 파일 이름이 포함 된 셸 변수를 사용하고이를 인수로 전달하는 awk경우 다음 catch를 사용할 수 있습니다.[ "$myfile" == "${myfile#/}" ] && myfile="./$myfile"
Wildcard

4

이것은 외부에서 변수를 설정하는 오래된 스타일입니다 awk. 파일 이름이이면 어떻게되는지 모호 foo=cat하므로 이후 버전에서는 -v옵션이 추가되었습니다 . 이전 버전과의 호환성을 위해 작동해야하지만 보장 할 수는 없습니다. 그리고 내가 말했듯이, -v옵션은 최신 버전이므로 모든 버전 awk이 지원 하지는 않습니다 .


파일 이름 충돌 가능성에 대한 귀하의 의견은 훌륭합니다 ... 나는 그것을 테스트했으며 분명히 문제입니다. 나는 Mat의 대답에 대한 논평에서 그것에 대해 조금 더 썼다.이 이슈를 강조해 준 Thansk (+1)
Peter.O

2
실제로 [Mat s answer](http://unix.stackexchange.com/a/34258/9537), -v` 에서 설명한 바와 같이 인수 할당은 적용 시점이 다릅니다. 또한 -vPOSIX에 있으며 가장 오래된 awk구현을 제외하고 모두 존재해야합니다 . 사용 ./또는 제작하는 것은 반드시 파일 이름이 아닌 식별자 문자가 아마 명확하게 할 수있는 가장 신뢰할 수있는 방법입니다 포함되어 있습니다.
jw013
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.