需要使用带有-A标记的反转grep选项

时间:2017-12-18 22:07:50

标签: linux grep invert

我有一个如下列表:

Name_JR_1
1.1.1.1
Name_SR_1
2.2.2.2
Name_NONE_1
3.3.3.3

如果我想用以下数字语法选择所有相关名称,我可以按如下方式运行:

grep "JR" -A1 file_name

这将打印出我想要的内容:

Name_JR_1
1.1.1.1

我需要一种方法来反转这一点,但我可以删除所有条目,但这种语法不会起作用:

grep -v "JR" -A1 file_name

在此命令之后我希望输出如下:

Names_SR_1
2.2.2.2
Name_NONE_1
3.3.3.3.

3 个答案:

答案 0 :(得分:5)

尝试:

$ 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的任何行,都会打印该行。

答案 1 :(得分:1)

另一个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或标志已启动,请反转该标志并跳至下一行。

答案 2 :(得分:1)

您也可以使用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