在bash中,如何批量显示文件中某些行的文本?

时间:2014-06-13 02:09:52

标签: bash sed xargs

我想批量显示某些目录中某些文件行的文本,通常可以使用以下命令完成:

    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' < {} \;

但两种方法都不行。 你能提出一些建议或推荐一些参考资料吗? 欢迎所有人,感谢您的建议!

3 个答案:

答案 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

<强>脚注:

  • (1)应用了单词分割,这会破坏带有嵌入空格的路径,但这是一个单独的问题。
  • (2)假设他们没有使整个命令超过最大值。命令行的长度;无论哪种方式,多个文件名都会立即传递。

顺便说一句:使用sed解析命令输出与第一个代码段一样绝不是一个好主意 - 请参阅http://mywiki.wooledge.org/ParsingLshttp://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循环。