Files

逐行讀取文件並記住文件中的最後一個位置

  • December 19, 2017

我想從另一個文件的輸入中提取日誌文件中的某些行。我正在使用這個小命令來做到這一點:

while read line; do 
   grep "$line" service.log; 
done < input_strings.txt > result.txt

input_strings.txt有大約 50 000 個字元串(每行一個)。對於每個字元串,我目前正在搜尋巨大的service.log文件(大約 2 000 000 行)。

因此,假設第 1 個字元串input_strings.txt位於service.log第 10 000 行,這一行被寫入 my result.txt. 之後,input_strings.txt將在 中搜尋的第二個字元串service.log,但從 的第 1 行開始service.log

我怎麼能記住我找到第一個條目的最後一行service.log?這樣我就可以在那裡開始第二次搜尋了?

如果您想獲得匹配項,那麼您根本不需要使用循環。grep只使用一個命令會快得多:

grep -Ff input_strings service.log > results.txt

也就是說,如果您想按字面意思執行您在問題中所說的內容,那麼您可以使用變數來跟踪找到最後一個匹配項的行:

LINE_NUMBER=0
while read LINE; do

   # Search for the next match starting at the line number of the previous match
   MATCH="$(tail -n+${LINE_NUMBER} "service.log" | grep -n "${LINE}" | head -n1)";

   # Extract the line number from the match result
   LINE_NUMBER="${MATCH/:*/}";

   # Extract the matching string from the match result
   STRING="${x#*:}";

   # Output the matching string
   echo "${STRING}";

done < input_strings.txt > result.txt

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