如何从文件中提取和剪切数字并将它们相加

Yun*_*lar 4 grep logs text-processing cut numeric-data

我有一个日志文件。对于具有特定数字的每一行,我想对这些行的最后一个数字求和。grep 和 cut 没问题,但我不知道如何对数字求和。我尝试了 StackExchange 的一些解决方案,但没有让它们在我的情况下工作。

这是我到目前为止:

grep "30201" logfile.txt | cut -f6 -d "|"
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

hee*_*ayl 11

您可以帮助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
Run Code Online (Sandbox Code Playgroud)

如果你有grepPCRE,你可以grep单独使用正向后视:

% grep -Po '\|30201\|.*\|\K\d+' logfile.txt | cut -f6 -d "|" | paste -sd+ | bc
2984
Run Code Online (Sandbox Code Playgroud)

随着awk独自:

% awk -F'|' '$3 == 30201 {sum+=$NF}; END{print sum}' logfile.txt        
2984
Run Code Online (Sandbox Code Playgroud)
  • -F'|' 将字段分隔符设置为 |
  • $3 == 30201 {sum+=$NF} 如果第三个字段是,则将最后一个字段的值相加 30201
  • END{print sum}打印sumEND

  • 请注意,`grep` 解决方案并不关心在哪一列中找到该数字,或者该数字是否只是更长数字的子字符串。`awk` 解决方案在这方面更安全。`grep` 解决方案可以通过 _first_ 切割和匹配行开头的数字(后跟 `|`)来改进,并使用适当的锚定。 (2认同)