GNU/Linux >> Linux の 問題 >  >> Linux

LinuxでのGrepコマンド(ファイル内のテキストの検索)

grep commandは「グローバル正規表現print」の略で、Linuxで最も強力で一般的に使用されるコマンドの1つです。

grep 1つ以上の入力ファイルで特定のパターンに一致する行を検索し、一致する各行を標準出力に書き込みます。ファイルが指定されていない場合は、 grep 通常は別のコマンドの出力である標準入力から読み取ります。

この記事では、 grepの使用方法を紹介します。 最も一般的なGNUgrepの実用的な例と詳細な説明によるコマンド オプション。

grep コマンド構文#

grepの構文 コマンドは次のとおりです:

grep [OPTIONS] PATTERN [FILE...]

角括弧内の項目はオプションです。

  • オプション -ゼロ以上のオプション。 Grepには、その動作を制御するいくつかのオプションが含まれています。
  • パターン -検索パターン。
  • ファイル -ゼロ個以上の入力ファイル名。

ファイルを検索できるようにするには、コマンドを実行するユーザーがファイルへの読み取りアクセス権を持っている必要があります。

ファイル内の文字列を検索#

grepの最も基本的な使用法 コマンドは、ファイル内の文字列(テキスト)を検索することです。

たとえば、文字列 bashを含むすべての行を表示するには / etc / passwdから ファイルの場合、次のコマンドを実行します:

grep bash /etc/passwd

出力は次のようになります。

root:x:0:0:root:/root:/bin/bash
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

文字列にスペースが含まれている場合は、一重引用符または二重引用符で囲む必要があります。

grep "Gnome Display Manager" /etc/passwd

逆一致(除外)#

パターンに一致しない行を表示するには、 -vを使用します (または-invert-match )オプション。

たとえば、文字列 nologinを含まない行を印刷するには 使用するもの:

grep -v nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
colord:x:124:124::/var/lib/colord:/bin/false
git:x:994:994:git daemon user:/:/usr/bin/git-shell
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Grepを使用してコマンドの出力をフィルタリングする#

コマンドの出力は、 grepでフィルタリングできます 配管を介して、特定のパターンに一致する線のみが端子に印刷されます。

たとえば、ユーザー www-dataとしてシステムで実行されているプロセスを確認するには 次のpsを使用できます コマンド:

ps -ef | grep www-data
www-data 18247 12675  4 16:00 ?        00:00:00 php-fpm: pool www
root     18272 17714  0 16:00 pts/0    00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data
www-data 31147 12770  0 Oct22 ?        00:05:51 nginx: worker process
www-data 31148 12770  0 Oct22 ?        00:00:00 nginx: cache manager process

コマンドで複数のパイプをチェーンすることもできます。上記の出力でわかるように、 grepを含む行もあります。 処理する。その行を表示したくない場合は、出力を別の grepに渡します。 以下に示すインスタンス。

ps -ef | grep www-data | grep -v grep
www-data 18247 12675  4 16:00 ?        00:00:00 php-fpm: pool www
www-data 31147 12770  0 Oct22 ?        00:05:51 nginx: worker process
www-data 31148 12770  0 Oct22 ?        00:00:00 nginx: cache manager process

パターンを再帰的に検索するには、 grepを呼び出します。 -rを使用 オプション(または-recursive )。このオプションを使用する場合grep 再帰的に検出されるシンボリックリンクをスキップして、指定されたディレクトリ内のすべてのファイルを検索します。

