Linuxでgrepを使ってファイルを検索する10の方法 - TechRepublic

Linuxでgrepを使ってファイルを検索する10の方法 - TechRepublic

Windows 検索には確かに魅力がないわけではありませんが、ファイルやその内容を検索したり、特定のシステム情報を検索したりする必要がある場合、Linux の grep コマンドはその強力さと多用途性で私を驚かせ続けます。

grepには複数のバージョンがあります。通常のgrep、egrep(拡張grep)、fgrep(固定grep)です。後者2つは、文字や検索文字列の操作方法が異なります。この記事では、便利で信頼性の高いこのコマンドの入門チュートリアルとして、通常のgrepに焦点を当てます。

grep の構文は次のとおりです。

grep [オプション] パターン [ファイル]

grep で使用できるオプションとパターンは多種多様です。スキルを磨くのに役立つ10の例をご紹介します。

1.ファイル内で特定の単語を検索する

これはまさにgrepの最も基本的な使い方の一つです。例えば、/var/log/secureログの内容を調べて失敗例を探したいとします。その場合、次のように入力します。

grep 失敗 /var/log/secure

これは grep が返す結果の例です。

4月4日 06:45:29 smatteso-vm1 sshd[14836]: pam_unix(sshd:auth): 認証失敗; ログ名= uid=0 euid=0 tty=ssh ruser= rhost= qualys-corp.testdomain.com ユーザー=8boa5lv2rn8pso8
4月4日 06:45:31 smatteso-vm1 sshd[14844]: pam_unix(sshd:auth): 認証失敗; ログ名= uid=0 euid=0 tty=ssh ruser= rhost= qualys-corp.testdomain.com ユーザー=13hr26mnm8wo4k

大文字と小文字を区別しない検索を行うには、-i スイッチを追加します(例:grep -i)。上記の例では、小文字の「failure」、大文字の「FAILURE」、または「Failure.」のようにそれらの組み合わせが返されます。

2.ファイル内の複数の単語を検索する

このコマンドを使用すると、ファイル内の複数の単語をチェックできます。単語間の一重引用符、バックスラッシュ、パイプ コマンドの使用に注意してください。

grep 'opened\|closed' /var/log/secure

grep が返す結果は次のとおりです:

4月2日 03:45:07 smatteso-vm1 sshd[16278]: 10.1.7.101によって接続が閉じられました

4月2日 03:46:42 smatteso-vm1 su: pam_unix(su-l:session): ユーザー phxinst1 のセッションが (uid=0) によって開かれました

4月2日 03:46:45 smatteso-vm1 su: pam_unix(su-l:session): ユーザー phxinst1 のセッションが終了しました

4月2日 03:46:45 smatteso-vm1 su: pam_unix(su-l:session): ユーザー phxinst1 のセッションが (uid=0) によって開かれました

3.インスタンス数を取得する

grepコマンドの出力を実際に確認するのではなく、検索結果の件数だけ知りたい場合もあるでしょう。これは-c(count)スイッチを使って行います。

grep 失敗 /var/log/secure -c

Grep は次のような数値を返します。

12

このスイッチを使うと、いくつか賢い使い方ができます。例えば、システムに搭載されているプロセッサの数を知りたい場合は、次のように入力します。

grep -c プロセッサ /proc/cpuinfo

4.各一致の行番号を表示する

検索結果が何行目に表示されるかを知ることは役立ちます。そのためには、-n(数字)スイッチを追加します。

grep -n 失敗 /var/log/secure

Grep は次のような結果を返します。

1601:4月4日 06:45:29 smatteso-vm1 sshd[14836]: pam_unix(sshd:auth): 認証失敗; ログ名= uid=0 euid=0 tty=ssh ruser= rhost= qualys-corp.testdomain.com user=8boa5lv2rn8pso8

1612:4月4日 06:45:31 smatteso-vm1 sshd[14844]: pam_unix(sshd:auth): 認証失敗; ログ名= uid=0 euid=0 tty=ssh ruser= rhost= qualys-corp.testdomain.com ユーザー=13hr26mnm8wo4k

5. 特定の数の一致のみを返す

検索結果の最初の5件だけを表示したいとします。-m(最大件数)スイッチを使って絞り込むことができます。

grep -m5 失敗 /var/log/secure

結果の例は次のとおりです。

