从日志文件中的特定行中过滤出编号

问题描述

我有一个带有特定字符串的日志文件

"Received bla bla with count {} 23567"

需要获取位于行末的特定编号。 我们可以使用awk或grep,但无法使用以下命令来获取它。

grep "Received bla bla" logfile.log | grep '[0-9]'

由于日志文件的开头带有时间戳。

解决方法

Awk使您可以轻松地抓取一行中的最后一个元素。

awk '/Received bla bla/ { print $NF }' logfile.log

变量NF包含当前行上的字段数(默认情况下,用空格分隔),并且在前面加一个美元符号表示具有该索引的字段,即最后一个字段。 (很方便,但对于Unix工具来说有点不寻常,Awk索引从1开始,而不是0。)

如果正则表达式需要来自变量,请尝试

awk -v regex='Received bla bla' '$0 ~ regex { print $NF }' logfile.log

运算符~将右边的参数作为正则表达式应用到左边的参数,如果匹配则返回true值。 $0是整个当前输入行。通过-v选项,您可以在脚本开始执行之前从Awk外部设置Awk变量的值。

,

具有PCRE匹配的GNU grep:

grep -Po 'Received .* with count .*?\K\d+' file
,
sed -n 's/Received bla bla.* //p'
,

能否请您尝试以下。我在移动设备上,因此目前无法对其进行测试,这些应该可以,但是。

sed -E 's/.*([0-9]+$)/\1/' Input_file

如果您要通过搜索该行的特定文本来打印行末的数字,请尝试执行以下操作:

sed -E '/text to search/s/.*([0-9]+$)/\1/' Input_file