N2SM Intern Blog

学習したことをまとめていくブログです!

grepコマンドで作業効率UPを図る

grepとは文字列を検索するコマンドのことです。目的のファイルを探したりする上でgrepを使いこなす必要が出てきました。grepを使いこなすことで作業効率はぐんと上がるらしいのでこれを機に勉強してみました。
環境はLinuxで行いました。

テキストファイルの内容を検索する

ファイル中にある特定の文字列を探したい時があります。ここでは例としてホームディレクトリ直下に以下の内容のtest.txtを作ります。

abcdefghijklmnopqrstuvwxyz
0123456789
qawsedrftgyhujikolp;@
azsxdcfvgbhnjmk,l.;/:]
5line
6line
7line
8line
9line

ホームディレクトリ内で次のコマンドを打つと

grep abc test.txt 

以下の結果が出力されます。

abcdefghijklmnopqrstuvwxyz

このコマンドの意味はtest.txtからabcの文字列を見つけてその行を出力するとなります。1行目にabcを含んだ文字列があったので、その行が出力されました。

次です。grep複数のファイルから一気に文字列を検索できます。試しにtest2.txtとtest3.txtを作成。

test2.txt

zyxwvutsrqponmlkjihgfedcba
0123456789
qawsedrftgyhujikolp;@
azsxdcfvgbhnjmk,l.;/:]

test3.txt

abcdefghijklmnopqrstuvwxyz
9876543210
qawsedrftgyhujikolp;@
azsxdcfvgbhnjmk,l.;/:]

以下のコマンドを打つと

grep abc test* 

次の結果が得られます。

test.txt:abcdefghijklmnopqrstuvwxyz
test3.txt:abcdefghijklmnopqrstuvwxyz

複数のファイルの中身のabcを検索し、出力しています。「:(コロン)」の前はファイル名です。test*の「*」は任意の文字列を表しています。つまりtestやtest2、test3、testhogeなどのファイル名が検索対象となっています。ここで使われている「*」はワイルドカードと言って、他にも様々なワイルドカードが存在します。ワイルドカードについては http://itpro.nikkeibp.co.jp/article/COLUMN/20070514/270907/?ST=oss が詳しいです。

「|(パイプ)」を使ってコマンドの出力から検索する

パイプを使うことでコマンドの出力内容に対して検索をすることができます。次のコマンドを打ってみます。

ls | grep test

以下が出力されます。

test.txt
test2.txt
test3.txt

パイプは左側のコマンドの出力を右側のコマンド入力に渡します。つまりlsの出力であるファイル名やディレクトリ名をgrepの入力として渡し、その中からtestを含むファイル(ディレクトリ)名を検索しています。パイプを使えば色々なコマンドの合わせ技ができそうですね。

パイプの便利な合わせ技としてfindコマンドを使ったものがあります。findコマンドはファイルやディレクトリを検索するコマンドです。詳しい使い方やオプションは
http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230777/?ST=oss
を参照してください。
例えば次のコマンドを打ってみます。

find . -name "*.*" | xargs grep hoge

このコマンドの意味は"カレントディレクトリ"以下のサブディレクトリから "*.*"という形式の名前のファイルを探し、その出力をgrepのパラメータとして受け取り"hoge"と書かれてある行を探し出力するとなります。
(xargsの使い方は
http://itpro.nikkeibp.co.jp/article/COLUMN/20140331/547143/?ST=oss )

要はファイルをfindで探してからそのファイルの中身をgrepで検索するということです。ディレクトリの中を再帰的に探してくれるfindとgrepの合わせ技は強力ですね。

便利なオプション

grepコマンドのオプションについては http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230820/?ST=oss に詳しく記載があります。試しにAオプションとBオプションを使ってみました。以下のコマンドを入力。

grep -B 1 -A 2 7line test.txt

出力

6line
7line
8line
9line

検索した7lineの前1列、後ろ2列も余分に表示されています。Bの引数に指定した数だけ後ろの行が表示され、Aの引数に指定した数だけ前の行が表示されています。検索した文字列の近くの行に何が書かれてあるか知りたい時に便利ですね。

他にも色々・・・。

以上、grepコマンドの主な機能でした。これ以外に使い方はいくらでもありそうです。しっかり使いこなして日頃の作業効率を上げていきたいところですね。