我使用Process替换将awk结果传递给grep和sed
grep "." | sed 's|.*\:||' \
<(awk '{arr[$5"\t"$6]++}END{for (a in arr) {if(arr[a]>2){print a, arr[a]}}}' file1) \
<(awk '{arr[$5"\t"$6]++}END{for (a in arr) {if(arr[a]>2){print a, arr[a]}}}' file2) |
awk '{cnt[$0]++} END{for (rec in cnt) if (cnt[rec] == 1) print rec}' |
awk ' {print $1}'
但是,将每个结果传递给xargs似乎不起作用
grep "." | sed 's|.*\:||' | xargs -I {} grep -E {} ${probeFileLog} ${ObjectServerLog} <(awk '{arr[$5"\t"$6]++}END{for (a in arr) {if(arr[a]>2){print a, arr[a]}}}' file1) <(awk '{arr[$5"\t"$6]++}END{for (a in arr) {if(arr[a]>2){print a, arr[a]}}}' file2) | awk '{cnt[$0]++} END{for (rec in cnt) if (cnt[rec] == 1) print rec}' | xargs -I {} grep -E {} ${probeFileLog} ${ObjectServerLog}
sed输出以下内容
749963941 3 4
749963940 3 3
749963939 3 3
749963937 3 3
749963935 3 3
749963933 3 3
749963941 3 4
749963938 3 3
749963936 3 3
749963934 3 3
749963932 3 3
答案 0 :(得分:3)
在第一行(使用新行更容易阅读)中,您有:
grep "." | sed 's|.*\:||' <( awk ... )
实际上相当于这样的东西:
grep "." | sed 's|.*\:||' /dev/fd/63
(其中/dev/fd/63
是管道。)
这意味着sed
从/dev/fd/63
而不是stdin
读取,因此它会忽略grep
的任何输出。同时,grep
正在等待来自控制台的输入。我本以为你会注意到这一点,因为你必须在命令完成后中断命令。
我认为您的意思是将awk
输出发送到grep
:
grep "." <( awk ...) | sed 's|.*\:||'
如果你这样做,它将适用于xargs
::
grep "." <( awk ...) | sed 's|.*\:||' | xargs ...
顺便说一句,grep "."
将匹配任何非空行。我不确定这是不是你想要的。
答案 1 :(得分:0)
你可能意味着一次只传递一个参数。使用-n 1
:
... xargs -n 1 -I {} grep -E {} ...
如果您的模式由换行符而不是空格分隔,请同时明确指定:
... xargs -n 1 -d '\n' -I {} grep -E {} ...
还要考虑引用变量以防止分词:
... "${probeFileLog}" "${ObjectServerLog" ...