为什么“grep”似乎与普通的“ls”命令给出略有不同的结果?

为什么“grep”似乎与普通的“ls”命令给出略有不同的结果?

我有一个包含一些文件的目录 -

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 forAls输出上不返回整行 - 即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;的输出。通常有更好的方法来获取文件名列表

相关内容