grep で単語単位で一致した行を抽出する方法

grepで検索する単語で一致した行を抽出する時に、以下のようなテキストファイルがある場合、「192.168.0.1」でgrepすると「192.168.0.1、192.168.0.101」等の行も抽出されます

$ cat test.txt
192.168.0.1 - - [04/Jun/2021:20:44 +0900] "GET / HTTP/1.1" 400 
192.168.0.21 - - [04/Jun/2021:20:44 +0900] "GET / HTTP/1.1" 400 
192.168.0.101 - - [04/Jun/2021:20:44 +0900] "GET / HTTP/1.1" 400 
192.168.0.12 - - [04/Jun/2021:20:44 +0900] "GET / HTTP/1.1" 400 
192.168.0.13 - - [04/Jun/2021:20:44 +0900] "GET / HTTP/1.1" 400

「192.168.0.1」でgrepすると、「192.168.0.1」で始める行が表示されます。

$ grep 192.168.0.1 test.txt 
192.168.0.1 - - [04/Jun/2021:20:44 +0900] "GET / HTTP/1.1" 400 
192.168.0.101 - - [04/Jun/2021:20:44 +0900] "GET / HTTP/1.1" 400 
192.168.0.12 - - [04/Jun/2021:20:44 +0900] "GET / HTTP/1.1" 400 
192.168.0.13 - - [04/Jun/2021:20:44 +0900] "GET / HTTP/1.1" 400

「192.168.0.1」の単語のみ行を抽出するには「-w」のオプションを利用します。manページでは以下のように説明されています

-w–word-regexp

マッチする部分が完全な単語を形成するときにのみ、その行を選択します。 次の条件を検査します。パターンにマッチする部分文字列は、行頭にあるか、 さもなければ、単語構成文字以外の文字の直後になければならない。 また、その部分文字列は、行末にあるか、さもなければ、単語構成文字以外の文字の 直前になければならない (訳注: ここで「完全な単語を形成する」というのは、 それが空白、改行、引用符、句読点などで前後を区切られた文字列だ ということです。たとえば、文字列「A word with you」中の word という 部分文字列は完全な単語ですが、文字列「two words」中の部分文字列 word は 完全な単語を形成しません)。 単語構成文字とは、アルファベット、数字、アンダスコアです (訳注: 実は漢字や仮名も単語構成文字として扱われます)。 このオプションは、 -x が同時に指定されたときには無効になります。

実際に「-w」のオプションを使用してgrepを実行します

$ grep -w 192.168.0.1 test.txt 
192.168.0.1 - - [04/Jun/2021:20:44 +0900] "GET / HTTP/1.1" 400

 

スポンサーリンク