如何在输出中同时打印grep匹配行及对应匹配模式
需求说明
在复杂脚本中使用grep结合模式文件匹配文本行时,日志无法显示匹配的具体模式,需要实现匹配行grep -o但无法同时获取两者,不局限于使用grep工具。
示例文件
文本文件 file.txt 内容:
abc$(SEQ)asdasd wwww$(SEQ)asqqqqqq efg hij$(SEQ)asdasdasd$(SEQ)zzzzzz klmn$(SEQ)11111111 op$(SEQ)44444444 qrs$(SEQ)777 tuv$(SEQ)mmmmmmmmm qrs$(SEQ)777444 asdsd777hdhfgjdfasd wxyzfhdfghdfh
模式文件 pattern.txt 内容:
444 777 asd
期望输出(匹配行与模式用TAB分隔):
abc$(SEQ)asdasd asd efg hij$(SEQ)asdasdasd$(SEQ)zzzzzz asd op$(SEQ)44444444 444 qrs$(SEQ)777 777 qrs$(SEQ)777444 777 qrs$(SEQ)777444 444 asdsd777hdhfgjdfasd 777 asdsd777hdhfgjdfasd asd
解决方案
方法1:使用awk实现(推荐)
awk可一次性读取模式文件,遍历文本行匹配每个模式并输出结果:
awk ' BEGIN { FS = "\n"; OFS = "\t" } NR == FNR { patterns[$0]; next } { for (p in patterns) { if ($0 ~ p) { print $0, p } } } ' pattern.txt file.txt
- 逻辑说明:
- 先读取
pattern.txt的所有模式存入数组patterns - 遍历
file.txt每一行,检查是否匹配数组中的每个模式 - 匹配成功则输出「当前行+TAB+对应模式」
- 先读取
方法2:使用bash循环+grep实现
若偏好grep,可通过循环遍历每个模式,匹配后拼接模式输出:
while IFS= read -r pattern; do grep -F "$pattern" file.txt | sed "s/$/\t$pattern/" done < pattern.txt
- 逻辑说明:
- 逐行读取
pattern.txt的每个模式 - 用
grep -F(固定字符串匹配,避免正则冲突)找出匹配行 - 通过
sed在每行末尾添加TAB和当前模式
- 逐行读取
- 注意:若模式包含正则元字符,需用
grep -F关闭正则匹配,或对模式做转义处理
内容的提问来源于stack exchange,提问作者Ramanan T
相关产品推荐
相关产品推荐

