Text-Processing

為 grep 輸出上下文 (-C) 會產生大量文件

  • August 12, 2018

任務:

grep用來搜尋一些文本文件,將結果從一個grep(不包括某些行)傳送到另一個(匹配某些行)+使用-C參數顯示一些上下文,如下所示:

grep -v "Chapter" *.txt | grep -nE  -C1 " leaves? " 

問題:

這在列印結果時效果很好,但會產生非常大的文件(〜幾 GB),並且當我將它寫入文件時需要很長時間,如下所示:

grep -v "Chapter" *.txt | grep -nE  -C1 " leaves? " > out.txt

疑難解答:

  1. grep僅返回 1345 行(根據)wc,列印輸出需要幾秒鐘
  2. 大型輸出文件中的輸出看起來是合法的,也就是來自輸入文件的實際結果。
  3. -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

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