ウェブサイト検索

LinuxでのGrepコマンドの使い方[12の便利な例]


特定の文字列やパターンをファイルの中で探すという作業に直面したことはありますか?どこから探し始めればいいかわからないこともありますよね?そんな時には、grepコマンドが助けになってくれます!

grepは、すべてのLinuxディストリビューションに付属している強力なファイルパターン検索ツールです。何らかの理由でシステムにインストールされていない場合は、以下のようにパッケージマネージャを使用して簡単にインストールできます。

$ sudo apt install grep         [On Debian, Ubuntu and Mint]
sudo yum install grep         [On RHEL/CentOS/Fedora and Rocky Linux/AlmaLinux]
sudo emerge -a sys-apps/grep  [On Gentoo Linux]
sudo apk add grep             [On Alpine Linux]
sudo pacman -S grep           [On Arch Linux]
sudo zypper install grep      [On OpenSUSE]    

grepコマンドに慣れる最も簡単な方法は、実際の例を使って思い切ってやってみることだと私は思います。

1. Linuxでファイルを検索して見つける

新しいUbuntuのクリーンインストールをマシンに行ったとしましょう。そして、Pythonスクリプトに挑戦しようとしているところです。

あなたはウェブ上でチュートリアルを探していましたが、Pythonの2つの異なるバージョンが使われているのを見て、インストーラーがUbuntuにインストールしたPythonのバージョンや、何かモジュールがインストールされたかどうかわからないのです。

以下のdpkgコマンドをgrepを使用して実行してください:

dpkg -l | grep -i python

まず、私たちは dpkg –l を実行しました。これは、システムにインストールされている *.deb パッケージのリストを表示します。次に、その出力を grep -i python にパイプしました。これは単に「grep に移動し、‘python’ が含まれるすべてをフィルタリングして返せ」という意味です。

-iオプションは大文字と小文字を無視するためにあり、grepは大文字と小文字を区別します。-iオプションを使うことは、もちろんより特定の検索を行う際でない限り、良い習慣です。

2. Linuxでファイルを検索およびフィルターする

このgrepは、個々のファイルや複数のファイル内で検索およびフィルタリングするためにも使用できます。次のシナリオを見てみましょう:

あなたは自分のApache Web Serverにいくつかの問題を抱えていて、ネット上の多くの素晴らしいフォーラムの1つに助けを求めています。

返信してくれる親切な人が、あなたに /etc/apache2/apache2.conf ファイルの内容を投稿するように頼んでいます。コメント行をすべて削除できれば、あなた自身や助けてくれている人、そしてそれを読んでいるすべての人にとって簡単になりませんか?そう、できます!次のコマンドを実行してください:

grep -v ^\# /etc/apache2/apache2.conf | grep .

-vオプションは、grepに出力を反転させるよう指示します。つまり、一致する行を印刷するのではなく、一致しない行、つまりこの場合は#でコメントされた行をすべて印刷します。

なお、すべての空行の出力を隠すために、最後にgrep .を使用しました。これにより、ターミナルには設定だけが表示されます。

3. Linuxで全ての.mp3ファイルを見つける

grep は stdout からフィルタリングするのに非常に便利です。たとえば、さまざまなフォーマットの音楽ファイルが入ったフォルダ全体があるとしましょう。

アーティストJayZのすべての*.mp3ファイルを見つけたいが、リミックスされたトラックは不要です。いくつかのgrepパイプを使ったfindコマンドを使えば、目的が達成できます:

# find . -name “*.mp3” | grep –i JayZ | grep –vi “remix”

この例では、findを使用して*.mp3拡張子を持つすべてのファイルを印刷し、それをgrep –iにパイプして、名前に「JayZ」を持つすべてのファイルをフィルタリングして印刷し、さらに別のパイプを使用してgrep –viに渡し、任意のケースで「remix」という文字列を含むファイル名をフィルタリングして印刷しないようにします。

4. 検索文字列の前または後の行数を表示する

もう一つのオプションは、-Aと-Bスイッチで、検索文字列の前または後にある一致した行といくつかの行を表示します。

マニュアルページがより詳細な説明を提供している間、私はオプションを覚えるのが最も簡単だと思います。-A=後、および -B=前:

ifconfig | grep -A 4 inet
ifconfig | grep -B 2 UP

5. 一致周辺の行数を印刷する

grepの-Cオプションは似ていますが、文字列の前後にある行を印刷するのではなく、どちらの方向にも行を印刷します。

# ifconfig | grep -C 2 lo

 TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 15314  bytes 1593769 (1.5 MB)
        RX errors 0  dropped 0  overruns 0  frame 0

6. 試合の数を数える

grepの組み込みオプションは、grep文字列をワードカウント(wcコマンド)にパイプするのと同じように、あなたのために同じことを実行できます:

# ifconfig | grep -c inet6

7. Linuxで指定した文字列でファイルを検索する

grepの–nオプションは、コンパイルエラーの際にファイルをデバッグする際に非常に便利です。指定した検索文字列がファイル内のどの行にあるかを表示します:

# grep -n "main" setup.py

8. すべてのディレクトリ内で文字列を再帰的に検索する

現在のディレクトリとすべてのサブディレクトリで文字列を検索する場合は、再帰的に検索するために–rオプションを指定できます:

# grep -r “function” *

9. パターン全体を検索する

-wオプションをgrepに渡すと、文字列に含まれる完全なパターンを検索します。例えば、次のように使用します:

# ifconfig | grep -w "RUNNING"

引用符の中にあるパターンを含む行を出力します。逆に、もしあなたが試すなら:

# ifconfig | grep -w "RUN"

パターンではなく、単語全体を検索しているため、何も返されません。

10. Gzippedファイル内の文字列を検索する

言及に値するのは、grepの派生物です。最初はzgrepで、これはzcatと同様に、gzippedファイルで使用されます。これはgrepと同じオプションを取り、同じ方法で使用されます:

# zgrep -i error /var/log/syslog.2.gz

11. ファイル内の正規表現を一致させる

egrepコマンドは「拡張グローバル正規表現」を意味する別の派生物です。それは、at + ? |や()などの追加の表現メタキャラクターを認識します。

egrepコマンドは、必要に応じてソースファイルやその他のコードの検索に非常に便利です。grepから、-Eオプションを指定することで呼び出すことができます。

grep -E

12. 固定パターン文字列を検索する

fgrepコマンドは、固定パターン文字列のためにファイルまたはファイルのリストを検索します。これはgrep -Fと同じです。fgrepを使用する一般的な方法は、パターンのファイルを渡すことです:

fgrep –f file_full_of_patterns.txt file_to_search.txt

これはgrepの単なる出発点ですが、あなたが見ているように、さまざまな目的にとって非常に貴重です。私たちが実装したシンプルなワンライナーのコマンドの他に、grepは強力なcronジョブや堅牢なシェルスクリプトを書くためにも使用できます。

創造的になり、manページのオプションを試し、自分の目的に合ったgrep式を考えてみてください!

関連記事: