Grep

xargs grep 建議

  • May 13, 2013
grep -v "\<Swap" instruments.log | awk '{ idx=index($0, "MasterId="); masterId=substr($0, idx+length("MasterId=")+1); masterId=substr(masterId,1,index(masterId,"L")-3); print masterId; }' | xargs grep rel.log

我需要搜尋使用awk中的每個 MasterId/輸出或其他內容。 我怎樣才能做到這一點?rel.log``xargs

使用whilewithread一次從管道中獲取一條線,並將其饋送到grep.

grep -v "\<Swap" instruments.log | \
 awk '{ idx=index($0, "MasterId=");
   masterId=substr($0, idx+length("MasterId=")+1);
   masterId=substr(masterId,1,index(masterId,"L")-3);
   print masterId; }' |\
 while read line; do
   grep -- "$line" rel.log
 done

您可以將多行模式傳遞給 grep,以搜尋包含任何模式匹配項的行。換句話說,多線模式是每條線上模式的分離。

print_one_pattern_per_line | grep -f - rel.log

順便說一句,您可以簡化 print_one_pattern_per_line 部分。由於無論如何您都在呼叫 awk,因此您可以在其中進行輸入行匹配。並且您的 awk 程式碼可以以更簡單的方式編寫,使用正則表達式替換來刪除所有內容MasterId=(假設MasterId=每行出現一次,因為您的程式碼匹配第一個實例,而我下面的正則表達式匹配最後一個實例)。

<instruments.log awk '
   !/(^|[[:space:]])Swap/ {
       gsub(/.*MasterId=/, "");
       $0 = substr($0, 1, index($0, "L")-3);
       print;
   }' | grep -f - rel.log

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