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)を印刷します。

関連情報