Bash

為什麼 grep 似乎用一個普通的 ls 命令給出的結果略有不同?

  • November 22, 2021

我有一個包含一些文件的目錄-

mkdir _tmpmm
touch a1 b2 c3 d4
ls
# a1  b2  c3  d4

當我在的輸出上grep時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

所以,我的問題是- 為什麼在ls輸出上 grepping 不返回整行 - 即a1 b2 c3 d4

grep命令與它給出的輸入相匹配

在這裡,輸入是來自ls(不好的做法,但我們暫時忽略它)的輸出,所以匹配是包含的單個文件名a

ls | grep a

在這裡,輸入是 的輸出cat,而輸出又是文件的內容file_with_names.txt

cat file_with_names.txt | grep a

如果您問為什麼grep與您看到的輸出不匹配ls,其中包含四個文件名,那是因為ls產生不同的輸出取決於它是否正在寫入終端以供人們看到它寫入管道以供後續使用節目看。試試這個看看當它寫入管道時會得到什麼輸出:

ls | cat

通常,最好不要嘗試解析來自ls;的輸出。通常有更好的方法來獲取文件名列表

引用自:https://unix.stackexchange.com/questions/678592