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

我需要搜索每个 MasterId/使用awk中的输出或其他内容。 我怎样才能做到这一点?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

使用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

相关内容