Linux 从日志文件中的特定行中筛选出编号

Linux 从日志文件中的特定行中筛选出编号,linux,awk,grep,Linux,Awk,Grep,我有一个带有特定字符串的日志文件 "Received bla bla with count {} 23567" 需要获取行末尾的具体数字。 我们可以使用awk或grep,但不能使用下面的命令来获取此信息 grep "Received bla bla" logfile.log | grep '[0-9]' 由于日志文件开头有时间戳。请尝试以下操作。我在手机上,所以目前无法测试它,但这些应该可以工作 sed -E 's/.*([0-9]+$)/\1/' I

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

"Received bla bla with count {} 23567"
需要获取行末尾的具体数字。 我们可以使用awk或grep,但不能使用下面的命令来获取此信息

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

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

请尝试以下操作。我在手机上,所以目前无法测试它,但这些应该可以工作

sed -E 's/.*([0-9]+$)/\1/' Input_file
如果您想通过搜索该行上的特定文本来打印该行最后一行的数字,请尝试以下操作:

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

你能试试下面的吗。我在手机上,所以目前无法测试它,但这些应该可以工作

sed -E 's/.*([0-9]+$)/\1/' Input_file
如果您想通过搜索该行上的特定文本来打印该行最后一行的数字,请尝试以下操作:

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

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

运算符
~
将右侧的参数作为正则表达式应用于左侧的参数,如果匹配,则返回真值<代码>$0是整个当前输入行。
-v
选项允许您在脚本开始执行之前从Awk外部设置Awk变量的值。

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

运算符
~
将右侧的参数作为正则表达式应用于左侧的参数,如果匹配,则返回真值<代码>$0是整个当前输入行。
-v
选项允许您在脚本开始执行之前从外部Awk设置Awk变量的值。

GNU grep with PCRE匹配:

grep -Po 'Received .* with count .*?\K\d+' file

GNU grep与PCRE匹配:

grep -Po 'Received .* with count .*?\K\d+' file

奇怪..,这是一个问题,Awk的常客有一个
sed
battle,而我是唯一一个有Awk答案的人。@Triplee你已经有了最好的Awk答案,所以我把你的答案给提高了,并发布了一个sed替代方案,因为使用sed来解决这个问题并不完全是不可能的,而且现有的sed答案不会起作用(他们会打印每一行)而且不能移植到所有POSIX sed上。奇怪的是,这是Awk正规军进行
sed
战斗的问题,我是唯一一个有Awk答案的人。@tripleee您已经有了最好的Awk答案,所以我把您的答案选了一个,并发布了一个sed替代方案,因为使用sed进行此操作并非完全不可能,现有的sed答案将无法工作(它们将打印每一行),并且无法移植到所有POSIX sed。