他の文字列のインデックスに基づいて部分文字列を取得する方法

他の文字列のインデックスに基づいて部分文字列を取得する方法

一部のログファイルから整数値を抽出する必要があります。整数値は常に部分文字列の後に表示されます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.txt2行が含まれています。

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スクリプトは、正規表現と一致しないすべての行を変更せずに印刷します。これが望ましくない場合は、seds-nオプションとpコマンドを使用して一致する行だけを印刷します。例:

sed -n -r -e 's/.*return code ([0-9]+).*/\1/p' logfile.txt 

関連情報