【问题标题】:Piping into a command管道输入命令
【发布时间】:2018-08-20 00:46:23
【问题描述】:

有没有办法通过管道输入命令?

例如:

在一个文件夹中,我有 2 个文件:

  1. 文件名
  2. 文件1

文件名包含:

file1

file1 包含:

11
22
33
44
11

当我运行命令时(在包含文件名和文件 1 的同一文件夹中):

ls -l | grep 11

或者命令:

cat filesname | grep 11

它不会返回:

11
11

【问题讨论】:

    标签: linux bash pipe


    【解决方案1】:

    您的grep 11 命令将过滤您传递给它的所有行,并仅显示包含11 的行。如果您在没有grep 11 部分的情况下运行相同的命令,您将看到没有任何包含11,因此行为是正确的。

    另一方面,做cat filesname | grep 11 是浪费时间。 grep 可以接受文件作为参数,所以你可以直接使用grep 11 filesname

    【讨论】:

    • 我认为他正在尝试 grep file1,而不是 filesname。但是名字file1没有给出,而是写在filesname
    【解决方案2】:

    当事物通过管道传送到grep 时,它被解释为要处理的文本,而不是要处理的文件名

    反引号可以运行一个命令并为另一个命令返回文本。

    解决方案 1: grep 11 `ls` grep 11 `cat filesname` 我省略了-l,因为只需要文件名,而不需要文件元数据。

    xargs 是另一种方式:

    解决方案 2: ls | xargs grep 11 cat filesname | xargs grep 11

    【讨论】:

    • 尝试使用名称中包含空格或更糟的通配符(或更糟的是,空格包围的通配符)的文件名。这不是一个可靠的做法,我们不应该教它:BashPitfalls 条目中更多与未引用扩展的副作用有关,而不是任何其他单一原因。
    • @CharlesDuffy 感谢您指出这一点。我已经编辑了我的答案。这些命令的问题会更少吗?
    • xargs 使用-d $'\n'-0(使用NUL 分隔的输入)当然可以制作更少的问题。请参阅我对 Andrew Sun 的回答以及其中的链接的评论。
    • 这个命令有效,谢谢!但是如何在每行的开头打印没有文件名的输出?
    • @user3383886 使用grep -h 而不是grep-h 这里的意思是 --no-filename。在man grep 中查看更多信息。
    【解决方案3】:

    您正在寻找xargs 实用程序。

    cat filesname | xargs grep 11
    

    或者更简单地说,没有 cat 的无用使用:

    xargs grep 11 < filesname
    

    这将在文件名的每一行上运行grep 11 &lt;line&gt;。由于你的行是文件名,这将运行grep 11 file1

    【讨论】:

    • 如果是每行一个文件名,xargs -d $'\n' grep 11 是更好的形式...或者,为了支持 BSD 系统以及 GNU,tr '\n' '\0' &lt;filesname | xargs -0 grep 11。请参阅 UsingFind 中有关 xargs 的警告
    猜你喜欢
    • 2010-11-28
    • 2013-01-22
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    相关资源
    最近更新 更多