\r\n\r\n

linuxでのgrepコマンドの使い方

linux の grep コマンドは、複数のファイルから一致する行を表示する文字列およびパターンマッチング ユーティリティです。また、他のコマンドからのパイプ出力も扱うことができます。その方法を紹介します...

Linux の grep コマンドは、複数のファイルから一致する行を表示する文字列およびパ ターンマッチングのユーティリティです。また、他のコマンドからのパイプ出力も扱うことができます。その方法を紹介します。

Grappの誕生秘話

grepコマンドは、LinuxやUnixのコミュニティでよく知られていますが、その理由は3つあります。まず、とても便利です。第二に、豊富な選択肢に圧倒されることがあります。そして3つ目は、特定のニーズに合わせて一夜漬けで書かれていることです。最初の2つは「バーン」、3つ目は「バーン」である。

kenthompsonはedエディタ(発音はイーディー)の正規表現検索機能を使って、テキストファイルを検索する小さなプログラムを自作しました。ベル研究所のダグ・マシルロイ部長は、同僚のリー・マクマホン氏が直面している問題について、トンプソン氏に話を持ちかけた。

マクマホンは、テキスト分析によって連邦主義論文の著者を特定しようとした。彼は、テキストファイルの中のフレーズや文字列を検索できるツールを必要としていた。その晩、Thompsonは約1時間かけて自分のツールを他の人にも使える汎用ツールに変え、edコマンドの文字列g/re/p(訳注:「グローバル正規表現検索」)からgrepと改名したのです。

トンプソンとブライアン・カーニガンがGrappの誕生について語る様子がご覧いただけます。

grepによる簡易検索

ファイル中の文字列を検索するには、検索語とファイル名をコマンドラインで次のように渡す。

grep dave /etc/password in a terminal widnow

一致する行が表示されます。この場合、1本の線になります。一致したテキストはハイライト表示されます。これは、ほとんどのディストリビューションで、grepのエイリアスが

alias grep='grep --colour=auto'

複数の一致する行がある場合の結果を見てみましょう。アプリケーションのログファイルから "Average "という単語を探します。ログファイルでは小文字かどうか思い出せないので、-i(大文字小文字を無視する)オプションを使用することにします。

grep -i Average geek-1.log

一致する各行が表示され、一致するテキストがハイライト表示されます。

マッチしていない行を表示するために、-v (reverse match) オプションを使用することができます。

grep -v Mem geek-1.log

不一致の行であるため、ハイライトされていない。

grepを完全に沈黙させることができます。結果は、grepの戻り値としてシェルに渡される。結果が0であれば、その文字列が見つかったことを意味し、resultであれば、その文字列が見つからなかったことを意味する。リターンコードを確認するために$を使用することができる?特殊なパラメータ。

grep -q average geek-1.log echo $? grep -q howtogeek geek-1.log echo $?

グレープリカーシブサーチ

ネストしたディレクトリやサブディレクトリを検索するには、-r (recursive) オプションを使用します。なお、コマンドラインではファイル名は提供されず、パスを提供する必要があります。カレントディレクトリ "." 内を検索します。とサブディレクトリが検索されます。

grep -r -i memfree .

出力には、一致した各行のディレクトリとファイル名が含まれます。

R (recursive dereference)オプションで、grepにシンボリックリンクをたどらせることができます。このディレクトリの中にlogsフォルダというシンボリックリンクがあります。home/dave/logsを指しています。

ls -l logs-folder

最後の検索を-R (recursive dereference)オプション付きで繰り返してみよう。

grep -R -i memfree .

シンボリックリンクが続き、それが指し示すディレクトリもgrepで検索されます。

単語全体を検索する

デフォルトでは、検索対象が他の文字列を含む行のどこかに現れると、grepはその行にマッチします。この例を見てください。"フリー "という言葉を検索したい。

grep -i free geek-1.log

その結果、"free "という文字列を含む行ができますが、これらは別々の単語ではなく、"MemFree "という文字列の一部になっています。

grepが個々の「単語」のみにマッチするようにするには、-w(word regexp)オプションを使用します。

grep -w -i free geek-1.log echo $?

今回は、検索語「無料」が文書内に独立した単語として表示されないため、検索結果はありません。

複数の検索キーワードを使用する

E (extended regexp) オプションを使用すると、複数の単語を検索することができます。(Eオプションはegrepバージョンのgrepを置き換えますが、これは推奨されません)。

このコマンドは、"average "と "memfree "の2つの検索キーワードで検索する。

grep -E -w -i "average|memfree" geek-1.log

各検索項目に対して、一致するすべての行が表示されます。

また、必ずしも単語全体ではなく、複数の単語を検索することも可能です。

e (patterns)オプションは、コマンドラインで複数の検索語を使用することができます。正規表現の括弧の機能を使って、検索パターンを作成しています。これは、大括弧「[]」に含まれる文字のいずれかにマッチするよう、grepに指示します。つまり、grepは検索時に "kB "または "kB "にマッチします。

両方の文字列が一致し、実際、いくつかの行には両方が含まれています。

007Ys3FFgy1gp5ixcyyu3j30hy0amgmy

精密なマッチング行

-x (line regexp) は、検索語にマッチする行全体にマッチします。ログファイルに一度だけ現れる日付とタイムスタンプを検索してみよう。

