다음 코드가 있습니다.
$ awk -F'[]]|[[]' \
'$0 ~ /^\[/ && $2 >= "2014-04-07 23:00" { p=1 }
$0 ~ /^\[/ && $2 >= "2014-04-08 02:00:01" { p=0 }
p { print $0 }' log
여기서는 한 변수에 "2014-04-07"을 할당하고 다른 변수에 "23:00"을 할당하고 싶습니다. $var 또는 이와 유사한 것을 사용하여 해당 값에서 입력을 가져옵니다. 하드코딩된 타임스탬프 대신 변수를 사용할 수 있도록 위 코드를 수정하는 데 도움을 줄 수 있는 사람이 있습니까?
원래 질문에 대한 링크는 다음과 같습니다.두 타임스탬프 사이의 로그를 추출하는 방법.
답변1
-v
다음 옵션을 사용하여 변수를 매개변수로 전달할 수 있습니다 .
awk -F'[]]|[[]' -v var1="2014-04-07 23:00" -v var2="2014-04-08 02:00:01" \
'$0 ~ /^\[/ && $2 >= var1 { p=1 }
$0 ~ /^\[/ && $2 >= var2 { p=0 }
p { print $0 }' log
또는 블록에 변수를 설정할 수 있습니다 BEGIN
.
awk -F'[]]|[[]' \
'BEGIN{var1="2014-04-07 23:00"; var2="2014-04-08 02:00:01"}
$0 ~ /^\[/ && $2 >= var1 { p=1 }
$0 ~ /^\[/ && $2 >= var2 { p=0 }
p { print $0 }' log
답변2
물론 프런트엔드를 통해 파이프로, 백엔드를 통해 파일로, 또는 stdin
리디렉션을 통해 변수를 로드하는 또 다른 방법이 있습니다. 다른 곳에서 무엇을 하고 있는지에 따라 작업을 단순화할 수도 있습니다.awk
게진
cat vars
2014-04-07 23:00[1
2014-04-08 02:00:01[0
cat log
[2014-04-06 23:00] Log line 1
[2014-04-07 23:00] Log line 2
[2014-04-07 23:00:01] Log line 3
[2014-04-08 02:00:01] Log line 4
게츠 서클
awk -F'[]]|[[]' '
FNR==NR{v[NR]=$1; pv[NR]=$2}
FNR!=NR{for (i=1; i<=length(v); i++) if ($2>=v[i]) p=pv[i]}
p && $0~/^\[/{print $0}' vars log
가주트
[2014-04-07 23:00] Log line 2
[2014-04-07 23:00:01] Log line 3
가장 세련된 솔루션은 아닐 수도 있지만 코드를 조작하거나 변수를 추가하지 않고도 배열, 문자열 또는 파일을 작성하여 원하는 만큼 로그 필터링을 켜고 끌 수 있습니다.
원스톱 매장.
답변3
p
여기서는 변수를 분할하거나 사용할 필요가 없습니다 .
awk -v start='2014-04-07 23:00' -v end='2014-04-08 02:00:01' '
'/^\[/ && $0 >= "["start && $0 < "["end' log