awk 검색 패턴에 쉘 변수를 전달하는 방법은 무엇입니까? [복사]

awk 검색 패턴에 쉘 변수를 전달하는 방법은 무엇입니까? [복사]

내 bash 스크립트에는 awk를 사용하여 검색하기 위해 패턴에 전달하려는 변수가 있습니다. 그러나 내가 일어날 것이라고 예상했던 일은 일어나지 않았습니다. 다음 텍스트 파일(text.txt)이 있습니다.

-----------
Task:           a
 (some info)
  ....
------------
Task:           b 
 (some info)
  ....
------------
Task:           c
 (some info)
  ....
------------

내 스크립트의 내용은 다음과 같습니다.

letter=a
awk -v var="$letter" '/Task .* \var/' RS='-+' text.txt

그러나 이렇게 하면 다음 외에는 아무것도 얻지 못합니다.

awk '/Task .* a/' RS='-+' text.txt

나는 내가 기대한 것을 얻습니다:

Task:           a
 (some info)
  ....

노트:제가 찾고 있는 변수를 계속 변경하는 루프가 있기 때문에 이를 변수로 전달해야 합니다. 나는 awk를 사용하는 편이 나에게 가장 익숙하기 때문에 선호하지만 sed나 grep과 같은 다른 제안을 듣는 것에 반대하지는 않습니다.

답변1

전체 패턴을 awk에 전달할 수 있습니다

letter=a
awk -v pattern="Task .* $letter" -v RS='-+' '
    $0 ~ pattern
' text.txt

또는 awk에서 패턴을 문자열로 구성하십시오.

letter=a
awk -v ltr="$letter" -v RS='-+' '
    BEGIN {pattern = "Task .* " ltr}
    $0 ~ pattern
' text.txt

awk 변수에는 접두사가 없으므로 $변수에 포함할 수 없습니다. /regex constant/변수는 그 안에 있는 텍스트일 뿐입니다.

(저는 모든 awk 변수를 먼저 넣는 경향이 있습니다 -v)

답변2

가장 좋은 옵션은 아마도 환경을 통해 변수를 전달하는 것입니다.

letter=a
p="Task: *$letter" awk -v RS='-+' '$0 ~ ENVIRON["p"]' <file

또는:

p="Task: *a" awk -v RS='-+' '$0 ~ ENVIRON["p"]' <file

를 사용하면 -v var=value이스케이프 awk시퀀스의 값이 확장됩니다. awk셸에서 데이터를 있는 그대로 전달 하려는 경우 -v var="$shell_var"이는 신뢰할 수 없습니다.

ENVIRON(또는 )을 사용하는 것이 when 이 이스케이프 시퀀스를 확장하지 않기 ARGV때문에 더 안정적입니다 .awk

관련 정보