问候!
我的任务是根据我们从硬件供应商处收到的文件创建报告。我需要为两个字段'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
我如何才能搜索这两个字段并生成我想要的输出?
答案 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_Version
和grep -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命令执行该脚本。不过,这不是最美丽的解决方案。