Grep 查找模式之前最近出现的行

Grep 查找模式之前最近出现的行

我想使用 GREP 搜索文件中的“User-Agent: UA”,然后提取上面最接近的包含“Via:”的行 我的问题是有时有多行包含“Via:”,但我只需要最后一个。

例如要解析的文件:

Via: 1.1.1.1  
not relevant line  
...
not relevant line N
User-Agent: UA
...
Via: 2.2.2.2
Via: 3.3.3.3
not relevant line
...
not relevant line N
User-Agent: UA
...
Via: 4.4.4.4
Via: 5.5.5.5
Via: 6.6.6.6
not relevant line
...
not relevant line N
User-Agent: UA

我想要的结果是包含最接近“User-Agent:UA”的“Via:”的行

Via: 1.1.1.1
Via: 3.3.3.3
Via: 6.6.6.6

任何帮助将不胜感激。

答案1

awk你可以这样做:

 awk '/Via/ {via_line=$0} /User-Agent: UA/ {print via_line}' input_file

因此,我们将找到包含Via并存储该行的每一行,覆盖任何先前的行,然后当我们找到该User-Agent: UA行时,打印我们为该Via行存储的所有内容。

答案2

使用 sed:

sed -n '/^Via/h;/^User-Agent: UA$/{g;p;}' file

输出:

通过:1.1.1.1  
途径:3.3.3.3
途径:6.6.6.6

使用 禁止自动打印图案空间-n。如果一行以Via复制模式空格开头以保存空格 ( h)。这会覆盖保留空间。如果一行包含“User-Agent: UA”,则将保留空间复制到模式空间 ( g) 并打印模式空间 ( p)。

相关内容