Linuxでgrepコマンドを使用する方法

Linuxgrepコマンドは、複数のファイルからの一致する行を表示する文字列およびパターンマッチングユーティリティです。また、他のコマンドからのパイプ出力でも機能します。その方法をお見せします。

grepの裏話

このgrepコマンドは、3つの理由でLinuxとUnixのサークルで有名です。まず、それは非常に便利です。第二に、豊富なオプションは圧倒される可能性があります。第三に、それは特定のニーズを満たすために一晩で書かれました。最初の2つは大成功です。3番目はわずかにずれています。

Ken Thompsonは、edエディター(ee-deeと発音)から正規表現検索機能を抽出し、テキストファイルを検索するための小さなプログラムを作成しました。ベル研究所の彼の部門長であるダグ・マキルロイはトンプソンに近づき、彼の同僚の一人であるリー・マクマホンが直面している問題について説明しました。

マクマホンは、テキスト分析を通じてフェデラリストの論文の著者を特定しようとしていました。彼は、テキストファイル内のフレーズや文字列を検索できるツールを必要としていました。トンプソンはその夜約1時間かけて、自分のツールを他の人が使用できる一般的なユーティリティにして、名前をに変更しましたgrep。彼はedコマンド文字列から名前を取りましたg/re/p。これは「グローバル正規表現検索」と解釈されます。

トンプソンがブライアン・カーニハンとの誕生について話しているのを見ることができgrepます。

grepを使用した簡単な検索

ファイル内の文字列を検索するには、コマンドラインで検索語とファイル名を渡します。

一致する行が表示されます。この場合、それは単一の行です。一致するテキストが強調表示されます。これは、ほとんどのディストリビューションgrepでエイリアスが次のようになっているためです。

エイリアスgrep = "grep --colour = auto"

一致する行が複数ある結果を見てみましょう。アプリケーションログファイルで「平均」という単語を探します。ログファイルで単語が小文字であるかどうかを思い出せないため、(大文字と小文字を-i 区別しない)オプションを使用します。

grep-i平均オタク-1.log

一致するすべての行が表示され、一致するテキストがそれぞれで強調表示されます。

-v(一致の反転)オプションを使用して、一致しない行を表示できます。

grep -v Mem geek-1.log

これらは一致しない行であるため、強調表示はありません。

grep完全に沈黙させることができます。結果は、からの戻り値としてシェルに渡されますgrep。ゼロ手段ストリングの結果は見出し、一つの手段の結果はそれがなかったが見つかりました。$?特別なパラメータを使用してリターンコードを確認でき  ます。

grep-q平均オタク-1.log
エコー$?
grep -q howtogeek geek-1.log
エコー$?

grepを使用した再帰検索

ネストされたディレクトリとサブディレクトリを検索するには、-r(再帰的)オプションを使用します。コマンドラインでファイル名を指定しないことに注意してください。パスを指定する必要があります。ここでは、現在のディレクトリ「。」を検索しています。およびサブディレクトリ:

grep -r -imemfree。

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

(再帰的逆参照)オプションgrep  を使用して、シンボリックリンクをたどることができ -Rます。このディレクトリには、と呼ばれるシンボリックリンクがありlogs-folderます。を指し/home/dave/logsます。

ls -llogs-folder

-R(再帰逆参照)オプションを使用して、最後の検索を繰り返しましょう 。

grep -R -imemfree。

シンボリックリンクがたどられ、それが指すディレクトリも検索されgrepます。

単語全体を検索する

デフォルトでgrepは、検索ターゲットが別の文字列内を含むその行のどこかに表示される場合、その行に一致します。この例を見てください。「無料」という単語を検索します。

grep -i free geek-1.log

結果は、文字列「free」を含む行ですが、個別の単語ではありません。これらは「MemFree」という文字列の一部です。

grep 個別の「単語」のみを強制的に一致させるには、-w(word regexp)オプションを使用します。

grep -w -i free geek-1.log
エコー$?

今回は、検索語「free」が別の単語としてファイルに表示されないため、結果はありません。

複数の検索用語の使用

-E(拡張正規表現)オプションは、複数の単語を検索することができます。(この-Eオプションは、の非推奨egrepバージョンを置き換えますgrep。)

このコマンドは、「average」と「memfree」の2つの検索語を検索します。

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

検索語ごとに、一致するすべての行が表示されます。

必ずしも単語全体ではない複数の用語を検索することもできますが、単語全体にすることもできます。

-e(パターン)オプションは、コマンドラインで複数の検索語を使用することができます。正規表現ブラケット機能を使用して検索パターンを作成しています。grep角かっこ「[]」内に含まれる文字のいずれかに一致するように指示します。これはgrep、検索時に「kB」または「KB」のいずれかに一致することを意味します。

