grepでIPアドレスを抽出するコマンド
grepでIPアドレスを抽出したい時は、以下コマンドで抽出出来ます。 (厳密にいうとIPアドレスの範囲外の数字もヒットしてしまう。後述)
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' access_log-20151206 -o
bashは\dは使えないため[0-9]で数字1文字を表します。
{1,3}で直前の[0-9]が1文字~3文字であることを指定します。
-oオプションでヒットした個所を抜き出します。
一行に複数ヒットした個所があった場合、ヒットごとに1行ずつ抽出してくれます。
ヒットした数を数えたい時は以下。
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' access_log-20151206 -o |wc -l
今回に限った話ではないですが、grepの-oオプションなしだと1行に複数ヒットがある場合は ヒットした数を正しくカウントできません(grepはヒットした"行"を表示するため1行にヒットが2か所ある場合に正しく数を数えられない) 。純粋に何個ヒットがあるかを知りたい時はgrepに-oオプションをつけるようにしましょう。-oオプションはヒットごとに一行ずつ抽出するため、ヒット数と行数が一致し正確に数えることができます。
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' access_log-20151206 |wc -l
厳密にIPアドレスのみを抽出する
最初の正規表現は3桁までの数字の組み4つが3つの.で区切られたパターンをヒットします。
なので、以下のようなパターンはIPアドレスの書式から外れておりますが、ヒットしてしまいます。
000.000.000.000 999.999.999.999
そこでIPだけ抽出するようしました。
以下コマンドでIPの書式であるもののみを抽出できます。
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' test.txt -o | while read line;do ipcalc -sc $line && echo $line;done
ipcalcコマンドでIPかどうかを判定し、IPの場合はechoで表示しています。
実行例:
# cat test.txt 255.255.255.255 999.999.999.999 111.111.000.111 000.000.000.111 111.111.111.111 # grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' test.txt -o | while read line;do ipcalc -sc $line && echo $line;done 255.255.255.255 111.111.111.111