出力フィールドのデータ文字列を変数に入れます。

出力フィールドのデータ文字列を変数に入れます。

ログファイルから特定の行を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

grepPCREで使用:

$ 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")"

おすすめ記事