詳細形式:
perl -n -e 'print "$1 $2\n" if m/^
((?:\d+\.){3}\d+) # IPv4 address
(?:\.\d+)? # Optional port
\s+ # White space
(?:(?:\d+\.){4}) # IPv4 address plus dot
(\d+) # Port number
\s*$ # Optional white space
/x' perl.data
一発ギャグ:
perl -ne 'print "$1 $2\n" if m/^((?:\d+\.){3}\d+)(?:\.\d+)? (?:(?:\d+\.){4})(\d+)\s*$/'
これは、2番目のエントリにポート番号がある場合にのみ何も出力します。そうでない場合、その行はスキップされます。
必要に応じて、IPアドレスとポート番号の認識を対称にすることができます(2番目のIPアドレスは印刷されませんが)。
perl -n -e 'print "$1 $4\n" if m/^ \s* # Optional white space
((?:\d+\.){3}\d+) # IPv4 address
(?:\.(\d+)) ? # Optional Port number
\s+ # White space
((?:\d+\.){3}\d+) # IPv4 address
(?:\.(\d+)) # Mandatory Port number
\s* $ # Optional white space
/x' perl.data
\d+
「1桁以上」に使用しました。IPv4ドット付き10進アドレスコンポーネントの場合、これは\d{1,3}
「1〜3桁」になり、ポート番号は\d{1,5}
「1〜5桁」になります。
あなたが本当に詳細志向であるならば、あなたは数の範囲をより正確に制限することさえできます、しかしそれはおそらくそれの価値がありません。これは正規表現処理の一般的な機能です。悪意のある人があなたに投げかける可能性のあるすべてのバリエーションを必ずしも処理することなく、手元の仕事に十分なものを作成します。あなたは何をすべきかについて判断を下さなければなりません。