awk에서 변수에 값을 할당하는 방법

awk에서 변수에 값을 할당하는 방법

다음 코드가 있습니다.

$ 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

관련 정보