![xargs grep 建议](https://linux22.com/image/43065/xargs%20grep%20%E5%BB%BA%E8%AE%AE.png)
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.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
使用while
withread
一次从管道获取一行,并将其送入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