我有一个包含以下信息的文件:
{
"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
答案 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东西文件