【问题标题】:In bash, how to batch show the text of certain line in files?在 bash 中,如何批量显示文件中某行的文本?
【发布时间】:2014-06-14 01:07:58
【问题描述】:

我想批量显示某个目录下某行文件的文本,通常可以通过以下命令来完成:

    for file in `find ./ -name "results.txt"`; 
    do
        sed -n '12p' < ${file}; 
    done

在每个文件名“results.txt”的第12行,有我要输出的文字。

但是,我想知道我们是否可以使用管道命令来执行此操作。我尝试了以下命令:

    find ./ -name "results.txt" | xargs sed -n '12p'

    find ./ -name "results.txt" | xargs sed -n '12p' < {} \;

但两者都不能正常工作。 请您给一些建议或推荐一些参考资料,好吗? 欢迎大家多多指教!

【问题讨论】:

    标签: bash sed xargs


    【解决方案1】:

    应该这样做

    find ./ -name results.txt -exec sed '12!d' {} ';'
    

    【讨论】:

    • +1,但出于性能原因,sed '12q;d' 更可取(打印感兴趣的行后立即退出)。
    • @mklement0,非常感谢您对提高性能的建议!
    【解决方案2】:

    @Steven Penny's answer最优雅和性能最佳的解决方案,但要阐明为什么您的解决方案不起作用

    find ./ -name "results.txt" | xargs sed -n '12p'
    

    导致所有个文件名(1)立即(2)传递给sed。由于sed对输入文件的行数进行累积所有个输入文件只会打印1 ,即 first 输入文件的第 12 行。

    请记住,find-exec 操作是最佳解决方案,如果您仍想使用 xargs 解决此问题,则必须使用 xarg 的 @987654331 @ 选项如下,以确保sed 每输入行(文件名)调用一次% 是自选占位符):

    find ./ -name "results.txt" | xargs -I % sed -n '12q;d' %
    

    脚注:

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

    顺便说一句:在你的第一个 sn-p 中使用 for 解析命令输出绝不是一个好主意 - 请参阅 http://mywiki.wooledge.org/ParsingLshttp://mywiki.wooledge.org/BashFAQ/001

    【讨论】:

    • 这个答案对我帮助很大!非常感谢您提供如此详细的解释以获得更好的答案!
    • @Nicolas:我很高兴听到这个消息;我的荣幸。
    【解决方案3】:

    您使用 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 循环。

    【讨论】:

    • awk 的想法很聪明,但要使其适用于带有嵌入空格的路径,您必须使用 find . -name 'results.txt' -print0 | xargs -0 awk 'FNR==12'。相比之下,使用 for 解析文件或命令输出的行绝不是一个好主意 - 请参阅 mywiki.wooledge.org/ParsingLsmywiki.wooledge.org/BashFAQ/001
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 2014-01-19
    • 1970-01-01
    • 2018-12-28
    相关资源
    最近更新 更多