 |
The main aim is to document the hurdles that most of us face as UNIX/Linux/BSD sys admin in our day today life. |
LinuxやFreeBSDでよく利用されるコマンドのひとつにgrep(1)がある。ファイルから特定のキーワードを含んだ行を取り出したりコマンド出力から特定のキーワードを含んだ行を取り出すために利用されるコマンドで、正規表現と組み合わせて利用されることが多い。多機能で単一行表示のみならず、前後の行を含んだ出力も可能など、使いこなせるとさまざまな操作が可能。
LinuxディストリビューションにはGNU grepが含められていることが多い。*BSD系では最近BSDライセンスで実装されたgrep(1)への置き換えが進められているが、それら実装系でもGNU grepと互換性が確保されている。事実上、GNU grepの扱い方が分かっていれば同じコマンド操作で利用できる。
Regular Expressions In grep - nixCraftにおいてGNU grepコマンドの利用例が紹介されている。基本的だが役に立つ例がまとまっており、grep(1)コマンドをあまり使いこなせていない場合には参考になる資料といえる。紹介されている操作からいくつか抜粋して整理すると次のようになる。
| パスワードファイル/etc/passwdからユーザ名testuserの記載された行を取り出す |
| grep testuser /etc/passwd |
| パスワードファイル/etc/passwdからユーザ名testuserの記載された行を取り出す(大文字小文字は問わない) |
| grep -i testuser /etc/passwd |
| -iが大文字と小文字を区別しないためのオプション |
| パスワードファイル/etc/passwdからユーザ名testuser1またはtestuser2の記載された行を取り出す(大文字小文字は問わない) |
| grep -E -i 'testuser1|testuser2' /etc/passwd |
| -Eが正規表現を使うためのオプション。|がor指定。シェルにパイプラインとして解釈されないようにシングルクオーテーションでくくっている |
| パスワードファイル/etc/passwdからユーザ名testuserから始まっている行を取り出す |
| grep ^testuser /etc/passwd |
| ^が行頭を表す |
| ファイルfilenameでfooで終わっている行を取り出す |
| grep 'foo$' filename |
| $が行末を表す。シェルに変数指定と解釈されないようにシングルクオーテーションでくくっている |
| ファイルfilenameでfooのみが記載されている行を取り出す |
| grep '^foo$' filename |
| ファイルfilenameで空行を取り出す |
| grep '^$' filename |
| ファイルfilenameでTestuserまたはtestuserを含んだ行を取り出す |
| grep '[Tt]estuser' filename |
| []が使われた場合、[]の中の文字のどれかに一致する。シェルにグラブとして解釈されないようにシングルクオーテーションでくくっている |
| ファイルfilanameからtestuserの記載された行を取り出す(大文字小文字は問わない) |
| grep '[Tt][Ee][Ss][Tt][Uu][Ss][Ee][Rr]' filename |
| ファイルfilenameでTestuser0やtestuser2などを含んだ行を取り出す |
| grep '[Tt]estusear[0-9]' filename |
| [0-9]で[0123456789]と同じ。アルファベットなども同じように指定できる |
| ファイルfilenameからbutやbatなどbではじまりtで終わる3文字を含む行を取り出す |
| grep '\' filename
|
| \が単語の終わりを示す。.は任意の一文字を意味する |
| ファイルfilenameから2文字のみで構成された行を取り出す |
| grep '^..$' filename |
| ファイルfilenameから.数値ではじまっている行を取り出す |
| grep '^\.[0-9]' filename |
| \.でドットそのものを示す |
| ファイル/etc/hostsから192.168.1.254を含む行を取り出す |
| grep '192\.168\.1\.254' /etc/hosts |
| ファイルfilenameからIPアドレスを含む行を取り出す |
| grep -E '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' filename |
| [[:digit:]]は[0-9]を意味する。{1,3}は直前の指定が1以上3以下の繰り返しであることを示す |
| ファイルfilenameから--test--を含む行を取り出す |
| grep -e '--test--' filename |
| パターンが-から始まっている場合は-eオプションを指定して利用する |
grep(1)コマンドは便利で強力なツールだが、正規表現の使用方法になれないうちはわかりにくいツールでもある。Regular Expressions In grep - nixCraftでは簡単ではあるもののよく使う正規表現の利用例がまとまっており参考になる。