苦苦挣扎,结合两个Greps语句

时间:2011-02-17 20:00:15

标签: bash grep

问候!

我的任务是根据我们从硬件供应商处收到的文件创建报告。我需要为两个字段'Test_Version'和'Model-Manufacturer'grep这些文件;对于每个字段,我需要捕获它们相应的值。

当单独运行每个语句时,我得到了我想要的结果:

1)对于'Test_Version',它很简单:

find . -name "*.VER" -exec grep 'Test_Version=' '{}' ';' -print; 

./(FILE_NAME).VER
Test_Version=2.6.3
./(FILE_NAME).VER
Test_Version=2.4.7

2)对于'模型制造商'来说,它有点棘手,因为我需要的是多行。我使用Perl Regex选项-P。

解决了这个问题
find . -name "*.VER" -exec grep -P 'Model-Manufacturer:.\n.' '{}' ';' -print

./(FILE_NAME).VER
--> Model-Manufacturer:
D12-100
./(FILE_NAME).VER
--> Model-Manufacturer:
H21-100

理想情况下,我想创建一个看起来像这样的简单报告

(FILE_NAME)
Test_Version=2.6.3
Model-Manufacturer:    D12-100
(FILE_NAME)
Test_Version=2.4.7
Model-Manufacturer:    H21-100

我尝试将两个greps组合起来是行不通的,即找不到任何内容:

find . -name "*.VER" -exec grep -P 'Test_Version=.Model-Manufacturer:.\n.' '{}' ';' -print

我如何才能搜索这两个字段并生成我想要的输出?

3 个答案:

答案 0 :(得分:1)

我创建了一个测试文件:

$ cat test1.VER
Test_Version=2.6.3
Model-Manufacturer:
D12-100
Test_Version=2.4.7
Model-Manufacturer:
H21-100
Test_Version=2.6.3
Model-Manufacturer:
D12-100
Test_Version=2.4.7
Model-Manufacturer:
H21-100

我创建了一个副本,以复制搜索多个文件:

$ cp test1.VER test2.VER

最后,我可以使用以下命令字符串生成您正在查找的报告:

$ find . -name "*.VER" -print -exec egrep -A 1 'Test_Version=|Model-Manufacturer:' {} ';' | sed -e '/Model/N; s/\n/ /'
./test1.VER
Test_Version=2.6.3
Model-Manufacturer: D12-100
Test_Version=2.4.7
Model-Manufacturer: H21-100
Test_Version=2.6.3
Model-Manufacturer: D12-100
Test_Version=2.4.7
Model-Manufacturer: H21-100
./test2.VER
Test_Version=2.6.3
Model-Manufacturer: D12-100
Test_Version=2.4.7
Model-Manufacturer: H21-100
Test_Version=2.6.3
Model-Manufacturer: D12-100
Test_Version=2.4.7
Model-Manufacturer: H21-100

egrep允许扩展正则表达式,其中我使用|作为替换运算符。

-A的{​​{1}}标志使其在每次匹配后提供一行上下文。如果您的输入文件在(e)grep行之后包含不需要的内容,则可能需要在Test_Versiongrep -v之间添加find管道,以消除不需要的输出。< / p>

答案 1 :(得分:1)

find . -name "*.VER" -exec \
    awk '/Model-Manufacturer:/ {a = $0; pnr = NR; getline; 
             if (NR != pnr) a = a FS $0; 
             flag = 1} 
         /Test_Version=/ {a = $0; flag = 1} 
         {if (flag)
             {if (FILENAME != prevf) {
                 printf "%s\n", FILENAME; 
                 prevf = FILENAME}; 
              print a;}
          flag = 0}' {} \;

答案 2 :(得分:0)

我会使用像

这样的东西
cat {} | grep Exp1 | grep Exp1

这里的问题是如何在命令中转义/嵌入管道。作为一种快速解决方案,您可以在shell脚本中移动两个grep并从find命令执行该脚本。不过,这不是最美丽的解决方案。