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.log
xargs
答え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行ずつインポートして供給するには、while
withを使用します。read
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