使用awk打印一段文本,直到第一个空白行 [英] Print a block of text until the first blank line using 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屋!