Live Encoding and Transcoding Techniques
目次:
- Grepコマンド構文
grep
を使用してファイル内の文字列を検索する方法- 一致を反転(除外)
- Grepを使用してコマンド出力で文字列を検索する方法
- 再帰検索
- ファイル名のみを表示
- 大文字と小文字を区別しない検索
- 完全な単語を検索する
- 行番号を表示
- カウントマッチ
- 複数の文字列(パターン)の検索
- 静かなモード
- 基本的な正規表現
- 拡張正規表現
- 試合前に行を印刷する
- 試合後に行を印刷する
- 結論
「global regular expression print」の略である
grep
コマンドは、Linuxで最も強力で一般的に使用されるコマンドの1つです。
Grepは、1つ以上の入力ファイルで特定のパターンに一致する行を検索し、一致する各行を標準出力に書き込みます。 ファイルが指定されていない場合、
grep
は標準入力(通常は別のコマンドの出力)から読み取ります。
このチュートリアルでは、実用的な例を通して
grep
コマンドを使用する方法と、最も一般的なGNU
grep
オプションの詳細な説明を示します。
Grepコマンド構文
grep
コマンドの使用方法に入る前に、基本的な構文を確認することから始めましょう。
grep
ユーティリティの式は次の形式を取ります。
grep PATTERN
角括弧内の項目はオプションです。
-
OPTIONS
個以上のオプション。 Grepは、その動作を制御する多くのオプションを提供します。 パターン-検索パターン。FILE
-0個以上の入力ファイル名。
ファイルを検索できるようにするには、コマンドを実行するユーザーにファイルへの読み取りアクセス権が必要です。
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
を含まない
/etc/passwd
ファイルの行を表示するには、次のコマンドを使用できます。
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 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
再帰検索
パターンを再帰的に検索するには、
-r
オプション(または
--recursive
)を使用します。 これは、指定されたディレクトリ内のすべてのファイルを検索し、再帰的に発生するシンボリックリンクをスキップします。 すべてのシンボリックリンクをたどるには、
-R
オプション(または
--dereference-recursive
)を使用します。
次の例では、
/etc
ディレクトリ内のすべてのファイルで文字列
linuxize.com
検索しています。
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
を使用する場合、
-R
オプションを使用すると、
grep
はすべてのシンボリックリンクに従います。
grep -R linuxize.com /etc
出力の最後の行に注目してください。 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
オプションは通常、再帰オプション
-R
と組み合わせて使用されます。
大文字と小文字を区別しない検索
デフォルトでは、
grep
コマンドでは大文字と小文字が区別されます。 つまり、大文字と小文字は区別されて扱われます。
検索時に大文字小文字を無視するには、
-i
オプション(または
--ignore-case
)を使用します。
たとえば、オプションなしで
Zebra
を検索する場合、次のコマンドは出力を表示しません。つまり、一致する行があります。
grep Zebra /usr/share/words
ただし、
-i
オプションを使用して大文字と小文字を区別しない検索を実行すると、大文字と小文字の両方が一致します。
grep -i Zebra /usr/share/words
「Zebra」を指定すると、「zebra」、「ZEbrA」、またはその文字列の大文字と小文字の他の組み合わせに一致します。
完全な単語を検索する
「gnu」を検索する場合、
grep
は「cygnus」や「magnum」などの大きな単語に「gnu」が埋め込まれている行も出力します。
grep gnu /usr/share/words
cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut
指定された文字列が単語全体(単語以外の文字で囲まれている)である行のみを返すには、
-w
(または
--word-regexp
)オプションを使用します。
az
、
AZ
および
0-9
)および下線(
_
)が含まれます。 他のすべての文字は、単語以外の文字と見なされます。
grep -w gnu /usr/share/words
行番号を表示
パターンに一致する文字列を含む行の数を表示するには、
-n
(または
--line-number
)オプションを使用します。 このオプションを使用すると、
grep
は、見つかった行番号を先頭に付けた標準出力への一致を出力します。
たとえば、次のコマンドを使用すると、一致する行番号が先頭に付いた文字列
bash
を含む
/etc/services
ファイルの行を表示できます。
grep -n 10000 /etc/services
以下の出力は、一致が10423行と10424行で見つかったことを示しています。
10423:ndmp 10000/tcp 10424:ndmp 10000/udp
カウントマッチ
一致する行の数を標準出力に出力するには、
-c
(または
--count
)オプションを使用します。
以下の例では、シェルとして
/usr/bin/zsh
を持つアカウントの数をカウントしています。
grep -c '/usr/bin/zsh' /etc/passwd
複数の文字列(パターン)の検索
OR演算子を使用して、2つ以上の検索パターンを結合できます
|
。
デフォルトでは、
grep
はパターンを基本的な正規表現として解釈し、
|
などのメタ文字は 特別な意味を失い、バックスラッシュバージョンを使用する必要があります。
次の例では、Nginxログエラーファイルで
fatal
、
error
、および
critical
すべての出現箇所を検索しています。
grep 'fatal\|error\|critical' /var/log/nginx/error.log
grep -E 'fatal|error|critical' /var/log/nginx/error.log
静かなモード
-q
(または
--quiet
)は、端末に何も書き込まないように
grep
に指示します(標準出力)。 一致が見つかった場合、コマンドはステータス
0
終了します。 これは、ファイルに文字列が含まれているかどうかを確認し、結果に応じて特定のアクションを実行するシェルスクリプトで
grep
を使用する場合に便利です。
if
ステートメントでテストコマンドとしてクワイエットモードで
grep
を使用する例を次に示します。
if grep -q PATTERN filename then echo pattern found else echo pattern not found fi
基本的な正規表現
GNU Grepには、BasicとExtendedの2つの正規表現機能セットがあります。 デフォルトでは、
grep
はパターンを基本的な正規表現として解釈します。
基本的な正規表現モードで使用する場合、メタ文字を除く他のすべての文字は、実際に一致する正規表現です。 以下は、最も一般的に使用されるメタ文字のリストです。
-
^
(キャレット)記号を使用して、行の先頭にある式と一致させます。 次の例では、文字列^kangaroo
は、行の先頭にある場合にのみ一致します。grep "^kangaroo" file.txt
$
(ドル)記号を使用して、行末の表現に一致させます。 次の例では、文字列kangaroo$
は、行の最後にある場合にのみ一致します。grep "kangaroo$" file.txt
を使用し
.
(ピリオド)任意の単一文字に一致する記号。 たとえば、kan
で始まり、2つの文字があり、文字列roo
で終わるものに一致させるには、次のパターンを使用できます。grep "kan..roo" file.txt
使用する
accept
または「accent
」を含む行を見つけるには、次のパターンを使用できます。grep "accet" file.txt
使用する
coca
、cobalt
などのco(any_letter_except_l)a
を含む文字列の任意の組み合わせに一致しますが、cola
を含む行には一致しません。grep "coa" file.txt
次の文字の特別な意味をエスケープするには、
\
(バックスラッシュ)記号を使用します。
拡張正規表現
パターンを拡張正規表現として解釈するには、
-E
(または
--extended-regexp
)オプションを使用します。 拡張正規表現には、すべての基本的なメタ文字と、より複雑で強力な検索パターンを作成するための追加のメタ文字が含まれます。 以下に例を示します。
-
特定のファイルからすべての電子メールアドレスを照合して抽出します。
grep -E -o "\b+@+\.{2, 6}\b" file.txt
指定されたファイルからすべての有効なIPアドレスを照合して抽出します。
grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt
-o
オプションは、一致する文字列のみを印刷するために使用されます。
試合前に行を印刷する
行を照合する前に特定の行数を出力するには、
-B
(または
--before-context
)オプションを使用します。
たとえば、一致する行の前に5行の先行コンテキストを表示するには、次のコマンドを使用します。
試合後に行を印刷する
行の一致後に特定の行数を出力するには、
-A
(または
--after-context
)オプションを使用します。
たとえば、一致する行の後に5行の後続コンテキストを表示するには、次のコマンドを使用します。
結論
grep
コマンドを使用すると、ファイル内のパターンを検索できます。 一致するものが見つかった場合、grepは指定されたパターンを含む行を出力します。
Grepの詳細については、Grepユーザーマニュアルページをご覧ください。
grepターミナル