Linux/UNIXにおけるGrepコマンド
LinuxやUnixシステムでは、Grepというコマンドが使われています。Grepは「グローバル正規表現プリント」という意味で、正規表現を使用してテキストファイルを検索およびマッチングするためのコマンドです。さらに、このコマンドはすべてのLinuxディストリビューションに事前にインストールされています。このガイドでは、一般的なgrepコマンドの使用方法といくつかの例を見ていきます。
LinuxでのGrepコマンド
Grepコマンドは、テキストファイル内の正規表現または文字列を検索するために使用できます。これを実証するために、welcome.txtというテキストファイルを作成し、以下のようにコンテンツを追加しましょう。
Welcome to Linux !
Linux is a free and opensource Operating system that is mostly used by
developers and in production servers for hosting crucial components such as web
and database servers. Linux has also made a name for itself in PCs.
Beginners looking to experiment with Linux can get started with friendlier linux
distributions such as Ubuntu, Mint, Fedora and Elementary OS.
素晴らしい!今では、いくつかのgrepコマンドを実行し、出力を操作して望む結果を得る準備が整いました。ファイル内の文字列を検索するためには、以下の構文でコマンドを実行してください。
$ grep "string" file name
または
$ filename grep "string"
こんな感じで日本語で言ってください:
例文:
$ grep "Linux" welcome.txt
$ grep "string" /path/to/file
–colorオプションを使用してGrepの結果に色を付ける。
もし検索文字列やパターンが他のテキストと異なる色で表示されないシステムで作業している場合、–colorオプションを使用して結果を目立たせるようにしてください。例えば、
$ grep --color "free and opensource" welcome.txt
すべてのディレクトリで再帰的に文字列を検索する。
「-r」フラグを使用して、現在のディレクトリおよびサブディレクトリ内で文字列を検索したい場合は、下記のように検索してください。
$ grep -r "string-name" *
たとえば
$ grep -r "linux" *
大文字と小文字の区別を無視する。
上記の例では、検索結果が希望通りのものを提供してくれました。なぜならば文字列「Linux」が大文字で指定され、ファイル内にも大文字で存在していたからです。さて、次は同じ文字列を小文字で検索してみましょう。
$ grep "linux" file name
出力には何もありませんよね?これは、最初の文字が小文字であるため、grepが文字列「linux」を見つけることができずに一致しませんでした。大文字と小文字を無視するには、-iフラグを使用して、以下のコマンドを実行してください。
$ grep -i "linux" welcome.txt
「-c オプションで、文字列が一致する行の数を数えてください。」
指定した文字列パターンが出現または存在する全行数をカウントするために、以下のコマンドを実行してください。
$ grep -c "Linux" welcome.txt
出力を反転するためにGrepを使用する。
Grepの出力を反転させるには、-vフラグを使用します。-vオプションは、grepに対して、指定された表現と一致しないすべての行を表示するよう指示します。-vオプションは、grepの出力を反転させるため、一致する行ではなく、一致しないすべての行を表示します。ファイルに戻り、表示される行番号を指定しましょう。VimエディタでESCキーを押し、コロンを入力します。
set nu
$ grep -v "Linux" welcome.txt
検索パターンを含む行には-nオプションを使用して行番号を付ける
文字列パターンが一致する行に行番号を付けるために、-nオプションを使ってください。
$ grep -n "Linux" welcome.txt
-wオプションを使用して、完全一致する単語を検索してください。
その場合、-wフラグを指定すると、表示される単語と完全に一致する行を検索します。
$ grep -w "opensource" welcome.txt
$ grep -w "open" welcome.txt
パターンではなく、正確な単語を検索しているため、結果は返されません!
grepを使用してパイプを使う。
grepコマンドは、パイプと組み合わせて特定の出力を取得するために使用することができます。例えば、Ubuntuシステムに特定のパッケージがインストールされているかどうかを知りたい場合は、実行してください。
$ dpkg -L | grep "package-name"
例えば、OpenSSHがシステムにインストールされているかどうかを調べるために、dpkg -lコマンドをgrepにパイプして表示すると、次のようになります。
$ dpkg -L | grep -i "openssh"
検索パターンの前後に行数を表示する場合、パイプを使用します。
以下のように、検索文字列の前または後に表示される行の数を指定するために、-Aまたは-Bを使用することができます。-Aフラグは検索文字列の後に表示される行を示し、-Bは検索文字列の前に表示される出力を表示します。例えば、
$ ifconfig | grep -A 4 ens3
$ ifconfig | grep -B 4 ether
正規表現(REGEX)を使用してgrepを使う。
「REGEX」という用語は、REGular EXpressionの略です。REGEXは、パターンに一致する文字列のシーケンスです。以下にいくつかの例を示します。
^ Matches characters at the beginning of a line
$ Matches characters at the end of a line
"." Matches any character
[a-z] Matches any characters between A and Z
[^ ..] Matches anything apart from what is contained in the brackets
ある特定の文字で始まる行を印刷するための構文は次の通りです。
grep ^character file_name
例えば、私たちのwelcome.txtファイルの先頭が「d」で始まる行を表示するために、次のように実行します。
$ grep ^d welcome.txt
$ grep x$ welcome.txt
より多くのGrepオプションを使用して支援を受ける
もしGrepコマンドの使用方法についてもっと学びたい場合は、以下のコマンドを実行して、コマンドと一緒に使用できる他のフラグやオプションの一部を事前に確認することができます。
$ grep --help