grep/sed/awk を使用した文字列の一部の抽出

grep/sed/awk を使用した文字列の一部の抽出

次の内容を含むテキストファイルがあります。

duration:       17100
series:         2016
episode:        58
modesizes:      original: hd1=9120MB,hd2=7543MB,sd1=4872MB,high1=2833MB,low1=634MB
runtime:        285


duration:       13740
series:         2016
episode:        59
modesizes:      original: hd1=9024MB,hd2=7203MB,sd1=5104MB,high1=2950MB,low1=570MB
runtime:        229

durationepisodeおよびを抽出したいmodesizes。出力は次のようになります。

13740,59,9024MB,7203MB,5104MB,2950MB,570MB

答え1

そしてawk

awk '/duration|episode/{printf "%s,", $2} /modesizes/{gsub(/[^=,]+=/,"",$3); print $3}' file

説明する:

  • /duration|episode/行が一致した場合、durationまたはepisode
    • printf "%s,", $2次に、値でフィールドを印刷します。
  • /modesizes/行が一致した場合modesizes
    • gsub(/[^=,]+=/,"",$3)次に、識別子と等号を削除します。
    • print $3変更されたフィールドを印刷します。

入力例を使用すると、以下が印刷されます。

17100,58,9120MB,7543MB,4872MB,2833MB,634MB
13740,59,9024MB,7203MB,5104MB,2950MB,570MB

答え2

grep正規表現がある場合pcre

$ grep -oP '(duration|episode):\s*\K\d+|\d+MB' ip.txt | pr -ats, -7
17100,58,9120MB,7543MB,4872MB,2833MB,634MB
13740,59,9024MB,7203MB,5104MB,2950MB,570MB
  • (duration|episode):\s*\KForward Lookback Checkdurationまたはepisode後ろに:0 個以上の空白が続きます。これは出力の一部ではありません。
  • \d+1つ以上の数字
  • |\d+MB代替パターン、次に終わる1つ以上の数MB

pr次に、,区切り文字と最大列を使用して取得した7出力スタイルを指定します。

答え3

sedソリューション:

sed -E -e \
    '/duration:/{
    N;N;N;N
    s/duration:\s*([0-9]*).*episode:\s*([0-9]*).*hd1=([0-9]*MB),hd2=([0-9]*MB),sd1=([0-9]*MB),high1=([0-9]*MB),low1=([0-9]*MB).*/\1,\2,\3,\4,\5,\6/
}' < input_file

次のように出力されます。

17100,58,9120MB,7543MB,4872MB,2833MB


13740,59,9024MB,7203MB,5104MB,2950MB

空行を維持します。

これを望まない場合:

sed -E -n -e \
   '/duration:/{
    N;N;N;N
    s/duration:\s*([0-9]*).*episode:\s*([0-9]*).*hd1=([0-9]*MB),hd2=([0-9]*MB),sd1=([0-9]*MB),high1=([0-9]*MB),low1=([0-9]*MB).*/\1,\2,\3,\4,\5,\6/
    p
    d
}' < input_file

関連情報