Text-Processing
為 grep 輸出上下文 (-C) 會產生大量文件
任務:
我
grep
用來搜尋一些文本文件,將結果從一個grep
(不包括某些行)傳送到另一個(匹配某些行)+使用-C
參數顯示一些上下文,如下所示:grep -v "Chapter" *.txt | grep -nE -C1 " leaves? "
問題:
這在列印結果時效果很好,但會產生非常大的文件(〜幾 GB),並且當我將它寫入文件時需要很長時間,如下所示:
grep -v "Chapter" *.txt | grep -nE -C1 " leaves? " > out.txt
疑難解答:
grep
僅返回 1345 行(根據)wc
,列印輸出需要幾秒鐘- 大型輸出文件中的輸出看起來是合法的,也就是來自輸入文件的實際結果。
-C
將運算符替換為-A
或-B
會產生 KB 大小的良好輸出文件。問題:
- 為什麼會這樣?
- 有什麼東西會以
-C
這種方式破壞事物嗎?- 還是我忽略了其他問題?
任何提示表示讚賞!在 MacOS 終端中執行它。我跟著這個人。
嘗試更改您正在編寫的目錄
out.txt
。例如將此命令更改為:$ grep -v "Chapter" *.txt | grep -nE -C1 " leaves? " > /tmp/out.txt
例子
在這裡,您可以看到在 Bash shell 中啟用詳細輸出時發生的情況。
$ set -x $ grep -v "Chapter" *.txt | grep -nE -C1 " leaves? " > out.txt + grep --color=auto -nE -C1 ' leaves? ' + grep --color=auto -v Chapter file01.txt file02.txt file03.txt file04.txt file05.txt file06.txt file07.txt file08.txt file09.txt file10.txt out.txt
請注意,它正在接受參數
*.txt
並對其進行擴展,並且它包含文件out.txt
. 所以當你寫出這個文件時,你實際上是在解析這個文件。為什麼?
如果您考慮一下當 1 個命令的輸出通過管道傳送到下一個命令時,shell 會做什麼,這是有道理的。shell 解析你剛剛給它的命令,尋找管道(
|
)。當它遇到它們時,它必須從右邊執行它們,以便在管道內發生的命令之間設置 STDIN/STDOUT 的重定向。隨著更多管道的添加,您可以使用該
sleep
命令查看 shell 如何解析內容:$ sleep 0.1 | sleep 0.2 | sleep 0.3 | sleep 0.4 + sleep 0.2 + sleep 0.3 + sleep 0.4 + sleep 0.1 $ sleep 0.1 | sleep 0.2 | sleep 0.3 | sleep 0.4 | sleep 0.5 + sleep 0.2 + sleep 0.3 + sleep 0.4 + sleep 0.5 + sleep 0.1
echo
通過+ 寫入文件執行此操作還通過文件訪問和stat
命令顯示順序:$ echo "1" > file1 | echo "2" > file2 | echo "3" > file3 | echo "4" > file4 + echo 2 + echo 3 + echo 4 + echo 1 $ stat file* | grep -E "File|Access: [[:digit:]]+" + grep --color=auto -E 'File|Access: [[:digit:]]+' + stat file1 file2 file3 file4 File: ‘file1’ Access: 2018-08-11 23:55:20.868220474 -0400 File: ‘file2’ Access: 2018-08-11 23:55:20.865220576 -0400 File: ‘file3’ Access: 2018-08-11 23:55:20.866220542 -0400 File: ‘file4’ Access: 2018-08-11 23:55:20.867220508 -0400