【问题标题】:Using Xargs to read the input from a console使用 Xargs 从控制台读取输入
【发布时间】:2012-06-20 01:49:48
【问题描述】:

这是我写的脚本

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....

【问题讨论】:

  • 你能从文件 A 和文件 B 中给出几行,并具体指定你想在 shell 中提供什么输入吗?到目前为止,您的脚本是什么样的?
  • FileA 有多大?那是多少行?如果只有几个(比如说,不到一千个),那么有一组选项可用;如果它很大,则选项会更少。此外,RID 是 FileA 每一行中多个字段中的一个,还是每一行中唯一的数据?
  • 实际上文件A的大小超过千。关于文件 1 的 RID 输出,例如 09877326369900 92828282828 020292929202 。这些是文件 A 的三个输出。现在我需要获取文件 B 中具有文件 A 输出的相应行...为此,我需要从控制台本身读取文件 A 的输出,而不是将其存储在一个临时文件

标签: grep xargs


【解决方案1】:

另一种方法是通过管道传输数据,例如:

script1 fileA | script2 fileB

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

【讨论】:

  • 第二个脚本如何从第一个接收输入
  • 这是我之前写的脚本 zgrep -i xxxx FileA|grep -o "RID=[0-9|A-Z]*"|uniq|cut -d "=" -f2|xargs 之前我的 o/p 使用 Xargs 的点是 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,文件 B 中的 grep RID3,文件 B 中的 grep RID4} 现在我唯一的问题是如何使用 xargs 引用 RID1,2,3,4 ....
  • 我已经编辑了这个问题..请看一下更好的格式
  • 伙计们,我已经找到答案了......我们可以使用下面的 xargs -0 -I string zcat XXXXX| agrep -dEOE string.. 因此 xargs 将一个一个传递值
【解决方案2】:

如果 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 -f - /etc/passwd 检查grep -F 的行为,然后在“控制台”(终端)上输入/bin/,然后指示EOF。它工作正常。)

如果你使用bash,你可以使用“进程替换”来得到你想要的结果:

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

进程替换在&lt;( ... ) 中运行命令,以便其输出到“文件”(实际上,通常是/dev/fd 中的文件描述符),并将名称赋予命令(grep)为一个常规的文件名参数。

如果您不使用bash,您可以使用它来代替(这也适用于bash,甚至可能更可取):

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

在这种情况下,单独的破折号表示“从标准输入读取”;这是命令的通用约定。它在 Mac OS X 10.7.4 上运行良好;它很有可能在其他地方也可以使用。

【讨论】:

  • 它在每行一个 RID ... 但 fgrep 是否从控制台读取 i/p
  • 这是我之前写的脚本 zgrep -i xxxx FileA|grep -o "RID=[0-9|A-Z]*"|uniq|cut -d "=" -f2|xargs 之前我的 o/p 使用 Xargs 的点是 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,文件 B 中的 grep RID3,文件 B 中的 grep RID4 现在我唯一的问题是如何使用 xargs 引用 RID1,2,3,4....
  • 我已经编辑了这个问题..请看一下更好的格式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多