이것이 이전 질문 과 관련이 있다고 가정하면 잘못된 길을 가고 있습니다. 대부분의 시간 동안 원하는 것을 수행하고 아주 조금 다른 것을해야 할 때마다 완전히 다른 스크립트를 가져와야하는 약간의 스크립트를 모 으려고 시도하는 대신 구문 분석 할 수있는 하나의 스크립트를 작성하십시오. 입력 파일을 배열 ( f[]
아래)에 입력 하여 필드 이름 (태그)을 해당 값에 매핑 한 다음 결과에서 원하는 모든 작업을 수행 할 수 있습니다 (예 : 이전 질문의 입력 파일).
$ cat file
Feb 3 0:18:51 17.1.1.1 id=firewall sn=qasasdasd "time=""2018-02-03" 22:47:55 "UTC""" fw=111.111.111.111 pri=6 c=2644 m=88 "msg=""Connection" "Opened""" app=2 n=2437 src=12.1.1.11:49894:X0 dst=4.2.2.2:53:X1 dstMac=42:16:1b:af:8e:e1 proto=udp/dns sent=83 "rule=""5" "(LAN->WAN)"""
이름 / 태그로 색인 된 값의 배열을 만드는 awk 스크립트를 작성할 수 있습니다.
$ cat tst.awk
{
f["hdDate"] = $1 " " $2
f["hdTime"] = $3
f["hdIp"] = $4
sub(/^([^[:space:]]+[[:space:]]+){4}/,"")
while ( match($0,/[^[:space:]]+="?/) ) {
if ( tag != "" ) {
val = substr($0,1,RSTART-1)
gsub(/^[[:space:]]+|("")?[[:space:]]*$/,"",val)
f[tag] = val
}
tag = substr($0,RSTART,RLENGTH-1)
gsub(/^"|="?$/,"",tag)
$0 = substr($0,RSTART+RLENGTH)
}
val = $0
gsub(/^[[:space:]]+|("")?[[:space:]]*$/,"",val)
f[tag] = val
}
그리고 -e
파일에서 스크립트를 명령 줄 스크립트와 쉽게 믹싱 하기 위해 GNU awk를 사용하는 등 필드 이름으로 데이터를 참조하여 원하는대로 무엇이든 할 수 있습니다 .
$ awk -f tst.awk -e '{for (tag in f) printf "f[%s]=%s\n", tag, f[tag]}' file
f[fw]=111.111.111.111
f[dst]=4.2.2.2:53:X1
f[sn]=qasasdasd
f[hdTime]=0:18:51
f[sent]=83
f[m]=88
f[hdDate]=Feb 3
f[n]=2437
f[app]=2
f[hdIp]=17.1.1.1
f[src]=12.1.1.11:49894:X0
f[c]=2644
f[dstMac]=42:16:1b:af:8e:e1
f[msg]="Connection" "Opened"
f[rule]="5" "(LAN->WAN)"
f[proto]=udp/dns
f[id]=firewall
f[time]="2018-02-03" 22:47:55 "UTC"
f[pri]=6
$ awk -f tst.awk -e '{print f["proto"]}' file
udp/dns
$ awk -f tst.awk -e 'f["proto"] ~ /udp/ {print f["sent"], f["src"]}' file
83 12.1.1.11:49894:X0