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} 如果第三个字段是,则将最后一个字段的值相加 30201END{print sum}打印sum在END