conf t

インフラエンジニアのメモ

grepでIPアドレスを抽出する

grepIPアドレスを抽出しましょう。

grepIPアドレスを抽出するコマンド

grepIPアドレスを抽出したい時は、以下コマンドで抽出出来ます。 (厳密にいうと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