【问题标题】:grep -v and -B|-A|-C not working togethergrep -v 和 -B|-A|-C 不能一起工作
【发布时间】:2011-03-24 06:28:03
【问题描述】:

我需要在一台 Solaris 机器上扫描iostat -En 的输出,以便在发现有错误的磁盘时,将关于该磁盘的两行发送到最终输出。到目前为止,这工作正常

iostat -En | grep 'Errors: [1-9]' -A 1

但是当我尝试不包括 CD/DVD 设备时,我碰壁了。 contaxt 标志 (-A|B|C) 似乎不适用于 -v,所以我不能使用它:

-bash-4.0$ iostat -En | grep -B 1 -vi "CD/DVD" | grep 'Errors: [1-9]' -A 1
c0t3d0           Soft Errors: 2 Hard Errors: 0 Transport Errors: 0
Vendor: TSSTcorp Product: CD/DVDW TS-L632D Revision: SR02 Serial No:

我认为这里不应该有任何输出,因为包含“CD/DVD”的行和它之前的行应该被删除。将其编写为任何语言的脚本都很简单,但它必须是一个可以在没有安装额外脚本的主机上运行的命令,所以我想perl -e 可以使用。我不知道任何 perl,所以我没有尝试过这种方法。

一些例子iostat -En 输出:

-bash-4.0$ iostat -En
c0t0d0           Soft Errors: 0 Hard Errors: 0 Transport Errors: 0
Vendor: SEAGATE  Product: ST973402SSUN72G  Revision: 0603 Serial No: *removed*
Size: 73.40GB <73400057856 bytes>
Media Error: 0 Device Not Ready: 0 No Device: 0 Recoverable: 0
Illegal Request: 0 Predictive Failure Analysis: 0
c0t3d0           Soft Errors: 2 Hard Errors: 0 Transport Errors: 0
Vendor: TSSTcorp Product: CD/DVDW TS-L632D Revision: SR02 Serial No:
Size: 0.00GB <0 bytes>
Media Error: 0 Device Not Ready: 0 No Device: 0 Recoverable: 0
Illegal Request: 2 Predictive Failure Analysis: 0
c0t1d0           Soft Errors: 0 Hard Errors: 0 Transport Errors: 0
Vendor: SEAGATE  Product: ST973402SSUN72G  Revision: 0603 Serial No: *removed*
Size: 73.40GB <73400057856 bytes>
Media Error: 0 Device Not Ready: 0 No Device: 0 Recoverable: 0
Illegal Request: 0 Predictive Failure Analysis: 0

在这种情况下,我不应该有任何输出,因为唯一有错误的设备是光驱,我不关心这些。

c0t1d0           Soft Errors: 0 Hard Errors: 1 Transport Errors: 0
Vendor: SEAGATE  Product: ST973402SSUN72G  Revision: 0603 Serial No: *removed*

这是我正在寻找的输出。有什么想法吗?

【问题讨论】:

    标签: perl command-line grep solaris iostat


    【解决方案1】:

    试试nawk

    iostat -En | nawk '/Errors: [1-9]/{ getline line; if (line!~/CD|DVD/) print line}
    

    【讨论】:

    • 您的解决方案解决了一个小问题;它不包括第一行(c0t0d0 软错误...),这是一个小修复——我只是将 print line} 更改为 {print; print line}}
    【解决方案2】:

    grep -v pattern 打印所有不匹配模式的行, 但是grep -B 1 -v pattern 也会打印出与模式不匹配的行之前的所有行,包括与模式匹配的行。

    例如,如果file 包含:

    ABCD
    DEFG
    GHIJ
    

    然后grep -v D file给你:

    GHIJ
    

    但是grep -B1 -v D file 给了你:

    DEFG
    GHIJ
    

    你想要的处理方式对于grep来说太复杂了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 2014-06-15
      • 2018-08-02
      • 2015-11-28
      • 1970-01-01
      • 2018-08-11
      • 2019-05-04
      相关资源
      最近更新 更多