【问题标题】:Using -v option to invert multi-line grep results with grep -A not working使用 -v 选项来反转多行 grep 结果,而 grep -A 不起作用
【发布时间】:2018-06-01 07:22:25
【问题描述】:

我有一个如下列表:

Name_JR_1
1.1.1.1
Name_SR_1
2.2.2.2
Name_NONE_1
3.3.3.3

如果我想使用以下数字语法选择所有关联的名称,我可以查找一个模式并使用 -A1 选项打印匹配行以及后面的上下文或下一行,如下所示:

grep "JR" -A1 file_name

这将打印我想要的:

Name_JR_1
1.1.1.1

我需要一种方法来反转它,我可以删除所有匹配搜索模式的条目。然而,使用 -v 选项和这种语法并没有给我想要的结果:

grep -v "JR" -A1 file_name

我希望这条命令之后的输出如下:

Names_SR_1
2.2.2.2
Name_NONE_1
3.3.3.3.

【问题讨论】:

  • 为什么是负面的?

标签: linux grep text-processing


【解决方案1】:

试试:

$ awk '/JR/{getline;next} 1' file
Name_SR_1
2.2.2.2
Name_NONE_1
3.3.3.3

工作原理

  1. /JR/{getline;next}

    这将选择包含JR 的行。对于这些行,这会指示 awk 获取下一行 (getline),然后跳过其余命令并从下一行 (next) 重新开始。

  2. 1

    对于其中没有 JR 的任何行,这会打印该行。

【讨论】:

  • 感谢您的解释和正确的解决方案。
【解决方案2】:

另一个 awk:

$ awk '/JR/||f==1{f=!f;next}1' file
Name_SR_1
2.2.2.2
Name_NONE_1
3.3.3.3

如果我们看到JR 或标志向上,则反转标志并跳到下一行。

【讨论】:

    【解决方案3】:

    你也可以使用sed

    $ sed '/JR/{N;d;}' ip.txt
    Name_SR_1
    2.2.2.2
    Name_NONE_1
    3.3.3.3
    
    • N 将下一行添加到模式空间,然后d 将删除它
      • 使用N;N 多两行,N;N;N 多三行,依此类推


    对于awk的通用解决方案

    $ awk '/JR/{c=2} !(c && c--)' ip.txt
    Name_SR_1
    2.2.2.2
    Name_NONE_1
    3.3.3.3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 2015-04-16
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      相关资源
      最近更新 更多