Grep マッチングと抽出

Grep マッチングと抽出

次の行を含むファイルがあります

proto=tcp/http  sent=144        rcvd=52 spkt=3 
proto=tcp/https  sent=145        rcvd=52 spkt=3
proto=udp/dns  sent=144        rcvd=52 spkt=3

protoの値、つまり、、tcp/httptcp/https抽出する必要がありますudp/dns

これまで試してみましたが、grep -o 'proto=[^/]*/'値をproto=tcp/

ベストアンサー1

を使用するには、grep -o抽出したいものと正確に一致する必要があります。文字列を抽出したくないので、proto=一致しないでください。

tcpudpスラッシュと空でない英数字の文字列と一致する、またはそれに続く拡張正規表現は次のとおりです。

(tcp|udp)/[[:alnum:]]+

これをデータに適用します。

$ grep -E -o '(tcp|udp)/[[:alnum:]]+' file
tcp/http
tcp/https
udp/dns

文字列で始まる行でのみこれを行うには、次のようにしますproto=

grep '^proto=' file | grep -E -o '(tcp|udp)/[[:alnum:]]+'

最初の空白文字sedの前後のすべてを使用して削除します。=

$ sed 's/^[^=]*=//; s/[[:blank:]].*//' file
tcp/http
tcp/https
udp/dns

文字列で始まる行でのみこれを実行するには、proto=上記と同じ前処理ステップを挿入するか、次を使用できます。grep

sed -n '/^proto=/{ s/^[^=]*=//; s/[[:blank:]].*//; p; }' file

-nここでは、デフォルトの出力を抑制してから置換を実行し、その行が一致する場合にのみその行を明示的に印刷するオプションを使用します^proto=


の場合、デフォルトawkのフィールド区切り文字を使用して最初のフィールドを分割し、=2番目のビットを印刷します。

$ awk '{ split($1, a, "="); print a[2] }' file
tcp/http
tcp/https
udp/dns

文字列で始まる行でのみこれを実行するには、proto=上記と同じ前処理ステップを挿入するか、次を使用できます。grep

awk '/^proto=/ { split($1, a, "="); print a[2] }' file

おすすめ記事