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