4月4日 06:45:29 smatteso-vm1 sshd[14836]: pam_unix(sshd:auth): 認証失敗; ログ名= uid=0 euid=0 tty=ssh ruser= rhost= qualys-corp.testdomain.com ユーザー=8boa5lv2rn8pso8
4月4日 06:45:31 smatteso-vm1 sshd[14844]: pam_unix(sshd:auth): 認証失敗; ログ名= uid=0 euid=0 tty=ssh ruser= rhost= qualys-corp.testdomain.com
ユーザー=13hr26mnm8wo4k

「-m」と最大カウント値の間にスペースを入れることはできないことに注意してください。

6.一致しないすべてのエントリを表示します。

逆引き検索を行い、入力に一致しない結果を表示したいシナリオがいくつかあります。その場合は、-vスイッチを追加してください。例えば、/var/log/secureファイル内の「failure」という単語を含まないエントリを表示するには、次のように入力します。

grep -v 失敗 /var/log/secure

そして次のような結果が得られます。

4月2日 03:45:07 smatteso-vm1 sshd[16278]: 10.1.7.101によって接続が閉じられました

4月2日 03:46:42 smatteso-vm1 su: pam_unix(su-l:session): ユーザー phxinst1 のセッションが (uid=0) によって開かれました

4月2日 03:46:45 smatteso-vm1 su: pam_unix(su-l:session): ユーザー phxinst1 のセッションが終了しました

4月2日 03:46:45 smatteso-vm1 su: pam_unix(su-l:session): ユーザー phxinst1 のセッションが (uid=0) によって開かれました

もちろん、-v や -n などの文字列を組み合わせることもできます。

grep -v -n 失敗 /var/log/secure

すると、一致しないすべてのエントリとそれに関連付けられた行番号が表示されます。

1:4月2日 03:45:07 smatteso-vm1 sshd[16278]: 10.1.7.101によって接続が閉じられました

2:Apr 2 03:46:42 smatteso-vm1 su: pam_unix(su-l:session): ユーザー phxinst1 のセッションが (uid=0) によって開かれました

3:4月2日 03:46:45 smatteso-vm1 su: pam_unix(su-l:session): ユーザー phxinst1 のセッションが終了しました

4:Apr 2 03:46:45 smatteso-vm1 su: pam_unix(su-l:session): ユーザー phxinst1 のセッションが (uid=0) によって開かれました

5:4月2日 03:46:48 smatteso-vm1 su: pam_unix(su-l:session): ユーザー phxinst1 のセッションが終了しました

7.複数のファイルを検索する

Grepは特定のファイルの内容を検索するだけでなく、さまざまな機能を備えています。再帰検索と呼ばれる機能を使うことで、ディレクトリ全体、サブディレクトリ、あるいはファイルシステム全体を網羅し、検索値を含むファイル名を全て表示する結果を得ることができます。

これは -r スイッチを使用して実行され、/etc ディレクトリ内のユーザー アカウント名を検索するために使用します。

grep -r “smatteso” /etc

結果の例は次のとおりです。

/etc/hosts:10.1.52.237 smatteso-vm1.dwi.testdomain.com smatteso-vm1

/etc/sysconfig/network-scripts/ifcfg-eth0:HOSTNAME=”smatteso-vm1″

/etc/sysconfig/rhn/systemid:<値><文字列>smatteso-vm1.dwi.testdomain.com</文字列></値>

/etc/sysconfig/network:HOSTNAME=smatteso-vm1

「/etc」を「/」に変更すると、ファイルシステム全体を検索できます。

grep -r “smatteso” /

(これはかなり時間のかかる操作になる可能性があることに注意してください!)

8.検索に一致するファイル名のみを表示する

私は乱雑なものが好きではないので、検索に一致するファイル名のリストだけを取得するには(ファイル自体の内容ではなく)、-l スイッチを追加します。

grep -rl “smatteso” /etc

次のような結果が返されます。

/etc/ホスト

/etc/sysconfig/ネットワークスクリプト/ifcfg-eth0

/etc/sysconfig/rhn/システムID

/etc/sysconfig/ネットワーク

前に説明したように、-l ではなく -L スイッチを使用して、検索用語を含まないファイル名を表示するように反転できます。

grep -rL “smatteso” /etc

9.日付で記録されたメッセージを検索する