grep -x "20-Jan--06 15:24:35" geek-1.log

一致する1行を検索して表示する。

その代わり、一致しない行だけが表示されます。プロフィールを見るときにとても便利です。コメントもいいのですが、すべてのコメントから実際の設定を見抜くのは難しい場合があります。以下は、/etc/sudoers ファイルです。

以下のコメント行を効果的にフィルタリングすることができます。

sudo grep -v "#" /etc/sudoers

この方が分析がしやすい。

一致するテキストのみを表示する

マッチした行全体を表示せず、マッチしたテキストだけを表示したい場合がある。-o (match only) オプションはまさにそれを行う。

grep -o MemFree geek-1.log

一致する行全体ではなく、検索項目に一致するテキストのみを表示するように縮小表示されます。

grepでカウントする

grepは単なるテキストだけでなく、デジタル情報も提供することができます。私たちは、grepをさまざまな方法で使って、自分たちにとって価値のあるものにすることができます。ある検索語がファイル中に何回現れるかを知りたい場合は、-c(count)オプションを使うことができる。

grep -c average geek-1.log

grepは、この検索語がこのファイルに240回出現していることを報告します。

n (行番号) オプションを使用すると、一致した各行の行番号を grep に表示させることができます。

grep -n Jan geek-1.log

一致した行の行番号は、行頭に表示されます。

表示される結果の数を減らすには、-m (max count) オプションを使用します。ここでは、一致する5行に出力を制限しています。

grep -m5 -n Jan geek-1.log

コンテキストの追加

一致する各行に対して、さらにいくつかの行(不一致の行かもしれない)を見ることができると便利なことが多いのです。どのマッチングラインに興味があるのか、見分けることができるようになります。

マッチした行の後に何行か表示させるには、-A (after context) オプションを使用します。この例では、3つの行が必要です。

grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log

一致する行の前にある行を見るには、-B (context before) オプションを使用します。

grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log

一致した行の前後の行を含めるには、-C (context) オプションを使用します。

grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log

一致するファイルを表示する

検索語を含むファイル名を見るには、-l (files with matching terms) オプションを使用します。sl.hヘッダーファイルへの参照を含むCソースファイルを調べるには、次のコマンドを使用します。

grep -l "sl.h" *.c

は一致する行ではなく、ファイル名をリストアップします。

もちろん、検索語を含まないファイルを探すこともできる。L (files without match)オプションは、まさにそれを実現するものです。

grep -L "sl.h" *.c

線の始点と終点

行頭または行末のマッチのみを表示するように grep を強制することができます。正規表現演算子"^"は、行頭にマッチします。ログファイル内のほぼすべての行にスペースが含まれますが、最初の文字がスペースである行を検索します。

grep "^ " geek-1.log

行頭の文字にスペースがある行は、表示されます。

行末にマッチさせるには、正規表現演算子 "$" を使用します。"00" で終わる行を検索したい場合

grep "00$" geek-1.log

ディスプレイには、"00 "を最後の文字とする行が表示されます。

grepでパイプを使う

もちろん、入力をgrepにパイプし、grepの出力を別のプログラムにパイプし、パイプチェーンの途中でgrepをネストすることも可能です。

例えば、C言語ソースファイル中の "ExtractParameters "という文字列の出現回数をすべて確認したいとします。多くなることが分かっているので、パイプを使って出力を小さくしています。

grep "ExtractParameters" *.c | less

出力はより少ない単位で表現されます。

これにより、文書一覧の閲覧や、少ない検索ツールの利用が可能になります。

grepの出力をwcにパイプし、-l(lines)オプションを使用すると、ソースファイルの中で「ExtractParameters」を含む行数をカウントすることができます。(これを行うには grep-c (count) オプションを使用することもできますが、これは grep の外側でパイピングを実演する簡潔な方法です)。

grep "ExtractParameters" *.c | wc -l

次のコマンドは、lsからgrepに出力し、grepの出力をsortにパイプするというものです。カレントディレクトリのファイルをリストアップし、「Aug」という文字列を含むファイルを選択し、ファイルサイズでソートしているところです。

ls -l | grep "Aug" | sort +4n

分解してみよう。

  • ls-l: ls を使って実行するファイルの長い形式のリストです。
  • grep "Aug": lsのリストから "Aug "を含む行を選択します。なお、ファイル名に "Aug "が含まれるファイルも検索されます。
  • sort+4n: grep出力の4列目(ファイルサイズ)をソートします。

8月に変更されたすべてのファイル(年に関係なく)をファイルサイズの昇順にソートしたリストを得た。

関連:Linuxでのパイプの使い方

グラップ:コマンドを減らして味方にする

grepはいつでも使えるとても良いツールです。1974年までさかのぼりますが、今でも私たちが必要とするパワフルさは健在で、これ以上のものはありません。

grepといくつかの正規表現を組み合わせることで、新しいレベルに到達することができます。

関連:基本的な正規表現の使い方で、より良い検索と時間短縮を実現する方法

あなたが興味を持っているかもしれない記事

匿名者
匿名者

0 件の投稿

作家リスト

  1. admin 0 投稿
  2. 匿名者 0 投稿

おすすめ