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