我有一个相当大的文件。所有人的共同点是打破每个部分示例的主机名:
HOSTNAME:host1
data 1
data here
data 2
text here
section 1
text here
part 4
data here
comm = 2
HOSTNAME:host-2
data 1
data here
data 2
text here
section 1
text here
part 4
data here
comm = 1
上面的打印
正如您在上面看到的,在每个部分之间还有其他部分,这些部分由具有特定值的关键字或行分割
我喜欢使用 oneliner 打印每个部分的主机名,然后打印我想在每个主机名部分下提取的行
你能帮忙吗?我现在正在使用 grep -C 10 HOSTNAME | gerp -C模式 但这假设每个部分有 10 行。这不是执行此操作的最佳方法;有人可以展示更好的方法吗?我还需要能够在我找到的每个图案下打印多行。因此,如果我找到 data1 并且它下面还有其他行,我想抓取并打印它们
所以命令的输出就像
grep -C 10 HOSTNAME | grep data 1
grep -C 10 HOSTNAME | grep -A 2 data 1
HOSTNAME:Host1
data 1
HOSTNAME:Hoss2
data 1
除了 Grep,我还使用这个 sed 命令来打印我的输出
sed -r '/HOSTNAME|shared/!d' filename
此 sed 命令的唯一问题是它只打印其中包含模式共享和主机名的行。我还需要在匹配共享模式的行下指定我想在我的案例中打印的行数。所以我喜欢打印 HOSTNAME 并给出我想在共享的第二个搜索模式下打印的行数。
谢谢
最佳答案
awk
助您一臂之力!
$ awk -v lines=2 '/HOSTNAME/{c=lines} NF&&c&&c--' file
HOSTNAME:host1
data 1
HOSTNAME:host-2
data 1
打印 lines
行数,包括模式匹配,跳过空行。
如果要指定次要关键字而不是行数
$ awk -v key='data 1' '/HOSTNAME/{h=1; print} h&&$0~key{print; h=0}' file
HOSTNAME:host1
data 1
HOSTNAME:host-2
data 1
关于linux - 根据找到第一个模式找到一个模式并打印行 sed, awk grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35613486/