Bash: 从字符串中提取变量值

Bash: Extract variable value from string

我需要从日志文件中提取变量“error”的值。这是示例行:

WARN (Periodic Recovery) IJ000906: error=15 check server.log

我需要捕获“错误”的值。查看类似的答案,我想出了:

echo "WARN (Periodic Recovery) IJ000906: error=15 check server.log" |  grep -P '\d+ (error=?)' -o

然而它不产生任何价值。你能为这个案例推荐一个可行的解决方案吗?

您可以使用这个 grep:

s='WARN (Periodic Recovery) IJ000906: error=15 check server.log'
grep -oP '\berror=\K\d+' <<< "$s"

15

正则表达式详细信息:

  • \b:匹配词边界
  • error=:匹配error=文本
  • \K: 重置匹配信息
  • \d+:匹配1+位数字并打印

使用sed

$ echo "WARN (Periodic Recovery) IJ000906: error=15 check server.log" | sed 's/.*error=\([^ ]*\).*//'
15

对于与 perl 兼容的正则表达式,您正在寻找“lookbehind”断言。

要查找以字符串“error=”开头的数字,您需要:

echo "$line" | grep -o -P '(?<=error=)\d+'    # => 15

the pcresyntax(3) man page

我会按照以下方式使用 GNU AWK,令 file.txt 内容为

WARN (Periodic Recovery) IJ000906: error=15 check server.log

然后

awk 'BEGIN{FPAT="error=[0-9]+"}{print substr(,7)}' file.txt

输出

15

说明:我通知 GNU AWK 该列是 error= 后跟使用字段模式 (FPAT) 的 1 个或多个数字,对于每一行从第 7 个字符开始打印第一个字段,使用 substr 字符串函数。 7 因为 error= 有 6 个字符。注意:此解决方案将为每行打印第一次出现的 error= 值。

(在 gawk 4.2.1 中测试)

bash >= 3.0.

v='WARN (Periodic Recovery) IJ000906: error=15 check server.log'

[[ $v =~ error=([0-9]+) ]] && echo "${BASH_REMATCH[1]}"

输出:

15

第一个解决方案:使用您显示的示例,请尝试遵循 awk 代码。

awk -F'error=| check' '{print }' Input_file

解释: 简单的解释就是,将所有字段分隔符设置为 error= check线。然后打印行的第二个字段,它将根据显示的示例在 error= 之后和 check 之前打印值。



第二种解决方案:这里使用awkmatch函数。

awk 'match([=11=],/error=[^[:space:]]+/){print substr([=11=],RSTART+6,RLENGTH-6)}' Input_file