如何在grep中显示搜索词?用grep/sed/awk实现批量搜索生成文件
使用grep/sed/awk实现按搜索词匹配并生成结果文件
当然可以!这几个工具都能搞定你的需求,我给你几个实用的方案,完全对应你给的示例场景,上手就能用~
最推荐:用awk高效实现
awk处理这种跨文件匹配、关联输出的场景特别顺手,而且效率极高,大文件也能快速处理。
匹配到的词输出对应行(和你的示例一致)
awk 'NR==FNR {terms[$0]; next} {for (t in terms) if ($0 ~ "^" t ",") print t, $0}' file2 file1 > file3
命令解释:
NR==FNR:当awk读取第一个文件(也就是file2)时,把每一行的搜索词存到terms数组里next:跳过后面的逻辑,继续读file2的下一行,避免处理file2的时候跑到后面的逻辑里- 处理file1时,遍历
terms里的每个搜索词,用^" t ","精确匹配行首是搜索词加逗号的行(这样能保证只匹配第一列的内容,不会误匹配其他位置的相同词) - 匹配成功就输出「搜索词 + 对应行」,最后把结果重定向到file3
如果要包含未匹配的词(比如示例里的D)
要是你希望没找到匹配的搜索词也能在file3里显示(比如标注“未找到”),可以用这个修改版:
awk 'NR==FNR {terms[$0]; next} {for (t in terms) if ($0 ~ "^" t ",") {print t, $0; delete terms[t]}} END {for (t in terms) print t, "Not Found"}' file2 file1 > file3
这个命令会在处理完file1后,把剩下没匹配到的搜索词都输出出来,后面跟“Not Found”。
用Shell循环+grep实现(直观易懂)
如果你觉得awk的逻辑有点绕,这个用shell循环加grep的方式更直观,新手也能轻松理解:
while read term; do # 精确匹配file1中以搜索词开头的行 match=$(grep -F "^$term," file1) # 如果找到匹配内容,就输出 if [ -n "$match" ]; then echo "$term $match" fi done < file2 > file3
命令解释:
- 逐行读取file2里的每个搜索词
- 用
grep -F做精确匹配(避免把搜索词当成正则表达式解析),找file1里行首是「搜索词+逗号」的行 - 如果找到匹配,就把搜索词和匹配行一起输出,结果写入file3
用Shell循环+sed实现
sed也能完成这个需求,同样结合shell循环来处理每个搜索词:
while read term; do # 匹配行首是搜索词的行,在行首加上搜索词和空格后打印 sed -n "/^$term,/s/^/$term /p" file1 done < file2 > file3
命令解释:
sed -n:只输出我们指定的行/^$term,/:匹配行首是「搜索词+逗号」的行s/^/$term /p:在匹配行的开头加上搜索词和空格,然后打印该行- 所有结果输出到file3
内容的提问来源于stack exchange,提问作者stuart kim
相关产品推荐
相关产品推荐

