如何在Shell脚本中匹配然后替换多行

安库尔

嗨,我有这个文本文件。

Physical interface: ge-0/0/3, Enabled, Physical link is Up
  Interface index: 132, SNMP ifIndex: 504
  Description: # SURVEILLANCE CAMERA #
  Link-level type: Flexible-Ethernet, Media type: Copper, MTU: 9000,
  LAN-PHY mode, Link-mode: Full-duplex, Speed: 1000mbps, BPDU Error: None,
   .....few more lines
Physical interface: ge-0/1/0, Enabled, Physical link is Down
  Interface index: 133, SNMP ifIndex: 505
  Link-level type: Ethernet, Media type: Fiber, MTU: 1514, LAN-PHY mode,
  Speed: 1000mbps, BPDU Error: None, MAC-REWRITE Error: None,
    .....few more lines
Physical interface: ge-0/1/3, Enabled, Physical link is Up
  Interface index: 136, SNMP ifIndex: 508
  Description: # TO CSS_I-TN-CHNN-ENB-I099 #
  Link-level type: Flexible-Ethernet, Media type: Fiber, MTU: 8000,
  LAN-PHY mode, Speed: 1000mbps, BPDU Error: None, MAC-REWRITE Error: None,
   ... few more lines

 and so on....

现在,如果“物理链接”已打开且MTU的值为9000,则只需要替换两条相应的行即可。

<Pass>Physical interface: ge-0/0/3, Enabled, Physical link is Up
&
<Pass>Link-level type: Flexible-Ethernet, Media type: Fiber, MTU: 9000,

在任何其他情况下它将<Fail>代替<Pass>这些值位于不同的行中,这就是为什么我不了解使用sed或其他任何东西的原因..请帮助...这是预期的输出..

 <Pass>Physical interface: ge-0/0/3, Enabled, Physical link is Up
      Interface index: 132, SNMP ifIndex: 504
      Description: # SURVEILLANCE CAMERA #
      <Pass>Link-level type: Flexible-Ethernet, Media type: Copper, MTU: 9000,
      LAN-PHY mode, Link-mode: Full-duplex, Speed: 1000mbps, BPDU Error: None,
         .....few more lines
  <Fail>Physical interface: ge-0/1/0, Enabled, Physical link is Down
     Interface index: 133, SNMP ifIndex: 505
     <Fail>Link-level type: Ethernet, Media type: Fiber, MTU: 1514, LAN-PHY mode,
     Speed: 1000mbps, BPDU Error: None, MAC-REWRITE Error: None,
            .....few more lines
   <Fail>Physical interface: ge-0/1/3, Enabled, Physical link is Up
     Interface index: 136, SNMP ifIndex: 508
     Description: # TO CSS_I-TN-CHNN-ENB-I099 #
     <Fail>Link-level type: Flexible-Ethernet, Media type: Fiber, MTU: 8000,
     LAN-PHY mode, Speed: 1000mbps, BPDU Error: None, MAC-REWRITE Error: None,
           ... few more lines

         and so on....
温特穆特

与sed:

sed '/Physical link is/ { :a /MTU:/! { N; ba; }; /Physical link is Up.*MTU: 9000/ { s/\(.*\n\)\s*/<Pass>\1<Pass>/; b; }; s/\(.*\n\)\s*/<Fail>\1<Fail>/; }' filename

那是:

/Physical link is/ {                       # Block start found
  :a
  /MTU:/! {                                # fetch lines until we find the MTU
    N
    ba
  }
  /Physical link is Up.*MTU: 9000/ {       # If link is up and MTU 9000
    s/\(.*\n\)[[:space:]]*/<Pass>\1<Pass>/ # insert Pass markers
    b
                                           # we're done.
  }
  s/\(.*\n\)[[:space:]]*/<Fail>\1<Fail>/   # otherwise insert Fail markers
}

