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
我会按照以下方式使用 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
之前打印值。
第二种解决方案:这里使用awk
的match
函数。
awk 'match([=11=],/error=[^[:space:]]+/){print substr([=11=],RSTART+6,RLENGTH-6)}' Input_file
我需要从日志文件中提取变量“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
我会按照以下方式使用 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
之前打印值。
第二种解决方案:这里使用awk
的match
函数。
awk 'match([=11=],/error=[^[:space:]]+/){print substr([=11=],RSTART+6,RLENGTH-6)}' Input_file