我有一个包含一些文件的目录 -
mkdir _tmpmm
touch a1 b2 c3 d4
ls
# a1 b2 c3 d4
当我寻找A在 的输出中ls
,我只看到文件a1- 尽管ls
输出显示 4 个文件同一条线
ls | grep a
# a1
但是,如果我创建一个名为“file_with_names.txt”的文件,其中包含以下行 -
cat file_with_names.txt
# a1 b2 c3 d4
# xxx
# zaz
然后执行任一操作
grep a file_with_names.txt
或者
cat file_with_names.txt | grep a
我得到-
# a1 b2 c3 d4
# zaz
所以,我的问题是 - 为什么 greping forA在ls
输出上不返回整行 - 即a1 b2 c3 d4
?
答案1
该grep
命令与给定的输入相匹配
在这里,输入是来自的输出ls
(不好的做法,但现在让我们忽略它),因此匹配是包含以下内容的单个文件名a
:
ls | grep a
这里,输入是输出cat
,而输出又是文件 的内容file_with_names.txt
:
cat file_with_names.txt | grep a
如果您问为什么grep
与您看到的输出不匹配ls
,其中包括四个文件名,那是因为ls
根据它是否写入终端以供人查看它写入管道以进行后续操作,会产生不同的输出节目看。试试这个来看看写入管道时会得到什么输出:
ls | cat
一般来说,最好不要尝试解析ls
;的输出。通常有更好的方法来获取文件名列表