一部のログファイルから整数値を抽出する必要があります。整数値は常に部分文字列の後に表示されますreturn code
。ただし、この部分文字列の後には他に何かがあるかもしれません。以下は 2 つの例です。
Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds
Job with id 0 COMPLETED with return code 255
したがって、最初のケースでは16が必要で、2番目のケースでは255が必要です。
私の最初のアプローチはawkを使用することでしたが、必要な値が表示される列が一致しなかったため失敗しました。
これをどのように信頼できる方法で達成できますか?
答え1
パラメータ拡張の使用:
#! /bin/bash
strings=('Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds'
'Job with id 0 COMPLETED with return code 255'
)
for string in "${strings[@]}" ; do
code=${string#*return code }
code=${code%%[!0-9]*}
echo $code
done
#
左右の%
パターンを削除してください。
答え2
Perlを使用した正規表現を使用するソリューションは次のとおりです。
perl -ne 'print "$2\n" if m/(code )(\d*)/' a.txt
これは数字の合計を標準出力として16
印刷し255
、各数字は別々の行(\n
)に表示されます。これにはa.txt
2行が含まれています。
Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds
Job with id 0 COMPLETED with return code 255
答え3
バージョンは次のとおりですsed
。
sed -e 's/.*return code \([0-9]\+\).*/\1/' logfile.txt
すぐに次の番号を除いて、その行のすべての項目を削除しますreturn code
。
または、GNU sedの拡張正規表現を使用してください。
sed -r -e 's/.*return code ([0-9]+).*/\1/' logfile.txt
注:一部のバージョンでは、拡張正規表現を有効にする代わりにsed
使用します。-E
-r
また、このsed
スクリプトは、正規表現と一致しないすべての行を変更せずに印刷します。これが望ましくない場合は、sed
s-n
オプションとp
コマンドを使用して一致する行だけを印刷します。例:
sed -n -r -e 's/.*return code ([0-9]+).*/\1/p' logfile.txt