如何无需复杂脚本实现递归grep names.txt每行内容并按顺序切换匹配目标
实现方案
方案1:简化版(每个姓名全量遍历目录,无需复杂逻辑)
这种实现最简单,仅需一行shell命令即可完成:
xargs -I {} grep -n "^{}:" /path/to/target/files/*.txt < names.txt
参数说明:
-I {}指定{}为姓名的占位符,xargs会逐行读取names.txt的内容替换占位符grep的-n参数可选,用于输出匹配结果所在的行号,不需要可以去掉^{}:确保只会匹配行开头为对应姓名的条目,避免出现姓名部分匹配的错误结果
方案2:进阶版(从中断位置继续匹配,无冗余扫描)
完全符合你要求的「遇到不匹配就切换下一个姓名、从上次中断位置继续遍历」的需求,仅需一行awk命令即可实现,无需编写复杂脚本:
awk ' NR == FNR { names[++total] = $0 next } FNR == 1 { current_file = FILENAME } { if (cur_idx <= total && index($0, names[cur_idx]":") == 1) { print current_file":"FNR":"$0 } else { cur_idx++ } } ' names.txt $(ls -1 /path/to/target/files/*.txt | sort)
逻辑说明:
- 第一部分先把
names.txt里的所有姓名按顺序存入数组 - 第二部分按字母顺序读取所有目标文件的内容,当前行匹配当前待查找的姓名就输出结果,一旦遇到不匹配的行就自动切换到下一个姓名,继续扫描后续内容,全程不会重复读取已经扫过的文件内容,效率远高于全量遍历方案。
内容的提问来源于stack exchange,提问作者Renox92
相关产品推荐
相关产品推荐