grep を使う際に特に便利なのは、ログファイルを調べて特定の日付に記録されたメッセージを探すことです。例えば、4月5日に記録されたすべてのメッセージを表示したいとします。

grep “4 月 5 日” /var/log/messages

次のような結果が得られます。

4月5日 00:00:01 smatteso-vm1 audispd: ノード=smatteso-vm1 タイプ=USER_ACCT メッセージ=audit(1491364801.741:135867): ユーザー pid=50149 uid=0 auid=4294967295 ses=4294967295 メッセージ='op=PAM:accounting acct=”phxinst1″ exe=”/usr

/sbin/crond” ホスト名=? アドレス=? ターミナル=cron 応答=成功'

4 月 5 日 00:00:01 smatteso-vm1 audispd: ノード = smatteso-vm1 タイプ = USER_ACCT msg = audit(1491364801.741:135866): ユーザー pid = 50143 uid = 0 auid = 4294967295 ses = 4294967295

もちろん、特定の時間帯を指定すれば、この方法でも動作します。午前6時に記録されたメッセージだけを表示するには、コマンドに「06:00」を追加します。

grep “4月5日 06:00” /var/log/messages

4月5日 06:00:01 smatteso-vm1 audispd: ノード=smatteso-vm1 タイプ=USER_ACCT メッセージ=audit(1491386401.774:143444): ユーザー pid=33946 uid=0 auid=4294967295 ses=4294967295 メッセージ='op=PAM:accounting acct=”phxinst1″ exe=”/usr/sbin/crond” ホスト名=? アドレス=? ターミナル=cron 応答=成功'

4月5日 06:00:01 smatteso-vm1 audispd: ノード=smatteso-vm1 タイプ=USER_ACCT メッセージ=audit(1491386401.774:143445): ユーザー pid=33945 uid=0 auid=4294967295 ses=4294967295 メッセージ='op=PAM:accounting acct=”phxinst1″ exe=”/usr/sbin/crond” ホスト名=? アドレス=? ターミナル=cron 応答=成功'

10.grepを他のコマンドと併用する

Grepは他のコマンドと組み合わせて使うことができます。例えば、「spice」という単語を含むログファイルを検索したいとします。findコマンドを使用し、結果をgrepにパイプで渡すことができます。例:

find . -name “*.log” | grep -i spice

結果の例は次のとおりです。

./spice-vdagent.log

最近入力したコマンドのリストを含む履歴ファイルは、Linuxの優れた機能の一つです。また、履歴ファイルで特定の用語(例えば「pam_tally2」)をgrep検索することで、最後に使用された日時や適切な構文を確認することもできます。

履歴 | grep pam_tally2

324 2017-04-06 13:50:25 pam_tally2

325 2017-04-06 13:50:29 pam_tally2 -u smatteso -r

350 2017-04-06 14:05:44 履歴 | grep pam_tally2

grep と「netstat」を使用して、たとえばポート 22 などのリスニング ポートを確認できます。

netstat -anp | grep 22

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2154/sshd

tcp 0 0 10.1.52.237:22 10.1.13.63:51704 確立 40441/sshd

tcp 0 32 10.1.52.237:22 10.1.13.63:51701 確立 40434/sshd

tcp 0 0 :::22 :::* LISTEN 2154/sshd

特定のプロセスIDを検索することもできます。この例では、「spice」というプロセスが実行中かどうかを確認します。

ps -aux | grep スパイス

ルート 2179 0.0 0.0 15900 1076 ? Ss 3月31日 0:00 /usr/sbin/spice-vdagentd

root 2855 0.0 0.0 103328 888 ポイント/0 S+ 12:41 0:00 grep スパイス

gdm 5430 0.0 0.0 34488 1604 ? Ss 3月31日 0:00 /usr/bin/spice-vdagent

これはgrepの機能のほんの一部に過ぎません。次回の記事では、より便利で詳細な結果を得るために、grepコマンドをより高度な方法で使用するための方法をいくつかご紹介します。

grep の詳細については、「man grep」または「grep –help」コマンドを使用してください。Windows 用の grep バージョンをダウンロードすることもできます。

こちらもご覧ください

  • Linuxシステムでディスクスペースを解放する方法
  • 仮想 Red Hat Enterprise Linux パーティションのサイズを変更する方法
  • Linuxの/etcディレクトリにバージョン管理を追加する方法
  • LinuxでRAMディスクを使う方法

Tagged: