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について学ぶことはもっとたくさんあります。
ご質問やご意見がございましたら、お気軽にコメントをお寄せください。