使用awk打印一段文本,直到第一个空白行 [英] Print a block of text until the first blank line using awk

查看:297
本文介绍了使用awk打印一段文本,直到第一个空白行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的示例文件:

Host dns2
        HostName 172.20.4.80
        User root
        Port 22

Host dns1
        HostName 172.20.4.75
        User root
        Port 22

Host dns3
        HostName 172.20.4.76
        User root
        Port 22

Host dns4
        HostName 172.20.4.77
        User root
        Port 22

Host dns5
        HostName 172.20.4.78
        User root
        Port 22

Host dns6
        HostName 172.20.4.79
        User root
        Port 22

例如,我只想打印一个块

i want to print only one block means for example

Host dns1
        HostName 172.20.4.75
        User root
        Port 22

输出:

Host: dns2  HostName: 172.20.4.80   User: root  Port: 22

但是在此示例中,所有块都有4行,也许以后它们达到5行或更多行,所以我想从Host打印到第一行或从Host删除到第一行

but in this example all blocks have 4 lines maybe they reach to 5 or more lines later so i want to print from Host to first blank line or remove from Host to first blank line

我真的对正则表达式不好,需要它来完成我的脚本

im really bad at regex and need this to complete my script

谢谢

推荐答案

类似的awk

$ awk -v RS= -v OFS=' ' '{for(i=1;i<NF;i+=2) $i=$i":"}1' hosts

Host: dns2 HostName: 172.20.4.80 User: root Port: 22
Host: dns1 HostName: 172.20.4.75 User: root Port: 22
Host: dns3 HostName: 172.20.4.76 User: root Port: 22
Host: dns4 HostName: 172.20.4.77 User: root Port: 22
Host: dns5 HostName: 172.20.4.78 User: root Port: 22
Host: dns6 HostName: 172.20.4.79 User: root Port: 22

将以所需的输出格式为您提供所有记录.您可以进一步过滤此输出,也可以添加

will give you all records in the desired output format. You can filter either this output further or add a pattern such as

$ awk -v RS= -v OFS=' ' '{for(i=1;i<NF;i+=2) $i=$i":"} /dns2/' hosts

Host: dns2 HostName: 172.20.4.80 User: root Port: 22

如果要在处理所选记录后退出,则需要稍微更改脚本

if want to exit after processing the selected record, you need to slightly change the script

$ awk -v RS= -v OFS=' ' '/dns2/{for(i=1;i<NF;i+=2) $i=$i":"; print; exit}' hosts
Host: dns2 HostName: 172.20.4.80 User: root Port: 22

如果您要选择除一条记录以外的所有内容,则可以否定模式(并删除退出)

If you want to select everything except one record you can negate the pattern (and remove exit)

$ awk -v RS= -v OFS=' ' '!/dns2/{for(i=1;i<NF;i+=2) $i=$i":"; print}' hosts
Host: dns1 HostName: 172.20.4.75 User: root Port: 22
Host: dns3 HostName: 172.20.4.76 User: root Port: 22
Host: dns4 HostName: 172.20.4.77 User: root Port: 22
Host: dns5 HostName: 172.20.4.78 User: root Port: 22
Host: dns6 HostName: 172.20.4.79 User: root Port: 22

请注意,就地替换sed需要一个中间文件.如果要将原始文件替换为无一个记录的格式化文件,则可以在最后一个awk语句上使用此命令模式

Note that sed inplace replacement needs an intermediary file. If you want to replace the original file with the formatted one sans one record, you can use this command pattern on the last awk statement

$ awk ... > temp && mv temp original

更新: 设置OFS将更改字段之间的所有分隔符.您想按name: value在逻辑上对它们进行分组,因此将脚本更改为

UPDATE: setting OFS will change all the separators between fields. You want to logically group them by name: value, so change the script as such

$ awk -v RS= '{for(i=1;i<NF;i++) $i=$i (i%2?":":"\t")}1' hosts
Host: dns2       HostName: 172.20.4.80   User: root      Port: 22
Host: dns1       HostName: 172.20.4.75   User: root      Port: 22
Host: dns3       HostName: 172.20.4.76   User: root      Port: 22
Host: dns4       HostName: 172.20.4.77   User: root      Port: 22
Host: dns5       HostName: 172.20.4.78   User: root      Port: 22
Host: dns6       HostName: 172.20.4.79   User: root      Port: 22

在偶数定位的字段之后设置制表符分隔符.

which sets a tab delimiter after even positioned fields.

这篇关于使用awk打印一段文本,直到第一个空白行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