Shell进程替换和xargs命令不起作用

时间:2014-08-01 03:36:46

标签: bash shell awk sed grep

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

2 个答案:

答案 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" ...