我想批量显示某些目录中某些文件行的文本,通常可以使用以下命令完成:
for file in `find ./ -name "results.txt"`;
do
sed -n '12p' < ${file};
done
在每个文件名的第12行“results.txt”中,有我要输出的文字。
但是,我想知道如果我们可以使用管道命令来执行此操作。我尝试了以下命令:
find ./ -name "results.txt" | xargs sed -n '12p'
或
find ./ -name "results.txt" | xargs sed -n '12p' < {} \;
但两种方法都不行。 你能提出一些建议或推荐一些参考资料吗? 欢迎所有人,感谢您的建议!
答案 0 :(得分:3)
这应该这样做
find ./ -name results.txt -exec sed '12!d' {} ';'
答案 1 :(得分:3)
@Steven Penny's answer是最优雅,性能最佳的解决方案,但要明确为什么您的解决方案无效:
find ./ -name "results.txt" | xargs sed -n '12p'
将所有文件名(1)立即传递给 (2)到{{1} }。由于sed
累计计算行,跨输入文件,仅 1 行将为所有输入文件打印,即第一个输入文件中的第12行。
请注意,sed
find
操作是最佳解决方案,如果您仍希望使用-exec
解决此问题,则必须使用xargs
的{{1}}选项,如下所示,以确保每个输入行(文件名) < / strong>(xarg
是一个自选的占位符):
-I
<强>脚注:强>
顺便说一句:使用sed
解析命令输出与第一个代码段一样绝不是一个好主意 - 请参阅http://mywiki.wooledge.org/ParsingLs和http://mywiki.wooledge.org/BashFAQ/001
答案 2 :(得分:2)
使用xargs
会导致运行sed
多个文件参数。但正如您所看到的,sed
在开始阅读新文件时不会将记录号重置为1。例如,尝试对每个超过12行的文件运行以下命令。
sed -n '12p' x.txt y.txt
如果您想使用xargs,可以考虑使用awk:
find . -name 'results.txt' | xargs awk 'FNR==12'
P.S:我个人喜欢使用for
循环。