如何在特定模式后的换行符之间使用sed或awk进行提取?
我喜欢检查是否有其他替代方案,我可以使用其他bash命令打印,以获得#Hiko下的IP范围,而不是下面的sed、tail和head,我实际上找到了它们,以从我的hosts文件中获得所需的内容。 我只是好奇,渴望在bash上学习更多,希望能从社区中获得更多的知识。 :D /etc/主持人如何在特定模式后的换行符之间使用sed或awk进行提取?,awk,sed,Awk,Sed,我喜欢检查是否有其他替代方案,我可以使用其他bash命令打印,以获得#Hiko下的IP范围,而不是下面的sed、tail和head,我实际上找到了它们,以从我的hosts文件中获得所需的内容。 我只是好奇,渴望在bash上学习更多,希望能从社区中获得更多的知识。 :D /etc/主持人 #Tito 192.168.1.21 192.168.1.119 #Hiko 192.168.1.243 192.168.1.125 192.168.1.94 192.168.1.24 192.168.1.
#Tito
192.168.1.21
192.168.1.119
#Hiko
192.168.1.243
192.168.1.125
192.168.1.94
192.168.1.24
192.168.1.242
#Pico
192.168.1.23
192.168.1.93
192.168.1.121
你可以用
awk-vrs='/^#Hiko$/{getline;print;exit}文件
awk-vrs='$0==“#Hiko”{getline;print;exit}文件
这意味着:
-让awk逐段读取文件RS=
或/^#Hiko$/
-查找与'$0==“#Hiko”
相等的段落#Hiko
-获取下一段,打印并退出{getline;print;exit}
awk
编写和测试
awk -v RS= '/#Pico/{exit} /#Hiko/{found=1;next} found' Input_file
说明:
第二种解决方案:不使用RS
功能,尝试以下操作
awk '/#Pico/{exit} /#Hiko/{found=1;next} NF && found' Input_file
第三种解决方案:您可以查找记录#Hiko
,然后打印下一条记录并显示样本
awk -v RS= '/#Hiko/{found=1;next} found{print;exit}' Input_file
注意:以上所有解决方案都会检查字符串#Hiko
或#Pico
是否存在于行中的任何位置,如果您想查看精确的字符串,则只需在上面更改/#Hiko/
和/#Pico/
分别为/#Hiko$/
和/#Pico$/
awk-vrs='p&&NR==p+1$1==“#Hiko”{p=NR}'/etc/hosts
192.168.1.243
192.168.1.125
192.168.1.94
192.168.1.24
192.168.1.242
使用sed
(使用GNU-sed
检查,其他实现的语法可能不同)
-n
关闭图案空间的自动打印
/#Hiko/
如果行包含#Hiko
n
获取下一行(假设总是有空行)
:a
标签a
n
get next line(使用n
将覆盖模式空间中以前的任何内容,因此在这种情况下仅存在单行内容)
/^$/q
如果当前行为空,请退出
p
打印当前行
ba
分支到标签a
这可能适合您(GNU-sed):
将标头复制到保留缓冲区
将保持缓冲区追加到每一行
如果行以数字开头并包含所需的标题,请打印模式空间中的第一行。@Yong,欢迎您,您也可以向上投票所有答案,也可以接受任何一个有用的答案,干杯,快乐学习。
awk '/#Pico/{exit} /#Hiko/{found=1;next} NF && found' Input_file
awk -v RS= '/#Hiko/{found=1;next} found{print;exit}' Input_file
$ sed -n '/#Hiko/{n; :a n; /^$/q; p; ba}' /etc/hosts
192.168.1.243
192.168.1.125
192.168.1.94
192.168.1.24
192.168.1.242
sed -n '/^#/h;G;/^[0-9].*\n#Hiko/P' file