一千萬個為什麽

搜索

bash:如何“動態”知道grep -A -B中的NUM選項?

我試圖通過這裏的20個txt文件集合來分析我的代理結果。

如果您想知道背景信息,請參閱我的頁面我在這裏做的只是一步。

基本上我只想從淩亂的上下文中獲取我的代理的結果,所以我有一個單個文件的命令:

cat run15.txt | grep -A 50 -E '^Agent Name: agent10479475' | grep -B 50 '^=='

這意味著:在正則表達式匹配後,繼續前進50行,停止,然後匹配行分隔符以“==”開頭,如果可能的話,返回50行(這肯定會與第一行沖突)。

這種方法取決於硬編碼的行號計數器50可以恰好獲得一個行分隔符的事實。

如果我執行以下代碼,這將無效:

cat run*.txt | grep -A 50 -E '^Agent Name: agent10479475' | grep -B 50 '^=='

輸出會很亂......

我的問題是:如何確保grep確切知道何時停止前進,以及何時停止後退?

任何建議或提示都非常感謝。

編輯:我正在做一些艱難的事情,再次...... bash大師提出了一些更強大的工具。從現在開始,我一定會切換到sed或awk。在經過試驗和錯誤後,這是我的方法:

NUM=10479475 
for i in {1..20}; do cat "run$i.txt" | grep -A 50 -E "^Agent Name: agent_*$NUM"
| grep -B 50 '^==';done > myresults.txt

最佳答案

您可以使用 sed 來實現您的目標:

sed -s -n -e '/^Agent Name: agent10479475/,/^==/ p' run*.txt

在此命令中, sed 在找到與第一個模式匹配的行時開始打印行,並在找到與第二個模式匹配的行時停止,分別處理文件。

轉載註明原文: bash:如何“動態”知道grep -A -B中的NUM選項?