Text-Processing

如何從文件中提取和剪切數字並將它們求和

  • April 13, 2019

我有一個日誌文件。對於具有特定數字的每一行,我想總結這些行的最後一個數字。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

您可以幫助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

如果你有grepPCRE,你可以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}如果第三個欄位是,則將最後一個欄位的值相加30201
  • END{print sum}列印sumEND

引用自:https://unix.stackexchange.com/questions/512250