请注意,对于BSD sed,由于b说明,它不能用作单线在这种情况下,将扩展的代码(不带注释,因为BSD sed容易混淆)放在文件中foo.sed,然后使用sed -f foo.sed filename我已经\s用它的POSIX等效项([[:space:]]替换了其他GNU-ism(

要将空格保留在MTU行的开头,请删除\s[[:space:]]要将空格放在结果标记之前,请将\s[[:space:]]放在捕获组内(即\(.*\n\s*\))。

另请注意:这假设每个接口描述都有一个MTU字段。

或者,您可以尝试以下awk脚本:

awk -v RS='Physical interface:' -F '\n' -v OFS='\n' '{ result = "<Fail>" } /Physical link is Up/ && /MTU: 9000/ { result = "<Pass>" } NR != 1 { for(i = 1; i <= NF; ++i) { if(index($i, "MTU:")) { sub(/^ */, result, $i) } } print result RS $0 }' filename

这会将文件拆分为的记录,Physical interface:并将记录拆分为换行的字段。然后:

{ result = "<Fail>" }                  # result is Fail 
/Physical link is Up/ && /MTU: 9000/ { # unless link is up and MTU 9000
  result = "<Pass>"
}

NR != 1 {                              # the first record is the empty string
                                       # before the first actual record, so
                                       # we remove it.
  for(i = 1; i <= NF; ++i) {           # wade through the fields (lines)
    if(index($i, "MTU:")) {            # find the MTU line
      sub(/^ */, result, $i)           # put the marker there. To keep the
                                       # whitespace, use $i = result $i
                                       # instead, or sub(/^ */, "&" result, $i)
                                       # to keep the spaces before the marker.
    }
  }
  print result RS $0                   # once done, print the whole shebang.
                                       # We have to reinsert the record
                                       # separator because it was removed
                                       # by the splitting.
}

请注意,多字符RS并不严格符合POSIX。不过,最常见的awks(gawk和mawk)都支持它。值得注意的是,BSD awk没有。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何匹配然后替换Shell脚本中的多行

来自分类Dev

如何在 Shell 脚本中替换完全匹配的单词?

来自分类Dev

如何在Shell脚本中查找和替换文本

来自分类Dev

如何在Unix Shell脚本中替换字符串

来自分类Dev

如何在Jenkins Groovy中的多行shell脚本中设置变量?

来自分类Dev

如何在多行中匹配多个单词

来自分类Dev

如何在shell脚本中逐行读取多行输出命令行?

来自分类Dev

如何在失败时退出多行 shell 脚本,并将错误流记录到文件中?

来自分类Dev

如何在Shell脚本中注释多行命令?

来自分类Dev

如何在bash中触发多个远程Shell脚本并发运行,然后等待它们完成?

来自分类Dev

如何在bash中触发多个远程Shell脚本并发运行,然后等待它们完成?

来自分类Dev

如何在目录中找到最新的日期文件夹,然后在Shell脚本中构造命令?

来自分类Dev

如何停止在BASH脚本中串联命令替换的多行输出?

来自分类Dev

如何在 shell 脚本中替换 BibTeX 中的特殊字符(例如 {\'{o}} = ó)?

来自分类Dev

如何在npm脚本中编写多行脚本?

来自分类Dev

您如何在没有它的shell中实现进程替换(使用bash脚本)?

来自分类Dev

如何在Shell脚本中查找匹配项和对应的值

来自分类Dev

如何在bash脚本中替换引号

来自分类Dev

如何在脚本源中替换url

来自分类Dev

如何在Shell脚本中运行Shell脚本

来自分类Dev

如何在文件中找到匹配的值,然后在另一个文件中替换该值?

来自分类Dev

如何在Shell脚本中用空格替换整个句子

来自分类Dev

如何在shell脚本中读入用户的输入并在脚本完成执行后用输入替换一行?

来自分类Dev

在Shell脚本中查找多行文本并使用正则表达式替换

来自分类Dev

如何在Python数据框中同时替换多行?

来自分类Dev

如何在KDE Kate中搜索和替换多行?

来自分类Dev

如何在Shell脚本中运行别名?

来自分类Dev

如何在Shell脚本中更改PATH?

来自分类Dev

如何在shell脚本中打印$?

Related 相关文章

  1. 1

    如何匹配然后替换Shell脚本中的多行

  2. 2

    如何在 Shell 脚本中替换完全匹配的单词?

  3. 3

    如何在Shell脚本中查找和替换文本

  4. 4

    如何在Unix Shell脚本中替换字符串

  5. 5

    如何在Jenkins Groovy中的多行shell脚本中设置变量?

  6. 6

    如何在多行中匹配多个单词

  7. 7

    如何在shell脚本中逐行读取多行输出命令行?

  8. 8

    如何在失败时退出多行 shell 脚本,并将错误流记录到文件中?

  9. 9

    如何在Shell脚本中注释多行命令?

  10. 10

    如何在bash中触发多个远程Shell脚本并发运行,然后等待它们完成?

  11. 11

    如何在bash中触发多个远程Shell脚本并发运行,然后等待它们完成?

  12. 12

    如何在目录中找到最新的日期文件夹,然后在Shell脚本中构造命令?

  13. 13

    如何停止在BASH脚本中串联命令替换的多行输出?

  14. 14

    如何在 shell 脚本中替换 BibTeX 中的特殊字符(例如 {\'{o}} = ó)?

  15. 15

    如何在npm脚本中编写多行脚本?

  16. 16

    您如何在没有它的shell中实现进程替换(使用bash脚本)?

  17. 17

    如何在Shell脚本中查找匹配项和对应的值

  18. 18

    如何在bash脚本中替换引号

  19. 19

    如何在脚本源中替换url

  20. 20

    如何在Shell脚本中运行Shell脚本

  21. 21

    如何在文件中找到匹配的值,然后在另一个文件中替换该值?

  22. 22

    如何在Shell脚本中用空格替换整个句子

  23. 23

    如何在shell脚本中读入用户的输入并在脚本完成执行后用输入替换一行?

  24. 24

    在Shell脚本中查找多行文本并使用正则表达式替换

  25. 25

    如何在Python数据框中同时替换多行?

  26. 26

    如何在KDE Kate中搜索和替换多行?

  27. 27

    如何在Shell脚本中运行别名?

  28. 28

    如何在Shell脚本中更改PATH?

  29. 29

    如何在shell脚本中打印$?

热门标签

归档