【问题标题】:pipe'd grep: grep on result of another greppipe'd grep: grep 另一个 grep 的结果
【发布时间】:2020-07-07 20:36:01
【问题描述】:

问:如何将第一次搜索的多个结果通过管道传输到第二个文件。

例如:

1) FILE1
system abc{
system ghi{
....
...

2) FILE2
define ABC_1_SUFFIX  0XF67
define ABC_2_SUFFIX  0XF34
define DEF_1_SUFFIX  0XF65
define DEF_2_SUFFIX  0XF11
define GHI_1_SUFFIX  0XF73
define GHI_2_SUFFIX  0XF82  


grep -r "^system" file | awk '{print $2}'   
grep -r "#define.*<result of 1st grep>" file2

任务:如何在第二个 grep 中传递第一个 grep 的结果(即 abc,def,ghi 对 grep -r "^system" )。我知道 pipe/xargs 但还不知道。

我搜索了相关主题,但没有解决。
1]GREP by result of awk
2]grep using grep results

提前致谢

【问题讨论】:

  • 请在您的问题中添加示例输入(无描述、无图像、无链接)以及该示例输入所需的输出(无评论)。
  • 您是否期望第一个 grep 的多行输出并且想要匹配每个?感觉就像你想要xargs,但并不清楚你想要做什么。
  • @WilliamPursell,是的..所以第二个 grep 就像 grep'ing 遍历第一个结果的循环。我没有在文件的 grep 中使用 xargs,请告诉我如何使用它。感谢您的提示
  • 抱歉,目前还不清楚你想要什么。从您显示的示例文件来看,您正在寻找的解决方案似乎是cat FILE2
  • @WilliamPursell 我从 FILE1 中删除了“system def{”。现在,结果应该是所有与 abc 和 ghi 相关的地址,省略 def。一个脚本可以工作,但要尝试单线破解。请告诉我。

标签: grep


【解决方案1】:

目前还不是很清楚你想要什么,但可能是这样的:

$ cat file1
system abc{
system ghi{
$ cat file2
define ABC_1_SUFFIX  0XF67
define ABC_2_SUFFIX  0XF34
define DEF_1_SUFFIX  0XF65
define DEF_2_SUFFIX  0XF11
define GHI_1_SUFFIX  0XF73
define GHI_2_SUFFIX  0XF82
$ awk '/^system/ && NR==FNR { gsub("[^a-zA-Z]","",$2); 
    a[toupper($2)] = 1; next } 
    /^define/ {for(k in a) if(match($0,k)) print $3}' file1 file2
0XF67
0XF34
0XF73
0XF82

【讨论】:

  • 谢谢,这就是我想要的!欣赏它,对不起,如果我的 Q 不是很清楚,但我想你已经有了答案:)
  • 将 file1 预处​​理为模式文件以匹配和使用 'grep -i -f ...' 可能更容易
【解决方案2】:

您的意思是将第一个命令的输出传递给第二个命令本身吗?

也许是这样的?

fisrt="$(grep -r "^system" file)"
second="$(grep -r "#define.*${first}" file2)"

丑陋的单线:

grep -r "#define.*$(grep -r "^system" file)" file2

【讨论】:

  • 感谢编辑,@William Pursell,这就是我的意思
  • grep -ri "#define.*grep -r '^system.*{' FILE1| awk '{print $2}'" FILE2 不适用于上述文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多