アンドロイド

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

Live Encoding and Transcoding Techniques

Live Encoding and Transcoding Techniques

目次:

Anonim

「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 -Rl linuxize.com /tmp

大文字と小文字を区別しない検索

デフォルトでは、 grep コマンドでは大文字と小文字が区別されます。 つまり、大文字と小文字は区別されて扱われます。

検索時に大文字小文字を無視するには、 -i オプション(または --ignore-case )を使用します。

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

grep Zebra /usr/share/words

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

grep -i Zebra /usr/share/words

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

zebra zebra's zebras

完全な単語を検索する

「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

gnu

行番号を表示

パターンに一致する文字列を含む行の数を表示するには、 -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

4

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

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

    使用する (大括弧)は、大括弧で囲まれた任意の1文字に一致します。 たとえば、 accept または「 accent 」を含む行を見つけるには、次のパターンを使用できます。

    grep "accet" file.txt

    使用する (大括弧)は、大括弧で囲まれた任意の1文字に一致します。 次のパターンは、 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行の先行コンテキストを表示するには、次のコマンドを使用します。

grep -B 5 root /etc/passwd

試合後に行を印刷する

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

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

grep -A 5 root /etc/passwd

結論

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

Grepの詳細については、Grepユーザーマニュアルページをご覧ください。

grepターミナル