これが前の質問に関連していると仮定すると、間違った方向に進んでいます。たいていの場合に実行したいスクリプトの断片をつなぎ合わせるのではなく、少しだけ違うことをする必要があるたびに完全に異なるスクリプトを取得する必要があるのではなく、自分の構文を解析できる1つのスクリプトを作成するだけです。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