LinuxおよびUNIXライクなシステムでは、すべてのシステム構成情報がプレーンテキスト形式で保存および操作されます。したがって、テキストの検索は、編集とログ分析の非常に一般的なタスクになります。
grepコマンドを使用すると、ファイル内またはコマンドの出力コンソールから、正規表現に一致する用語またはパターンを検索できます。 grepが行内で一致を見つけると、結果を画面、つまりstdoutにコピーします。
このチュートリアルでは、実際の例を使用してgrepコマンドを使用する方法を学習します。
Grepコマンド
使用法の説明を始める前に、grepコマンドの構文を確認しましょう。
grep [OPTIONS] PATTERN [FILE...]
検索に使用できる最も一般的なgrepオプションとパターンについて詳しく説明します。
ファイル内の文字列を検索する方法
以下の例では、grepは/ etc / passwdファイルで文字列「root」を検索し、出力をstdoutにリダイレクトします。
$ grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
複数のファイルからテキストを検索
次のコマンドを使用して、複数のファイルから特定のテキストを検索できます。
$ grep "root" /etc/passwd /etc/group
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
/etc/group:root:x:0:root
/etc/group:bin:x:1:root,bin,daemon
/etc/group:daemon:x:2:root,bin,daemon
/etc/group:sys:x:3:root,bin,adm
/etc/group:adm:x:4:root,adm,daemon
/etc/group:disk:x:6:root
/etc/group:wheel:x:10:root
grepの大文字と小文字を区別しない検索
オプション-i
指定された文字列/パターンの大文字と小文字を区別せずに検索します。
次の例では、grepは「hal」、「HAL」などのすべての単語と大文字と小文字を区別せずに一致します。
$ grep -i HAL /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
再帰検索
再帰検索は、-r
を使用して実現されます シンボリックリンクをスキップするすべてのファイルを再帰的に検索するオプション。シンボリックリンクを含める場合は、-R
を使用します 。
次の例では、grepコマンドは/var
内のすべてのファイルで文字列「ngnix」を検索します ディレクトリ。
$ grep -r nginx /var
コマンド出力(stdout)で文字列を検索する
コマンドの出力をパイプし、その出力からパターンのgrepを使用できます。
次の例では、lsコマンドを使用して「backup」という名前のファイルを検索しています
$ ls | grep backup
ここでは、複数のパイプを実行し、psコマンドから「docker」および「apache」プロセスを検索しています。
$ ps -ef | grep docker | grep apache
ファイル内の正規表現
正規表現は、各入力行に一致するパターンです。 BasicとExtendedは、grepコマンドで使用される2つの正規表現です。
基本的な正規表現
デフォルトでは、grepはパターンを基本的な正規表現として解釈します。
^(カレット)記号-それに続くパターンは、各行の先頭にある必要があります。次の例では、文字列^welcomeは行の先頭にある場合にのみ一致します。
$ grep “^welcome” filename
拡張正規表現
-E
を使用する (または--extended-regexp)オプション(grepに拡張正規表現として理解させたい場合)。
次のコマンドは、ファイルからすべてのリンクを抽出します
$ grep –Eoi '<a[^>]+>.*</a>' filename
o
:デフォルトでは、grepは検索パターンを含む行全体を出力します。このオプションは、grepコマンドに、行全体ではなく、一致する単語のみを出力するように指示します。
i
:このオプションは、パターンの一致中に大文字と小文字を無視するようにgrepコマンドに要求します。
grepを使用して単語全体を検索
-w
(word-regexp)grepのフラグは、指定された式が単語全体にのみ一致するようにします。
$ grep -iw "samba" /etc/samba/smb.conf
# This is the main Samba configuration file. You should read the
# here. Samba has a huge number of configurable options (perhaps too
# For a step to step guide on installing, configuring and using samba,
# read the Samba-HOWTO-Collection. This may be obtained from:
文字列が一致した後に行を表示する
-A
N
を表示するオプション 文字列が一致した後の行。
$ grep -A 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
文字列が一致する前に行を表示する
-B
を使用できます 特定のファイルの文字列の前にN行を表示するオプション
$ grep -B 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
複数の文字列を検索
OR演算子|
を使用して、複数のパターンまたは文字列を検索できます および\|
。 -E
(extended-regexp)は、特定の特殊文字をエスケープする必要があるかどうかを制御します。 -e
厳密には、照合するパターンを示すためのフラグです。
例1:-Eオプションの使用
$ ls | grep -E “li|ovo”
linux24
ovo8_linux24.sh
または
$ grep -E "foo|bar" *.txt
例2:-Eなし
$ ls | grep ‘li\|ovo’
linux24
ovo8_linux24.sh
または
$ grep "foo\|soul\|bar" *.txt
特定のファイルを検索から除外する
-vオプションを使用して、検索を無視できます。次のコマンドは、「syslog.log」を除くすべてのファイルで文字列「error」を検索します
$ grep -r error * | grep -v ‘/\syslog.log/’
結論
このチュートリアルでは、grepコマンドを使用してファイル内のテキストを検索する方法を学びました。これを楽しんで読んでいただければ幸いです。以下のコメントセクションに提案を残してください。