このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:文字列を検索する:grepコマンド

文字列を検索する:grepコマンド

 Linuxシステムでは、多数のテキストファイルを扱うことが日常的です。これらのファイルから必要な情報を効率的に抽出するために、文字列検索の機能が欠かせません。grepコマンドは、そのようなニーズに応えるための強力なツールであり、特定のパターンにマッチする行を簡単に抽出できます。また、正規表現を用いることで、より高度なパターンマッチングが可能となり、複雑な検索要件にも対応できます。

正規表現とは

 正規表現(Regular Expression)は、文字列のパターンを表現するための特殊な記法です。これにより、「特定の文字列で始まり、別の文字列で終わる行」や「特定のパターンを含む行」など、単純な文字列検索では難しい複雑な条件での検索が可能になります。

 正規表現は grep コマンドだけでなく、他の多くのLinuxコマンドやプログラミング言語でも使用されます。そのため、正規表現の知識を身につけることで、さまざまなテキスト処理を効率的に行えるようになります。

grepコマンドの概要

 grep(global regular expression print)は、指定したパターンにマッチする行を表示するコマンドです。Linux環境でテキストデータを検索・抽出する際に、最も頻繁に使用されるコマンドの一つです。

基本的な書式

grep [オプション] <検索パターン> <ファイル名>

  • <検索パターン>:検索したい文字列や正規表現パターンを指定します。
  • <ファイル名>:検索対象のファイルを指定します。複数のファイルを指定することも可能です。

基本的な使用例

例:/etc/passwd ファイルから "bash" を含む行を表示

user01@ubuntu:~$ grep bash /etc/passwd
root:x:0:0:root:/root:/bin/bash
user01:x:1000:1000:user01:/home/user01:/bin/bash
  • 解説/etc/passwd ファイル内で "bash" を含む行が表示されます。

主なオプションと使用例

 grep コマンドには多くのオプションがありますが、ここでは特によく使われる3つのオプションを紹介します。

1.行番号を表示する:-n オプション

 マッチした行の行番号を表示したい場合に使用します。これにより、該当箇所がファイルのどの位置にあるかを容易に特定できます。

例:.bashrc ファイル内で "alias" を含む行を行番号付きで表示

user01@ubuntu:~$ grep -n alias .bashrc
75:# enable color support of ls and also add handy aliases
78:    alias ls='ls --color=auto'
79:    #alias dir='dir --color=auto'
80:    #alias vdir='vdir --color=auto'
82:    alias grep='grep --color=auto'
83:    alias fgrep='fgrep --color=auto'
84:    alias egrep='egrep --color=auto'
90:# some more ls aliases
91:alias ll='ls -alF'
92:alias la='ls -A'
93:alias l='ls -CF'
95:# Add an "alert" alias for long running commands.  Use like so:
97:alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
101:# ~/.bash_aliases, instead of adding them here directly.
104:if [ -f ~/.bash_aliases ]; then
105:    . ~/.bash_aliases
  • 解説:各行の先頭に行番号が表示されており、"alias" を含む行が簡単に特定できます。

2.大文字・小文字を区別しない検索:-i オプション

検索時に大文字・小文字を区別せずにマッチさせたい場合に使用します。

例:/etc/passwd ファイル内で "kernel" を検索

user01@ubuntu:~$ grep kernel /etc/passwd   # 何もマッチしない
user01@ubuntu:~$ grep -i kernel /etc/passwd  # 大文字小文字を区別しないでマッチする
kernoops:x:106:65534:Kernel Oops Tracking Daemon,,,:/:/usr/sbin/nologin
  • 解説:最初のコマンドでは "kernel" の小文字のみを検索するためマッチしませんが、-i オプションを付けると "Kernel" と大文字で書かれた行にもマッチします。

3.マッチしない行を表示する:-v オプション

 指定したパターンにマッチしなかった行を表示したい場合に使用します。不要な行を除外して表示する際に便利です。

例:/etc/passwd ファイル内で "bash" を含まない行を表示

user01@ubuntu:~$ grep -v bash /etc/passwd
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
...(以下省略)...
  • 解説:"bash" を含まない行のみが表示されます。

標準入力からの検索

 grep コマンドは、ファイル名を指定しない場合に標準入力からデータを読み込みます。これを利用して、他のコマンドの出力結果を grep で検索することが可能です。

例:/etc ディレクトリ内で "host" を含むファイルやディレクトリを検索

user01@ubuntu:~$ ls /etc | grep host
ghostscript
host.conf
hostname
hosts
hosts.allow
hosts.deny
  • 解説ls /etc の出力結果をパイプで grep に渡し、"host" を含む名前を持つファイルやディレクトリを抽出しています。

マッチした行の全体を表示

 grep コマンドは、マッチした部分だけでなく、その行全体を表示します。たとえ検索パターンが行の一部にしか含まれていなくても、行全体が出力されます。

  • :前述の "host" の検索で、"ghostscript" も結果に含まれていますが、これは "host" が名前の一部に含まれているためです。

まとめ

  • grep コマンドは、指定したパターンにマッチする行を検索・表示するための強力なツールです。
  • 主なオプション
    -n:マッチした行の行番号を表示
    -i:大文字・小文字を区別せずに検索
    -v:マッチしなかった行を表示
  • 標準入力からの検索:ファイル名を指定しない場合、標準入力からデータを読み込むため、他のコマンドと組み合わせて使用できます。
  • 正規表現の活用:単純な文字列検索だけでなく、正規表現を用いることで複雑なパターンの検索も可能です。

 grep コマンドを習得することで、大量のテキストデータから必要な情報を効率的に抽出できるようになります。さらに、正規表現の知識を組み合わせることで、より高度な検索・抽出が可能となりますので、ぜひ積極的に活用してみてください。