ログファイルから特定の行をgrepし、その出力の特定の部分を変数にキャプチャして他のコマンドに使用したいと思います。
私のgrepコマンドは次のとおりです。ここで $1 は日付です。
grep -a --binary-file=text "pattern" /home/path/archive/logs/path.log-$1
出力例:
/home/path/archive/logs/path.log-2015-04-13.0.gz:2015-05-13 00:43:49,779 INFO [DEUX-DR-SAMPLE-1] c.i.s.p.DeuxProxyPMMProcessor [DEUX : 361] SVRREQ|dataID|server request: (deliver: (pdu: 0 5 0 282190) (addr: 1 1 adress) (addr: 1 1 mssidn) (sm: enc: ASCII msg: id:dataID stat:pattern)
dataID
この出力からフィールドを取得し、他のコマンドで使用できるように変数に保存したいと思います。このような行は何百もありますが、空白の数は行ごとにdataID
異なるため、フィールドを取得する区切り文字として使用することはできません。
答え1
grep
PCREで使用:
$ var='/home/path/archive/logs/path.log-2015-04-13.0.gz:2015-05-13 00:43:49,779 INFO [DEUX-DR-SAMPLE-1] c.i.s.p.DeuxProxyPMMProcessor [DEUX : 361] SVRREQ|dataID|server request: (deliver: (pdu: 0 5 0 282190) (addr: 1 1 adress) (addr: 1 1 mssidn) (sm: enc: ASCII msg: id:dataID stat:pattern)'
$ grep -Po '.*?SVRREQ\|\K[^|]+(?=\|)' <<<"$var"
dataID
変数に保存するには:
$ foobar="$(grep -Po '.*?SVRREQ\|\K[^|]+(?=\|)' <<<"$var")"