grepコマンド。文字列検索やコマンドの結果のフィルタ、プロセス確認の方法を解説
コマンドライン操作に慣れるために、unixのコマンドをひとつずつ紹介していくシリーズですが、今回はgrepコマンドです。grepコマンドは文字列検索を行うことが可能で指定したファイル内で任意の文字列が存在するかを調べることができます。
基本の使い方
基本の使い方は次のようなものです。
grep hoge hoge.txt
grep 検索したい文字列 検索対象ファイル
grepコマンドではこのようにしてファイル内の文字列を検索することができます。また grepコマンドではワイルドカードを使ってカレントディレクトリ内のファイルから検索することも可能です。
grep hoge *
grep hoge *.rb
grep fuga *.js
下記は、カレントディレクトリの中から拡張子.txtのものの中でファイルの中にhogeという文字列があるかどうかを 検索しています。
$ ls -ltr
total 32
drwxr-xr-x 5 admin staff 160 11 13 08:22 dir1
-rw-r--r-- 1 admin staff 5 11 15 09:10 hoge.txt
-rw-r--r-- 1 admin staff 5 11 15 09:11 fuga.txt
-rw-r--r-- 1 admin staff 4 11 15 09:11 bar.txt
-rw-r--r-- 1 admin staff 25 11 15 09:12 HelloWorld.js
$ grep hoge *.txt
hoge.txt:hoge
例では、hoge.txt内の一行がヒットしていることがわかります。
コマンド結果をフィルターする
grepコマンドはパイプとほかのコマンドを組み合わせることでコマンド結果をフィルターすることができます。 もっと詳しく説明するとgrepコマンドは与えられた文字列と一致する行を出力します。そのため、ファイルの一覧がgrepコマンドに与えられると検索文字列に合致する行だけ出力され、結果的にフィルタリングを行うことができます。 ファイル名検索
$ls -ltr | grep hoge
-rw-r--r-- 1 admin staff 5 11 15 09:10 hoge.txt
cat結果の絞り込み
$ cat hoge.txt
hogehoge
bar
hoge
fooooo
hoge
## hoge
$ cat hoge.txt | grep hoge
hogehoge
hoge
hoge
## hoge
プロセス検索
ps -ef | grep hoge | grep -v grep
psコマンドでは現在PC内で実行されているプロセスのリストを取得することができますが、コンピュータは単純にデスクトップを表示しているだけでも複数のプロセスが走っておりそれらの中から目的のプロセスを見つけるのはなかなか骨が折れます。そこで、実際の現場では目的のプロセスに含まれるであろう文字列でプロセスを検索して絞り込みを行います。例ではhogeという文字列で検索をおこなっています。
その他の使い方
grepコマンドには他にも様々な検索の仕方があります。 #### 正規表現検索
$ cat hoge.txt
fugafuga
hogehoge
bar
hoge
fooooo
hoge
## hoge
$ grep ^hoge hoge.txt
hogehoge
hoge
例の正規表現は行頭がhogeで始まるものを検索しています。
論理検索
こちらはegrepコマンドですが、egrepコマンドを使用すると、OR条件での検索ができます。例では、hogeあるいはfugaを含むファイルを検索しています。
$ egrep 'hoge|fuga' *.txt
fuga.txt:fuga
hoge.txt:fugafuga
hoge.txt:hogehoge
hoge.txt:hoge
hoge.txt: hoge
hoge.txt:## hoge
特定の文字を含まない
-vオプションをつけることで引数に与えた文字列を除外することができます。
grep -v hoge hoge.txt
AND検索
AND検索を行う時は|(パイプ)を繋げて検索します。
grep abc | grep def
まとめ
今回はgrepコマンドについて紹介しました。 後の方のコマンドはプラスアルファですが、最初に紹介した基本的な使い方、2つ目のパイプ、他コマンドとの組み合わせは覚えておくようにしましょう。
grepコマンドはコマンドライン操作の中でも頻出なこれが使えるようになるとコマンドライン操作の幅が広がります。今回紹介したようなコマンドは是非とも使いこなせるようになっておきましょう。