重要なポイント
- Linux の grep コマンドは、文字列およびパターンのマッチングに便利なツールであり、さまざまなオプションを使用してテキスト ファイルを検索できます。
- grep を使用すると、単純な検索、再帰的検索、単語全体の検索、複数の検索語の使用、一致のカウント、コンテキストの追加、さらに操作するために出力を他のコマンドにパイプすることもできます。
Linux の
grep
コマンドは、複数のファイルから一致する行を表示する文字列およびパターン マッチング ユーティリティです。他のコマンドからの
パイプされた出力
でも機能します。その方法をご紹介します。
Linux の Grep コマンド
grep
コマンドは、3 つの理由から Linux および
Unix
界隈で有名です。まず、非常に便利です。第二に、
オプションの豊富さが圧倒的になる可能性があります
。第三に、特定のニーズを満たすために一晩で書かれたということです。最初の 2 つは素晴らしいです。 3番目はわずかにずれています。
Ken Thompson は
、
ed
エディター (
イーディーと発音します
) から
正規表現
検索機能を抽出し、テキスト ファイルを検索するための小さなプログラムを自分用に作成しました。
ベル研究所
の部門長
ダグ・マキロイは
トンプソンに近づき、同僚の
リー・マクマホン
が直面している問題について説明した。
マクマホンは本文分析を通じて
フェデラリスト論文
の著者を特定しようとしていた。彼は、テキスト ファイル内の語句や文字列を検索できるツールを必要としていました。 Thompson はその夜約 1 時間を費やして、自分のツールを他の人が使用できる汎用ユーティリティにし、名前を
grep
に変更しました。彼はこの名前を、「グローバル正規表現検索」を意味する
ed
文字列
g/re/p
からとりました。
Thompson が
grep
の誕生について
Brian Kernighan
と
話しているのを見ることができます
。
grep コマンドを使用した簡単な検索
ファイル内の文字列を検索するには、コマンド ラインで検索語とファイル名を渡します。
一致する行が表示されます。この場合、それは単一行です。一致するテキストが強調表示されます。これは、ほとんどのディストリビューションでは
grep
エイリアスが次のとおりであるためです。
エイリアス grep='grep --colour=auto'
一致する行が複数ある結果を見てみましょう。アプリケーション ログ ファイルで「Average」という単語を探します。ログ ファイル内で単語が小文字であるかどうかを思い出せないため、
-i
(大文字と小文字を無視する) オプションを使用します。
grep -i 平均的な geek-1.log
一致するすべての行が表示され、各行で一致するテキストが強調表示されます。
-v (反転一致) オプションを使用すると、一致しない行を表示できます。
grep -v Mem geek-1.log
これらは一致しない行であるため、強調表示はありません。
grep
完全に沈黙させることができます。結果は
grep
からの戻り値としてシェルに渡されます。結果が 0 の場合は文字列が見つかったことを意味し、結果が 1 の場合は文字列が見つからなかったことを意味します。
$?
を使用して戻りコードを確認できます。
特別なパラメータ
:
grep -q 平均 geek-1.log
エコー$?
grep -q geek-1.log
エコー$?
grep を使用した再帰的検索
ネストされたディレクトリおよびサブディレクトリを検索するには、-r (再帰) オプションを使用します。コマンドラインではファイル名を指定せず、パスを指定する必要があることに注意してください。ここでは現在のディレクトリ「.」を検索しています。およびサブディレクトリ:
grep -r -i memfree 。
出力には、一致する各行のディレクトリとファイル名が含まれます。
-R
(再帰逆参照) オプションを使用すると、
grep
シンボリック リンクをたどることができます。このディレクトリには、
logs-folder
というシンボリック リンクがあります。これは
/home/dave/logs
を指します。
ls -l ログフォルダー
-R
(再帰逆参照) オプションを使用して最後の検索を繰り返してみましょう。
grep -R -i memfree 。
シンボリック リンクをたどって、それが指すディレクトリも
grep
で検索されます。
grep コマンドを使用して単語全体を検索する
デフォルトでは、
grep
、検索ターゲットがその行のどこか (別の文字列内を含む) に出現する場合にその行と一致します。この例を見てください。 「無料」という単語を検索してみます。
grep -i free geek-1.log
結果は、文字列「free」を含む行になりますが、それらは別々の単語ではありません。これらは文字列「MemFree」の一部です。
grep
個別の「単語」のみに一致するように強制するには、
-w
(単語正規表現) オプションを使用します。
grep -w -i free geek-1.log
エコー$?
今回は、検索語「無料」がファイル内に別の単語として表示されないため、結果はありません。
複数の検索語の使用
-E
(拡張正規表現) オプションを使用すると、複数の単語を検索できます。 (
-E
オプションは、
grep
の非推奨の
egrep
バージョン
を置き換えます
。)
このコマンドは、「average」と「memfree」という 2 つの検索語を検索します。
grep -E -w -i "平均|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 平均 geek-1.log
grep
、このファイル内に検索語が 240 回出現することを報告します。
-n
(行番号) オプションを使用すると、
grep
一致する各行の行番号を表示できます。
grep -n Jan geek-1.log
一致する各行の行番号が行の先頭に表示されます。
表示される結果の数を減らすには、
-m
(最大数) オプションを使用します。出力を一致する 5 行に制限します。
grep -m5 -n Jan geek-1.log
grep を使用してコンテキストを追加する
一致する行ごとに追加の行 (おそらく一致しない行) を確認できると、多くの場合便利です。一致した行のどれが関心のある行であるかを区別するのに役立ちます。
一致する行の後のいくつかの行を表示するには、-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
(一致するファイル) オプションを使用します。どの C ソース コード ファイルに
sl.h
ヘッダー ファイルへの参照が含まれているかを確認するには、次のコマンドを使用します。
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
検索機能を使用したりできます。
grep
からの出力を
wc
にパイプし、
-l
(行) オプションを使用すると、「ExtractParameters」を含むソース コード ファイル内の
行数をカウントできます
。 (これは
grep
-c
(count) オプションを使用して実現できますが、これは
grep
からのパイプ処理を示す優れた方法です。)
grep "ExtractParameters" *.c |トイレ -l
次のコマンドでは、
ls
からの出力を
grep
にパイプし、
grep
からの出力を
sort
にパイプしています。現在のディレクトリ内のファイルをリストし、文字列「Aug」を含むファイルを選択し、
ファイル サイズで並べ替えています
。
ls -l | grep "8月" |ソート+4n
それを詳しく見てみましょう:
-
ls -l
:
lsを使用して、ファイルの長い形式のリストを実行します。 -
grep “Aug”
:
lsリストから「Aug」を含む行を選択します。これにより、名前に「Aug」が含まれるファイルも検索されることに注意してください。 - sort +4n : grep からの出力を 4 列目 (ファイルサイズ) でソートします。
8 月に変更されたすべてのファイル (年に関係なく) がファイル サイズの昇順でソートされたリストを取得します。
Linux の grep: コマンドというより味方
grep
自由に使える素晴らしいツールです。それは 1974 年に遡り、今でも力強く機能し続けています。なぜなら、それが何をするのかが私たちに必要であり、これ以上のものはないからです。
grep
と
正規表現 fu を組み合わせると、
実際に次のレベルに進みます。





