- awk에 bash 변수를 삽입하려면 어떻게 해야 합니까?(예를 들어 일부 for 루프에서 이 작업을 수행해야 합니다. 다음과 같이 첫 번째 반복에서 awk를 사용하여 첫 번째 열로 문자열을 검색한 다음 두 번째 열로 문자열을 검색합니다.Bash 변수와 다른 모드전혀)
또는
- 쉽게 만드는 방법을 찾아보세요전체 패턴(문자열)이를 awk의 매개변수로 받습니다.
awk에 bash 변수를 삽입해 보세요 -
로그가 좀 있어요 -
$ cat > log
test1
test2
ahaha
hahah
그래요
$ cat log | awk '$1~/test1|test2/ {print }'
test1
test2
모든 게 괜찮아
bash 변수를 awk에 붙여넣어야 합니다.
$ a=test1
$ b=test2
그런 다음 삽입하려고합니다.
$ cat log | awk 'BEGIN{a;b} $1~/a|b/ {print }'
ahaha
hahah
$ cat log | awk -v a=test1 -v b=test2 '$1~/a|b/ {print }'
ahaha
hahah
모든 패턴을 문자열로 가져오고 이를 awk의 매개변수로 받는 방법 -
$ p='$1~/test1|test2/ {print }'
$ cat log | awk p
# get test1
# get test2
답변1
패턴을 awk에 변수로 전달하고 동적 패턴을 사용하여 명시적으로 비교합니다(즉, 문자열의 패턴과 일치).
awk -v pat="$a|$b" '$1 ~ pat' log
또는
awk -v a="$a" -v b="$b" '$1 ~ a "|" b ' log
참고: 정적 모드 /.../(또는 더티 따옴표/이스케이프만)를 사용할 수 없습니다.
답변2
awk는 내부 변수를 확장하지 않습니다 /.../
.
하지만
$ cat log | awk -v a=test1 -v b=test2 '$1 ~ a || $1 ~ b {print }'
그리고
$ p='$1~/test1|test2/ {print }'
$ cat log | awk "$p"
작동해야 함(테스트되지 않음)