awk의 범위 패턴에 변수 전달

awk의 범위 패턴에 변수 전달

awk에서 범위 모드를 사용하려고 합니다.

grep -a volume somefile | awk '/^Apr 25 23:44:04*/,/^Apr 26 12:44:01*/ {print}'

이것은 잘 작동하지만 날짜와 시간을 변수에 넣고 다음을 실행하여 실행하려고 하면 다음과 같습니다.

time1="Apr 25 23:44:04"
time2="Apr 26 12:44:01"
grep -a volume somefile | awk '/^"$time1"*/,/^"$time2"*/ {print}'

답변1

쉘 변수는 작은따옴표로 묶인 문자열 안에 있으므로 확장되지 않습니다. 작은따옴표로 묶인 문자열 안에 큰따옴표가 포함되어 있는지 여부는 중요하지 않으며 여전히 작은따옴표로 묶인 문자열입니다.

대신 사용하세요:

grep -a volume somefile | awk "/^$time1/,/^$time2/ {print}"

사실 print그렇기 때문에기본작업은 다음과 같이 단순화될 수 있습니다.

grep -a volume somefile | awk "/^$time1/,/^$time2/"

이 접근 방식은 정말 조심해야 합니다. 의도하지 time1않은 time2awk 활성 문자가 포함되지 않았는지 확인해야 합니다 .

더 안전한 접근 방식은 쉘 변수를 awk 변수로 전송하는 것입니다.

grep -a volume somefile | awk -v t1="$time1" -v t2="$time2" '($0~"^"t1),($0~"^"t2)'

Gilles가 주석에서 지적했듯이 이 보다 안전한 접근 방식을 사용하더라도 여전히 주의해야 합니다. 및 의 문자열 time1에 문자가 포함되어 있으면 해당 문자열은 정규식으로 해석됩니다. 질문에 표시된 문자열(정규식 활성 문자가 포함되어 있지 않음)에서는 문제가 되지 않지만, 다른 문자열에서 놀라운 결과가 나타나면 이것이 원인일 수 있습니다.time2^*+.?\[|{$

관련 정보