両方の文字列が一致しており、実際、一部の行には両方の文字列が含まれています。

正確に一致する線

-x(ライン正規表現)が行のみ一致する行全体が検索用語と一致します。ログファイルに1回だけ表示されることがわかっている日付とタイムスタンプを検索してみましょう。

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

一致する1行が検索され、表示されます。

その反対は、一致しない行のみを表示することです。これは、構成ファイルを確認するときに役立ちます。コメントは素晴らしいですが、それらすべての中で実際の設定を見つけるのが難しい場合があります。ここだ/etc/sudoersファイル:

次のようにコメント行を効果的に除外できます。

sudo grep -v "#" / etc / sudoers

これは解析がはるかに簡単です。

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

一致する行全体ではなく、一致するテキストだけを表示したい場合があります。-o(のみマッチング)オプションは、まさにそれを行います。

grep -o MemFree geek-1.log

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

grepでカウントする

grepテキストだけでなく、数値情報も提供できます。私grepたちはさまざまな方法で私たちを数えることができます。検索語がファイルに何回出現するかを知りたい場合は、-c(カウント)オプションを使用できます。

grep-c平均オタク-1.log

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

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

grep -n Jan geek-1.log

一致する各行の行番号は、行の先頭に表示されます。

表示される結果の数を減らすには、-m(最大カウント)オプションを使用します。出力を5つの一致する行に制限します。

grep -m5 -n Jan geek-1.log

コンテキストの追加

一致する行ごとにいくつかの追加の行(場合によっては一致しない行)を表示できると便利なことがよくあります。一致した行のどれがあなたが興味を持っているものであるかを区別するのに役立ちます。

一致する行の後にいくつかの行を表示するには、-A(コンテキストの後)オプションを使用します。この例では、次の3行を要求しています。

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

一致する行の前からいくつかの行を表示するには、-B(前のコンテキスト)オプションを使用します。

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

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

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

一致するファイルの表示

検索語を含むファイルの名前を表示するには、-l (一致するファイル)オプションを使用します。sl.hヘッダーファイルへの参照が含まれているCソースコードファイルを見つけるには、次のコマンドを使用します。

grep -l "sl.h" * .c

一致する行ではなく、ファイル名がリストされます。

そしてもちろん、検索語を含まないファイルを探すこともできます。-L(試合のないファイル)オプションは、まさにそれを行います。

grep -L "sl.h" * .c

行の開始と終了

grep行の先頭または末尾にある一致のみを表示するように強制できます。「^」正規表現演算子は、行の先頭に一致します。ログファイル内の実質的にすべての行にスペースが含まれますが、最初の文字としてスペースがある行を検索します。

grep "^" geek-1.log

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

行の終わりに一致させるには、「$」正規表現演算子を使用します。「00」で終わる行を検索します。

grep "00 $" geek-1.log

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

grepでパイプを使用する

もちろん、入力をgrepにパイプし、出力grepを別のプログラムにgrepパイプし、パイプチェーンの真ん中に置くことができます。

Cソースコードファイル内の文字列「ExtractParameters」のすべての出現を確認したいとします。かなりの数になることがわかっているので、出力をless次の場所にパイプします。

grep "ExtractParameters" * .c | もっと少なく

出力はに表示されlessます。

これにより、ファイルリストをページングして、less's検索機能を使用できます。

我々は、パイプから出力した場合grepwc、使い-l(ライン)オプションを、私たちは「ExtractParameters」を含むソースコードファイルの行数をカウントすることができます。(grep-c(count)オプションを使用してこれを実現できますが、これはからの配管を示すための優れた方法ですgrep。)

grep "ExtractParameters" * .c | wc -l

次のコマンドでは、からの出力をlsgrepパイプし、からの出力をgrepにパイプしますsort。現在のディレクトリにあるファイルを一覧表示し、「Aug」という文字列が含まれているファイルを選択して、ファイルサイズで並べ替えています。

ls -l | grep「8月」| + 4nを並べ替え

それを分解しましょう:

  • ls -l:を使用してファイルの長い形式のリストを実行しますls
  • grep“ Aug”lsリストから“ Aug”を含む行を選択します。これにより、名前に「Aug」が含まれるファイルも検索されることに注意してください。
  • sort + 4n:4番目の列(filesize)でgrepからの出力をソートします。

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

関連:Linuxでパイプを使用する方法

grep:コマンドを減らし、味方を増やす

grep自由に使える素晴らしいツールです。それは1974年にさかのぼりますが、それが何をする必要があるので、今でも力強く進んでいます。

カップリングgrepいくつかの正規表現-FUでは本当に次のレベルにそれを取ります。

関連:基本的な正規表現を使用して検索を改善し、時間を節約する方法