【发布时间】:2018-08-20 00:46:23
【问题描述】:
有没有办法通过管道输入命令?
例如:
在一个文件夹中,我有 2 个文件:
- 文件名
- 文件1
文件名包含:
file1
file1 包含:
11
22
33
44
11
当我运行命令时(在包含文件名和文件 1 的同一文件夹中):
ls -l | grep 11
或者命令:
cat filesname | grep 11
它不会返回:
11
11
【问题讨论】:
有没有办法通过管道输入命令?
例如:
在一个文件夹中,我有 2 个文件:
文件名包含:
file1
file1 包含:
11
22
33
44
11
当我运行命令时(在包含文件名和文件 1 的同一文件夹中):
ls -l | grep 11
或者命令:
cat filesname | grep 11
它不会返回:
11
11
【问题讨论】:
您的grep 11 命令将过滤您传递给它的所有行,并仅显示包含11 的行。如果您在没有grep 11 部分的情况下运行相同的命令,您将看到没有任何包含11,因此行为是正确的。
另一方面,做cat filesname | grep 11 是浪费时间。 grep 可以接受文件作为参数,所以你可以直接使用grep 11 filesname。
【讨论】:
file1,而不是 filesname。但是名字file1没有给出,而是写在filesname。
当事物通过管道传送到grep 时,它被解释为要处理的文本,而不是要处理的文件名。
反引号可以运行一个命令并为另一个命令返回文本。
解决方案 1:
grep 11 `ls`
grep 11 `cat filesname`
我省略了-l,因为只需要文件名,而不需要文件元数据。
xargs 是另一种方式:
解决方案 2:
ls | xargs grep 11
cat filesname | xargs grep 11
【讨论】:
xargs 使用-d $'\n' 或-0(使用NUL 分隔的输入)当然可以制作更少的问题。请参阅我对 Andrew Sun 的回答以及其中的链接的评论。
grep -h 而不是grep。 -h 这里的意思是 --no-filename。在man grep 中查看更多信息。
您正在寻找xargs 实用程序。
cat filesname | xargs grep 11
或者更简单地说,没有 cat 的无用使用:
xargs grep 11 < filesname
这将在文件名的每一行上运行grep 11 <line>。由于你的行是文件名,这将运行grep 11 file1。
【讨论】:
xargs -d $'\n' grep 11 是更好的形式...或者,为了支持 BSD 系统以及 GNU,tr '\n' '\0' <filesname | xargs -0 grep 11。请参阅 UsingFind 中有关 xargs 的警告