Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在特定模式后的换行符之间使用sed或awk进行提取?_Awk_Sed - Fatal编程技术网

如何在特定模式后的换行符之间使用sed或awk进行提取?

如何在特定模式后的换行符之间使用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.

我喜欢检查是否有其他替代方案,我可以使用其他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.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}文件
这意味着:

  • RS=
    -让awk逐段读取文件
  • /^#Hiko$/
    '$0==“#Hiko”
    -查找与
    #Hiko
    相等的段落
  • {getline;print;exit}
    -获取下一段,打印并退出
请参阅。

第一种解决方案:对于显示的样本,请尝试以下方法。用GNU
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