正規表現を使用してログからIPアドレスを解析します。

正規表現を使用してログからIPアドレスを解析します。

ログの多い大規模なnmapスキャンがあります。私はこれをIPリストに置き換えようとしています。

コマンドを実行すると、次のようなフィードバックを受け取ります。

Starting Nmap 7.25BETA2 ( https://nmap.org ) at 2017-03-17 21:27 EDT
Nmap scan report for 10.10.1.22
Host is up (0.13s latency).
PORT   STATE SERVICE
25/tcp open  smtp
MAC Address: 00:50:56:89:7C:D5 (VMware)

Nmap scan report for 10.0.1.72
Host is up (0.22s latency).
PORT   STATE SERVICE
25/tcp open  smtp
MAC Address: 00:50:56:89:55:06 (VMware)

次のコマンドを使用してIPリストのみを検索します。

nmap -n -p 25 10.11.1.1-254 --open | grep '\d{1,3}\.\d{1,3}\.\d\.\d{1,3}'

私もawkマッチを試しました。

nmap -n -p 25 10.11.1.1-254 --open | awk '/\d{1,3}\.\d{1,3}\.\d\.\d{1,3}/ { print $0 } '

パイプの右側にあるすべてのエントリを削除すると出力が表示され、スクラッチパッドの正規表現を使用してIPを正しくフィルタリングすることもできましたが、結果は返されませんでした。

私が逃している知識は何ですか?

答え1

このような場合は、まずNmapの正しい出力形式を使用する必要があります。エンマップGrepable 出力オプション-oG)は、「人間が読める」一般出力とは異なり、バージョン間で一貫して簡単に解析可能な形式で出力を生成します。ポート25が開いているすべてのシステムのリストを取得する方法は次のとおりです。

nmap -p 25 --open 10.11.1.1-254 -oG - | awk '/^Host/{print $2}'

Nmap は次のような行を生成します。

Host: 64.13.134.52 (scanme.nmap.org)    Ports: 25/open/tcp//smtp///

awkコマンドは、「Host」行の先頭に基づいて一致し、2番目のフィールド(IPアドレス)を印刷します。

答え2

\dPerl互換正規表現(PRCE)拡張です:あなたのバージョンgrep 可能-Pオプションでこれをサポートしてください。

grep -P '\d{1,3}\.\d{1,3}\.\d\.\d{1,3}'

それ以外の場合は10進数を使用できますが、中[0-9]括弧は基本正規表現のリテラルであるため、パターンを拡張または-Eエスケープする必要があります。

grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]\.[0-9]{1,3}'

または

grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\.[0-9]\{1,3\}'

関連情報