![awk의 범위 패턴에 변수 전달](https://linux55.com/image/64219/awk%EC%9D%98%20%EB%B2%94%EC%9C%84%20%ED%8C%A8%ED%84%B4%EC%97%90%20%EB%B3%80%EC%88%98%20%EC%A0%84%EB%8B%AC.png)
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
않은 time2
awk 활성 문자가 포함되지 않았는지 확인해야 합니다 .
더 안전한 접근 방식은 쉘 변수를 awk 변수로 전송하는 것입니다.
grep -a volume somefile | awk -v t1="$time1" -v t2="$time2" '($0~"^"t1),($0~"^"t2)'
Gilles가 주석에서 지적했듯이 이 보다 안전한 접근 방식을 사용하더라도 여전히 주의해야 합니다. 및 의 문자열 time1
에 문자가 포함되어 있으면 해당 문자열은 정규식으로 해석됩니다. 질문에 표시된 문자열(정규식 활성 문자가 포함되어 있지 않음)에서는 문제가 되지 않지만, 다른 문자열에서 놀라운 결과가 나타나면 이것이 원인일 수 있습니다.time2
^*+.?\[|{$