xargs grep 提案

xargs 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; }' | xargs grep rel.log

awk出力などで各MasterId / Usageを検索する必要があります。どうすればいいですか?rel.logxargs

答え1

複数行のパターンを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

答え2

パイプから一度に1行ずつインポートして供給するには、whilewithを使用します。readgrep

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

関連情報