我需要从一些日志文件中提取整数值。整数值总是出现在子字符串之后return code
。但在此子字符串之后可能有也可能没有其他内容。下面是两个示例条目:
Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds
Job with id 0 COMPLETED with return code 255
因此,我希望第一种情况为 16,第二种情况为 255。
我最初的方法是使用 awk - 但所需值出现的列不一致;所以它失败了。
我如何以可靠的方式实现这一目标?
答案1
使用参数扩展:
#! /bin/bash
strings=('Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds'
'Job with id 0 COMPLETED with return code 255'
)
for string in "${strings[@]}" ; do
code=${string#*return code }
code=${code%%[!0-9]*}
echo $code
done
#
从左侧、%
右侧删除图案。
答案2
使用 perl 使用正则表达式的解决方案可能是:
perl -ne 'print "$2\n" if m/(code )(\d*)/' a.txt
这会将数字16
和打印255
到标准输出,每个数字都在单独的行 ( \n
) 上。这里a.txt
包含两行
Job with id 0 ended with status COMPLETED, return code 16, in 1 minute 12 seconds
Job with id 0 COMPLETED with return code 255
答案3
这是一个sed
版本:
sed -e 's/.*return code \([0-9]\+\).*/\1/' logfile.txt
它会删除该行中除紧随其后的数字之外的所有内容return code
。
或者,使用 GNU sed 的扩展正则表达式:
sed -r -e 's/.*return code ([0-9]+).*/\1/' logfile.txt
注意:某些版本sed
使用-E
而不是-r
启用扩展正则表达式。
另请注意,这些sed
脚本将原封不动地打印任何与正则表达式不匹配的行。如果这不是您想要的,请使用sed
s-n
选项和p
命令仅打印匹配的行,例如:
sed -n -r -e 's/.*return code ([0-9]+).*/\1/p' logfile.txt