如何使用awk处理多字符分隔符提取日志内容?
问题描述
我有如下格式的日志文件:
Insert request received from system 1 Modify request received from system 2
我想要提取日志中“received from”之后的文本。若cut命令支持多字符分隔符,等效的grep和cut命令为:
grep "received from" mylogfile.log | cut -d"received from" -f2
(注:原命令中的-f1应为-f2,因为分隔后第二部分才是“received from”之后的内容)
请问如何用awk实现该功能?
AWK实现方案
以下几种方式都可以实现需求:
方式1:利用split函数分割字符串
/received from/ { split($0, parts, "received from") print parts[2] }
工作逻辑:先筛选出包含“received from”的行,再用split将整行按指定分隔符拆分为数组parts,数组的第二个元素即为分隔符之后的目标文本,直接打印即可。
方式2:正则替换前置内容
/received from/ { sub(/.*received from/, "") print $0 }
工作逻辑:匹配目标行后,使用sub函数把从行开头到“received from”的所有内容替换为空,剩余的整行就是需要提取的文本。
方式3:自定义字段分隔符(FS)
BEGIN { FS = "received from" } /received from/ { print $2 }
工作逻辑:在BEGIN块中把AWK的字段分隔符FS设置为“received from”,这样每行会被拆分为两个字段,第二个字段$2就是我们要的内容,筛选目标行后打印该字段即可。
内容的提问来源于stack exchange,提问作者CS1999
相关产品推荐
相关产品推荐

