使用Xargs从控制台读取输入

时间:2012-06-20 01:49:48

标签: grep xargs

这是我写的脚本

zgrep -i xxxx FileA | grep -o "RID=[0-9|A-Z]*" | uniq | cut -d "=" -f2 | xargs

在使用xargs之前,我的o / p是

01982893213982312 - RID 1
32103213213213213 - RID 2
32103213213213343 - RID 3
32103213213251261 - RID 4

对于此处存在的每个RID,文件B中都有相应的行。我打算在以下内容之后执行以下操作:

zgrep -i xxxx FileA | grep -o "RID=[0-9|A-Z]*" | uniq | cut -d "=" -f2 | xargs|
{grep RID1 in file B, grep RID2 in file B,grep RID3 in file B, grep RID4 in file B}

现在我唯一的问题是我将如何使用xargs引用RID1,2,3,4 ....

2 个答案:

答案 0 :(得分:0)

另一种方法是管道数据,如:

script1 fileA | script2 fileB

这种方法允许您传递更多参数,并通过fileB ..

进行流式传输

答案 1 :(得分:0)

如果FileA中的数据是每行一个RID,那么明显的选择是(经典)fgrep或(使用更现代的表示法)grep -F。在2004版本中,POSIX未标准化fgrep(将其替换为grep -F)。但是,fgrep有很长的血统;例如,它是大约1978年第7版UNIX™的一部分。

fgrep -f FileA FileB
grep -F -f FileA FileB

如果FileA中的数据不是“每行一个RID”格式,那就这样做吧!


  

但fgrep是否从控制台读取了i / p

如果您告诉它,但您不希望它从控制台读取;你希望它从标准输入读取。 “控制台输入”意味着“你打字”,粗略。 (也就是说,我使用grep -F检查grep -F -f - /etc/passwd的行为,然后在'控制台'(终端)上键入/bin/,然后指示EOF。它工作正常。)

如果您使用的是bash,则可以使用“流程替换”来获得所需的结果:

grep -F -f <(zgrep -i xxxx FileA | grep -o "RID=[0-9|A-Z]*" | uniq | cut -d "=" -f2) FileB

进程替换运行<( ... )内的命令,以便其输出转到'文件'(实际上,通常是/dev/fd中的文件描述符),并且该命令被赋予命令({ {1}})作为常规文件名参数。

如果你没有使用grep,你可以改用它(这也适用于bash,甚至可能更好):

bash

在此上下文中,单独的短划线表示“从标准输入读取”;它是命令的通用约定。它在Mac OS X 10.7.4上运行良好;它也很有可能在其他地方发挥作用。