0

確認するIP番号がたくさんあるとしましょう(スペースで区切られた1行に2つのIP番号)(ここでは2行です):

67.21.89.48.1623 139.91.131.115.110
211.47.82.64 139.91.134.123.445

それらの1つにポートがない可能性があるため、期間の数が一定になることはありません。最初のIP番号(ポートなし)と2番目のセットのポート(IP番号なし)のみが必要です。したがって、次のようになります。

67.21.89.48 110
211.47.82.64 445

または、次のようになります。

67.21.89.48.110
211.47.82.64.445

IPとポートがどこにあるかを知っている限り、それは実際には問題ではありません。

私はこのようなものを使用しています:

cut -d'.' -f1-4,9 < file.txt

しかし、それは一定の期間でのみ機能します。代わりに後ろからカットする方法はありますか?

4

2 に答える 2

3

詳細形式:

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桁」になります。

あなたが本当に詳細志向であるならば、あなたは数の範囲をより正確に制限することさえできます、しかしそれはおそらくそれの価値がありません。これは正規表現処理の一般的な機能です。悪意のある人があなたに投げかける可能性のあるすべてのバリエーションを必ずしも処理することなく、手元の仕事に十分なものを作成します。あなたは何をすべきかについて判断を下さなければなりません。

于 2012-04-24T21:42:59.273 に答える
2

ジョナサンがコメントで指摘しているcutように、必要な列の数が異なる可能性があるため、使用は非常に複雑になります。

これがの例ですsed

$ echo "67.21.89.48.1623 139.91.131.115.110
211.47.82.64 139.91.134.123.445" | sed -r 's/^(([0-9]{1,3}\.){3}[0-9]{1,3})(.*)\.([0-9]{1,4})$/\1 \4/'
67.21.89.48 110
211.47.82.64 445

次のように実行できます。

sed -r 's/^(([0-9]{1,3}\.){3}[0-9]{1,3})(.*)\.([0-9]{1,4})$/\1 \4/' logfile.txt

[0-9]{1,3}\.){3}[0-9]{1,3}おそらくIPアドレスの不完全な正規表現ですが、私が思いついたのはこれが最初でした。よりスマートなものに置き換えることができます。たぶん、ドットの間にあるものをチェックする必要はなく、4番目の期間の前と最後の期間の後にすべてを取得するだけです。

于 2012-04-24T21:53:28.193 に答える