在命令中grep -f input_pat.txt match_in.txt
,我正在寻找一种方法来打印匹配的模式input_pat.txt
而不是最终匹配的字符串matched_in.txt
。
例如,input_pat.txt
包含:
abc...blahblah
并match_in.txt
有:
abcdefblahblah
我想"abc...blahblah"
在输出中打印。
答案1
可以通过调用 grep 两次来完成 - 成本有点高,但可以完成工作 让我们假设您的模式文件是 pat.txt,而您希望搜索的文件是 data.txt。
paste <(grep -o -f pat.txt data.txt ) <(grep -f pat.txt data.txt )
我们使用进程替换<( ... )
,以便paste
将两个命令的两个输出视为文件。在第一个命令中,-o
选项仅打印匹配的模式。在第二个命令中,打印完整的匹配行。
由于顺序是一对一的,因此可以安全地并排粘贴两个输出(假设执行 grep 时模式文件或数据文件没有更改)
答案2
如果切换到扩展正则表达式(如 的那些grep -E
)是可以接受的,您可以使用awk
相反的方法并执行以下操作:
awk '
!end_of_re_list {if (!(re[$0]++)) n++; next}
{
for (i in re)
if ($0 ~ i) {
print i
delete re[i]
if (--n == 0) exit
}
}' input_pat.txt end_of_re_list=1 match_in.txt