2017-07-16 43 views
0

我有一个类似于Bash, grep between two lines with specified string的情况。我有以下格式的输出的文本文件:过滤文本文件的行

HEADER A 
lines of output 
---------------- 
HEADER B 
lines of output 
---------------- 
...rinse and repeat... 

我想匹配具有相同标头的所有块。 grep似乎不足以完成此任务。我只是模糊地熟悉awksed。足以认识到他们可能是这里最合适的工具。那么如何匹配一个由匹配的HEADER和----------行封闭的块呢?

我的基于链接的问题,尝试

awk '/HEADER/{f=1} /-/{f=0;print} f' filename.txt 

然而,这仍然符合一些与第二集块线。

+0

也许你需要扩大你的输入文件,并告诉你如何得到错误的输出...... –

+0

@GeorgeVasiliou刚编辑显示更清楚的文件格式。 –

+0

为什么不'awk'/ HEADER A/{f = 1}/-------/{f = 0; print} f'file.txt' ...? –

回答

1

调整this answer,以适应问题,我得到:

sed -n '/HEADER/,/-/p' filename.txt 

这是相当脆(它停止当它找到一个连字符),所以像

sed -n '/HEADER/,/^-+$/p' filename.txt 

检查全连字符可能更可取。据我所知(不是sed专家),斜线之间的所有内容都是正则正则表达式,启用了多行标志m

+0

我的一点研究表明''x,y''语法匹配从'x'到'y'的多行,可以用正则表达式来指定。据我所知,每个正则表达式只匹配个别行。 –

+0

我已经遇到了你的第一个解决方案的脆弱性。带有第二个标题的块包含负数。 –

1

对于这样一个文件:

$ cat file1 
HEADER A 
lines of output1.1 
---------------- 
HEADER B 
lines of output2.1 
---------------- 
HEADER A 
lines of output1.2 
---------------- 
HEADER B 
lines of output2.2 
---------------- 
HEADER A 
lines of output1.3 
---------------- 
HEADER B 
lines of output2.3 
---------------- 

像这样的东西给所有头一句台词:

$ awk '/HEADER A/{f=1} /-------/ && f==1{f=0;print} f' file1 
HEADER A 
lines of output1.1 
---------------- 
HEADER A 
lines of output1.2 
---------------- 
HEADER A 
lines of output1.3 
---------------- 

你只需要在终端线路

使一个AND条件(& &)

如果这不是你所需要的,恐怕你应该重新输入你的问题,以便更清楚一点。

+0

你能解释一下,在你的命令结尾处'f'的功能是什么?如果'f'是1,那么打印记录,这是否正确? – FloHe

+1

@FloHe在'awk'世界中,最后一个'f'是一个awk快捷方式,用于说明'if f == 1 then print'(或者在awk代码中'f == 1 {print $ 0}')。更确切地说,一个单一的f是一个条件检查,相当于'如果f不是零或者f没有被设置,那么打印这条线'。此外,在awk中,我们可以在'condition {action}'的awk语法中省略'{action}'部分。完成该操作后,将执行默认操作=打印该行='{print $ 0}' –

+0

好的答案,谢谢 – FloHe