쉘 스크립트에서 awk -v 변수 사용

쉘 스크립트에서 awk -v 변수 사용

회사의 이전 직원이 작성한 일부 스크립트를 수정/다시 작성하고 있는데 쉘 스크립트 중 하나에서 다음 줄을 발견했습니다.

b=`benchmark=30;grep "Waiting for timer" wk.txt | awk -vbenchmark=$benchmark '$6 > benchmark' | wc -l`

하지만 불행하게도 위의 코드 줄이 무엇을 하려는지 알 수 없습니다. 여기서 "기준" 변수를 사용하는 것이 혼란스럽습니다. 다음 값을 사용하여 더미 "wk.txt" 파일을 만들었고, 에코되면 $b 변수의 값은 1(grep+awk 명령으로 출력된 줄 수)입니다.

[sreeraj@server ~]$ cat wk.txt
24  here  above the Waiting for timer 37 make sure

스크립트 작성자가 $benchmark로 무엇을 하려고 하는지 설명해 줄 수 있는 사람이 있나요?

awk매뉴얼 페이지에는 다음이 표시되지만 -v그 기능을 이해하지 못합니다.

-v var=val
--assign var=val
          Assign the value val to the variable var, before execution of the program begins.   Such  variable  values  are
          available to the BEGIN block of an AWK program.

답변1

이렇게 하면:

awk -v benchmark=30 '...'

이는 다음과 같습니다.

awk 'BEGIN{ benchmark = 30 } ... '

변수의 초기값을 설정하는데 사용됩니다.

저자가 왜 이런 짓을 했는지는 이해가 안 되지만,

benchmark=30; ... | awk -v benchmark=$benchmark ..

그들은 다음과 같이 할 수도 있습니다:

... | awk -v benchmark=30 ..

답변2

원본 작성자가 셸에서 동일한 변수 이름을 사용하여 혼란이 발생할 수 있습니다.

benchmark=30;gr...

그/그녀가 하는 것처럼 awk:

awk -vbenchmark=$benchmark

어느예 혹은 아니오쉘 변수의 값을 변수 benchmark에 할당합니다 .awkbenchmark

awk이 값( 30이 경우) 이 있으면 입력 파일의 열 6이 이 값보다 큰지 awk확인하십시오 .wk.txt

$6 > benchmark

따라서 귀하의 예제를 사용한 테스트는 문자열 비교입니다.

for > 30

합법적이긴 하지만 실제로는 별 의미가 없습니다. 예제 입력 파일은 실제 예제입니까, 아니면 무작위 테스트입니까?

true로 평가되므로 awk전체 줄이 인쇄되고 wc -l줄 수가 계산됩니다. 입력 파일에는 행이 하나뿐이므로 열 6에서 30보다 큰 행 수는 입니다 1.

이 값은 쉘 변수에 할당됩니다 b.

관련 정보