Bash為什麼
為什麼 grep
似乎用一個普通的 ls
命令給出的結果略有不同?
我有一個包含一些文件的目錄-
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
;的輸出。通常有更好的方法來獲取文件名列表