쉘 변수를 awk에 /pattern/으로 전달합니다.

쉘 변수를 awk에 /pattern/으로 전달합니다.

내 쉘 함수 중 하나의 내용은 다음과 같습니다.

function _process () {
  awk -v l="$line" '
  BEGIN {p=0}
  /'"$1"'/ {p=1}
  END{ if(p) print l >> "outfile.txt" }
  '
}

이므로 as 가 호출되면 _process $argas $arg가 전달되어 $1검색 패턴으로 사용됩니다. 쉘 확장이 awk 모드를 대체하기 때문에 이렇게 작동합니다 $1! lawk 프로그램 내에서도 사용할 수 있습니다 -v l="$line".

패턴을 변수로 하여 같은 방법으로 검색이 가능한가요?

다음은 작동하지 않습니다.

awk -v l="$line" -v search="$pattern" '
  BEGIN {p=0}
  /search/ {p=1}
  END{ if(p) print l >> "outfile.txt" }
  '

/search/, awk는 이를 변수로 해석하지 않고 문자 그대로 해석하기 때문입니다 .

답변1

awk의 ~연산자를 사용하면 오른쪽에 리터럴 정규식을 제공할 필요가 없습니다.

function _process () {
    awk -v l="$line" -v pattern="$1" '
        $0 ~ pattern {p=1; exit} 
        END {if(p) print l >> "outfile.txt"}
    '  
}

exit나머지를 읽을 필요가 없기 때문에 첫 번째 일치 항목이 여기서 호출됩니다 . 그럴 필요조차 없습니다 awk. 충분하고 아마도 더 효율적이며 grep백슬래시 처리 문제를 피할 수 있습니다.awk-v var='value'

function _process () {
    grep -qe "$1" && printf '%s\n' "$line"
}

패턴에 따라 필요할 수도 있습니다.grep -Eqe "$1"

답변2

awk  -v pattern="$1" '$0 ~ pattern'

awk그래서 \n정규식에서 흔히 사용되는 백슬래시 문자를 포함시키면(GNU 4.2 이상을 사용하면 )\f\\$1$1awk로 시작 @/하고 끝나는 값 /도 문제입니다). 이 문제를 겪지 않는 또 다른 방법은 다음과 같이 작성하는 것입니다.

PATTERN=$1 awk '$0 ~ ENVIRON["PATTERN"]'

얼마나 나쁜지는 awk구현에 따라 다릅니다.

$ nawk -v 'a=\.' 'BEGIN {print a}'
.
$ mawk -v 'a=\.' 'BEGIN {print a}'
\.
$ busybox awk -v 'a=\.' 'BEGIN {print a}'
.
$ gawk -v 'a=\.' 'BEGIN {print a}'
gawk: warning: escape sequence `\.' treated as plain `.'
.
$ gawk5.0.1 -v 'a=@/foo/' BEGIN {print a}'
foo

그러나 유효한 이스케이프 시퀀스의 경우 모든 awks는 동일한 방식으로 작동합니다.

$ a='\\-\b' awk 'BEGIN {print ENVIRON["a"]}' | od -vtx1 -tc
0000000  5c  5c  2d  5c  62  0a
          \   \   -   \   b  \n
0000006

$a(컨텐츠는 그대로 채택됨)

$ awk -v a='\\-\b' 'BEGIN {print a}' | od -vtx1 -tc
0000000  5c  2d  08  0a
          \   -  \b  \n
0000004

( 백스페이스 문자 \\로 변경 \\b변경).

답변3

다음과 같이 시도해 보세요:

awk -v l="$line" -v search="$pattern" 'BEGIN {p=0}; { if ( match( $0, search )) {p=1}}; END{ if(p) print l >> "outfile.txt" }'

답변4

awk를 실행하기 전에 이 예제에서 nets 변수를 구문 분석하는 eval 함수를 사용할 수 있습니다.

nets="searchtext"
eval "awk '/"${nets}"/'" file.txt

관련 정보