【问题标题】:head and grep simultaneouslyhead 和 grep 同时
【发布时间】:2013-11-12 18:03:50
【问题描述】:

有没有 unix one 班轮可以做到这一点?

head -n 3 test.txt > out_dir/test.head.txt
grep hello test.txt > out_dir/test.tmp.txt
cat out_dir/test.head.txt out_dir/test.tmp.txt > out_dir/test.hello.txt
rm out_dir/test.head.txt out_dir/test.tmp.txt

即,我想同时从给定文件中获取标题和一些 grep 行。

【问题讨论】:

  • 使用您的命令序列,如果前三行之一包含hello,则它是重复的。我想这是一个错误?否则,建议的解决方案在这方面是不等价的。
  • @user2719058 很好,你说得对,前 3 行不包含 grep 字符。

标签: bash unix grep unix-head


【解决方案1】:

使用 awk:

awk 'NR<=3 || /hello/' test.txt > out_dir/test.hello.txt

【讨论】:

  • 每当你发现自己在做多个 head to grep to sed to grep to tail to cut 类型的东西时,你应该总是想awk。 awk 对于基本的文件操作并不难学,并且可以沉着地处理多项任务。
  • @DavidW.: 非常好,awk 可以在大多数情况下在单个命令中替换所有这些多管道命令。
【解决方案2】:

你可以说:

{ head -n 3 test.txt ; grep hello test.txt ; } > out_dir/test.hello.txt

【讨论】:

    【解决方案3】:

    尝试使用sed

    sed -n '1,3p; /hello/p' test.txt > out_dir/test.hello.txt
    

    【讨论】:

    • 如果hello出现在前三行怎么办?您将把标题行加倍。
    • @DavidW。啊哈!好点子。我看到你已经提供了解决方案。 devnull 的解决方案也会在这种情况下折腾
    【解决方案4】:

    awk 解决方案是最好的,但为了完整起见,我将添加一个 sed 解决方案:

    $ sed -n test.txt -e '1,3p' -e '4,$s/hello/hello/p' test.txt > $output_file
    

    -n 表示除非指定,否则不要打印一行。 -e 是命令 '1,3p 打印前三行 4,$s/hello/hello/p 查找包含单词 hello 的所有行,并将 hello 替换回来。最后的 p 打印出所有行替换操作。

    应该有一种使用4,$g/HELLO/p 的方法,但我无法让它工作。已经很久没有真正弄乱 sed 了。

    【讨论】:

    • 您正在使用不可移植的sed 选项并从原始文件中删除不符合要求的行。
    • @jlliagre -i 是一个标准的 Unix 映射,但还没有进入 Linux 上的 GNU 实用程序。我对此感到惊讶,因为 GNU 通常在选项中领先。 -e 在 GNU 和 Unix 平台以及 -n 上。您可以删除-i 并将其传送到另一个文件,这将删除不兼容问题awk 解决方案更好,但这是为了完整性。我会修改我的答案。
    • sed 可移植选项只有-n-e-f-i 是 Gnuism,不知道你为什么写反了。
    • 它也在 sed 的 BSD 版本中。这包括 OS X。应该是 GNU 版本的手册页的 man.cx 没有显示 -i 选项。但是,linux.man.de 可以。我无法访问 Solaris,并且 SunOS/Solaris 网页的 最新 版本是 1998 年的。无论如何,我已经从我的答案中删除了 -i
    • (旧版)BSD sed没有-i。此选项由 Paolo Bonzini 在 2001 年 9 月 25 日首次在 GNU sed 源代码中引入。它后来被其他实现采用,但根据 2013 年的手册网页,它仍然不在最新的 Solaris 中:docs.oracle.com/cd/E26502_01/html/E29030/sed-1.html#scrolltoc
    【解决方案5】:

    当然,我会去awk,但这里是edvi 怀旧的解决方案:

    ed test.txt <<%
    4,$ v/hello/d
    w test.hello.txt
    %
    

    【讨论】:

    • 请在您的帖子中提及ed 是标准编辑器。 ;).
    • @gniourf_gniourf 不用说了,大家都知道;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    相关资源
    最近更新 更多