-r の代わりに、すべてのシンボリックリンクをたどる 、 -Rを使用します オプション(または-dereference-recursive

これは、文字列 linuxize.comを検索する方法を示す例です。 / etc内のすべてのファイル ディレクトリ:

grep -r linuxize.com /etc

出力には、ファイルへのフルパスが前に付いた一致する行が含まれます:

/etc/hosts:127.0.0.1 node2.linuxize.com
/etc/nginx/sites-available/linuxize.com:    server_name linuxize.com   www.linuxize.com;

-Rを使用する場合 オプション、 grep すべてのシンボリックリンクをたどります:

grep -R linuxize.com /etc

以下の出力の最後の行に注意してください。 grep の場合、その行は出力されません -rで呼び出されます Nginxのsites-enabled内のファイルが ディレクトリは、 sites-available内の構成ファイルへのシンボリックリンクです。 ディレクトリ。

/etc/hosts:127.0.0.1 node2.linuxize.com
/etc/nginx/sites-available/linuxize.com:    server_name linuxize.com   www.linuxize.com;
/etc/nginx/sites-enabled/linuxize.com:    server_name linuxize.com   www.linuxize.com;

ファイル名のみを表示#

デフォルトのgrepを抑制するには 一致したパターンを含むファイルの名前のみを出力および印刷します。-lを使用します (または-files-with-matches )オプション。

以下のコマンドは、 .confで終わるすべてのファイルを検索します 現在の作業ディレクトリにあり、文字列 linuxize.comを含むファイルの名前のみを出力します :

grep -l linuxize.com *.conf

出力は次のようになります:

tmux.conf
haproxy.conf

-l <​​/ code> オプションは通常、再帰オプション -Rと組み合わせて使用​​されます :

grep -Rl linuxize.com /tmp

デフォルトでは、 grep 大文字と小文字が区別されます。これは、大文字と小文字が別個のものとして扱われることを意味します。

検索時に大文字と小文字を区別しないようにするには、 grepを呼び出します。 -iを使用 オプション(または-ignore-case

たとえば、 Zebraを検索する場合 オプションがない場合、次のコマンドは出力を表示しません。つまり、一致する行があります。

grep Zebra /usr/share/words

ただし、 -iを使用して大文字と小文字を区別しない検索を実行する場合 オプションの場合、大文字と小文字の両方に一致します:

grep -i Zebra /usr/share/words

「Zebra」を指定すると、「zebra」、「ZEbrA」、またはその文字列の大文字と小文字のその他の組み合わせに一致します。

zebra
zebra's
zebras

完全な単語を検索#

文字列を検索するときは、 grep 文字列が大きな文字列に埋め込まれているすべての行が表示されます。

たとえば、「gnu」を検索すると、「cygnus」や「magnum」など、「gnu」が大きな単語に埋め込まれているすべての行が一致します。

grep gnu /usr/share/words
cygnus
gnu
interregnum
lgnu9d
lignum
magnum
magnuson
sphagnum
wingnut

指定された文字列が単語全体(単語以外の文字で囲まれている)である行のみを返すには、 -wを使用します。 (または-word-regexp )オプション。

単語の文字には英数字が含まれます( a-z A-Z 、および 0-9 )およびアンダースコア( _ )。他のすべての文字は、単語以外の文字と見なされます。

-w を含め、上記と同じコマンドを実行した場合 オプション、 grep コマンドは、 gnuが含まれる行のみを返します。 別の単語として含まれています。

grep -w gnu /usr/share/words
gnu

行番号を表示#

-n (または-line-number )オプションは grepに指示します パターンに一致する文字列を含む行の行番号を表示します。このオプションを使用する場合、 grep 行番号が前に付いた標準出力に一致を出力します。

たとえば、 / etc / servicesからの行を表示します 文字列bashを含むファイル 一致する行番号を前に付けると、次のコマンドを使用できます。

grep -n 10000 /etc/services

以下の出力は、一致が10423行目と10424行目にあることを示しています。

10423:ndmp            10000/tcp
10424:ndmp            10000/udp

一致数#

一致する行の数を標準出力に出力するには、 -cを使用します (または-count )オプション。

以下の例では、 / usr / bin / zshを持つアカウントの数をカウントしています。 シェルとして。

regular expressiongrep -c '/usr/bin/zsh' /etc/passwd
4

クワイエットモード#

-q (または-quiet grepに通知します クワイエットモードで実行し、標準出力に何も表示しないようにします。一致するものが見つかった場合、コマンドはステータス 0で終了します。 。これは、 grepを使用する場合に便利です ファイルに文字列が含まれているかどうかを確認し、結果に応じて特定のアクションを実行するシェルスクリプト。

grepの使用例を次に示します。 ifのテストコマンドとしてクワイエットモードで ステートメント:

if grep -q PATTERN filename
then
    echo pattern found
else
    echo pattern not found
fi
基本的な正規表現#

GNU Grepには、Basic、Extended、Perl互換の3つの通常の式機能セットがあります。

デフォルトでは、 grep パターンを基本的な正規表現として解釈します。メタ文字を除くすべての文字は、実際には自分自身に一致する正規表現です。

以下は、最も一般的に使用されるメタ文字のリストです。

  • ^を使用する (caret)行頭の式に一致する記号。次の例では、文字列 kangaroo 行の先頭にある場合にのみ一致します。

    grep "^kangaroo" file.txt
  • $を使用する (ドル)行末の表現に一致する記号。次の例では、文字列 kangaroo 行の最後にある場合にのみ一致します。

    grep "kangaroo$" file.txt
  • を使用します (ピリオド)任意の1文字に一致する記号。たとえば、 kanで始まるものすべてに一致させる 次に2文字で、文字列 rooで終わります。 、次のパターンを使用できます:

    grep "kan..roo" file.txt
  • []を使用する (角かっこ)角かっこで囲まれた任意の1文字に一致します。たとえば、 acceptを含む行を見つけます または「accent 、次のパターンを使用できます:

    grep "acce[np]t" file.txt
  • [^]を使用する 角かっこで囲まれていない単一の文字と一致します。次のパターンは、 co(any_letter_except_l)aを含む文字列の任意の組み合わせに一致します 、 cocaなど 、コバルト などですが、 colaを含む行とは一致しません 、

    grep "co[^l]a" file.txt

次の文字の特別な意味を回避するには、 \を使用します (円記号)記号。

拡張正規表現#

パターンを拡張正規表現として解釈するには、 -Eを使用します (または-extended-regexp ) オプション。拡張正規表現には、より複雑で強力な検索パターンを作成するための追加のメタ文字に加えて、すべての基本的なメタ文字が含まれています。以下にいくつかの例を示します。

  • 特定のファイルからすべてのメールアドレスを照合して抽出します:

    grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt
  • 特定のファイルからすべての有効なIPアドレスを照合して抽出します:

    grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt

-o オプションは、一致する文字列のみを印刷するために使用されます。

複数の文字列(パターン)を検索#

OR演算子|を使用して、2つ以上の検索パターンを結合できます。 。

デフォルトでは、 grep パターンを、 |などのメタ文字が含まれる基本的な正規表現として解釈します。 特別な意味を失い、バックスラッシュバージョンを使用する必要があります。

以下の例では、 fatalという単語のすべての出現箇所を検索しています。 、エラー 、およびクリティカル Nginxログエラーファイル内:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

拡張正規表現オプション-Eを使用する場合 、次に演算子 | 以下に示すように、エスケープしないでください:

grep -E 'fatal|error|critical' /var/log/nginx/error.log
一致する前に行を印刷する#

行を照合する前に特定の行数を印刷するには、 -Bを使用します (または-before-context )オプション。

たとえば、行を照合する前に5行の先行コンテキストを表示するには、次のコマンドを使用します。

grep -B 5 root /etc/passwd
一致後に行を印刷する#

行を一致させた後に特定の行数を印刷するには、 -Aを使用します (または-after-context )オプション。

たとえば、行を照合した後に5行の末尾のコンテキストを表示するには、次のコマンドを使用します。

grep -A 5 root /etc/passwd

結論#

grep コマンドを使用すると、ファイル内のパターンを検索できます。一致するものが見つかった場合、grepは指定されたパターンを含む行を出力します。

GrepユーザーズマニュアルページでGrepについて学ぶことはもっとたくさんあります。

ご質問やご意見がございましたら、お気軽にコメントをお寄せください。


Linux
  1. Linuxでファイルをすばやく検索するための5つのコマンドラインツール

  2. 25Linuxでの便利なfindコマンドの実用例

  3. Linuxでfdコマンドを使用してファイルを検索する方法

  1. Grepコマンドを使用してファイル内のテキストを検索する方法

  2. Linux の find コマンドを使用してファイルを検索する方法

  3. Linuxコマンド:テキストファイルのみを「検索」する方法は?

  1. Linuxでファイルを見つける方法

  2. Linuxでテキストを含まないテキストファイルを見つける方法は?

  3. Linux で特定のテキストを含むすべてのファイルを見つけるにはどうすればよいですか?