ファイル内の数字を把握してカットして合計する方法

ファイル内の数字を把握してカットして合計する方法

ログファイルがあります。特定の数字を持つ各行について、この行の最後の数字の合計を計算したいと思います。 grepとcutを使用すると問題はありませんが、数値の合計を計算する方法がわかりません。 StackExchangeでいくつかの解決策を試しましたが、私の場合はうまくいきませんでした。

これが私が今まで持っているものです:

grep "30201" logfile.txt | cut -f6 -d "|"

30201これは私が探している行です。

最後の数字650、1389、945を追加したいです。

ログファイル.txt

Jan 09 2016|09:15:17|30201|1|SL02|650
Jan 09 2016|09:15:18|43097|1|SL01|945
Jan 09 2016|09:15:19|28774|2|SB03|1389
Jan 09 2016|09:16:21|00788|1|SL02|650
Jan 09 2016|09:17:25|03361|3|SL01|945
Jan 09 2016|09:17:33|08385|1|SL02|650
Jan 09 2016|09:18:43|10234|1|SL01|945
Jan 09 2016|09:21:55|00788|1|SL02|650
Jan 09 2016|09:24:43|03361|3|SB03|1389
Jan 09 2016|09:26:01|30201|1|SB03|1389
Jan 09 2016|09:26:21|28774|2|SL02|650
Jan 09 2016|09:26:25|00788|1|SL02|650
Jan 09 2016|09:27:21|28774|2|SL02|650
Jan 09 2016|09:29:32|30201|1|SL01|945
Jan 09 2016|09:30:12|34032|1|SB03|1389
Jan 09 2016|09:30:15|08767|3|SL02|650

ベストアンサー1

追加に適した形式でpaste数値をシリアル化するのに役立つように依頼できます。bc

% grep "30201" logfile.txt | cut -f6 -d "|"
650
1389
945

% grep "30201" logfile.txt | cut -f6 -d "|" | paste -sd+
650+1389+945

% grep "30201" logfile.txt | cut -f6 -d "|" | paste -sd+ | bc
2984

PCREがある場合は、積極的なリバースのみを使用してこれを実行grepできます。grep

% grep -Po '\|30201\|.*\|\K\d+' logfile.txt | cut -f6 -d "|" | paste -sd+ | bc
2984

単独で使用awk:

% awk -F'|' '$3 == 30201 {sum+=$NF}; END{print sum}' logfile.txt        
2984
  • -F'|'フィールド区切り記号を次のように設定します。|
  • $3 == 30201 {sum+=$NF}3番目のフィールドが次の場合は、最後のフィールドの値を追加します。30201
  • END{print sum}sum印刷END

おすすめ記事