Grep一个模式,并打印文件的标题

时间:2015-07-07 14:19:02

标签: linux grep pattern-matching

我有一个包含以下信息的文件:

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "Main_ingredient.type": "Beef"
          }
        },
        {
          "range": {
            "Main_ingredient.weight": {
              "lte": 1000
            }
          }
        },
        {
          "nested": {
            "path": "Ingredients",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "Ingredients.name": "garlic"
                    }
                  },
                  {
                    "range": {
                      "Ingredients.weight": {
                        "lte": 400
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        {
          "nested": {
            "path": "Ingredients",
            "query": {
              "bool": {
                "must": [
                  {
                    "match": {
                      "Ingredients.name": "chilli powder"
                    }
                  },
                  {
                    "range": {
                      "Ingredients.weight": {
                        "lte": 400
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      ]
    }
  }
}

我想要做的是grep其中一个进程行(e.x“进程:2”)然后删除另一个进程,同时保留头信息。我所知道的是“进程:#”之后的行数(让我们在本例中使用3)。我不知道的是有多少个进程号。我在尝试的是:

header info line 1 
header info line 2
header info line 3
   ....
process: 1
   info 1
   info 2
   info 3

process: 2
   info 1
   info 2
   info 3

process: 3
   info 1
   info 2
   info 3

但是我丢失了标题信息。我想保留标题信息,但摆脱所有其他进程信息。我觉得我可以用egrep做到这一点,但我不确定如何。

我想要的输出如下:

 grep "process: 2" -A 3 file.txt

3 个答案:

答案 0 :(得分:2)

最好使用awk

$ awk -v N=3 -v header=4 '/process: 2/{c=N+1} NR<=header || c&&c--;' file
header info line 1 
header info line 2
header info line 3
   ....
process: 2
   info 1
   info 2
   info 3

这会使用printing with sed or awk a line following a matching pattern并检查标题上的行。

解释

  • -v N=3 -v header=4提供标题所包含的行数(header)以及匹配后应打印的行数(N)。
  • /process: 2/{c=N+1}当看到process: 2行时,设置变量c(来自计数器)。
  • c&&c--评估c。如果其值大于0,则计算结果为True,以便打印该行。此外,递减该值以便仅打印N行。
  • NR<=header如果行号等于或低于给定值header,则计算结果为True并打印该行。

答案 1 :(得分:1)

也很不错

sed -n '1,4p; /^process: 2$/ {N;N;N;p;q}' file.txt

这将打印前4行,当我们看到所需的图案时,阅读接下来的3行,打印并退出。

答案 2 :(得分:0)

head -1 文件; grep东西文件