如何根据另一个字符串的索引获取子字符串

如何根据另一个字符串的索引获取子字符串

我需要从一些日志文件中提取整数值。整数值总是出现在子字符串之后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脚本将原封不动地打印任何与正则表达式不匹配的行。如果这不是您想要的,请使用seds-n选项和p命令仅打印匹配的行,例如:

sed -n -r -e 's/.*return code ([0-9]+).*/\1/p' logfile.txt 

相关内容