4.1 grep
Global Regular Expression Print
grepはパターンにマッチする行を検索・抽出するコマンドである。正規表現を使った強力な検索が可能。
基本構文
# 基本形
grep 'pattern' file.txt
# 複数ファイル
grep 'pattern' *.txt
# 再帰的検索
grep -r 'pattern' /path/to/dir/
# パイプで使用
cat file.txt | grep 'pattern'
ps aux | grep nginx
主要オプション
@startmindmap !theme plain skinparam backgroundColor #FEFEFE * grep ** マッチ制御 *** -i : 大文字小文字無視 *** -v : マッチしない行 *** -w : 単語単位 *** -x : 行全体 ** 出力制御 *** -n : 行番号表示 *** -c : マッチ数のみ *** -l : ファイル名のみ *** -o : マッチ部分のみ ** 検索対象 *** -r : 再帰的 *** -h : ファイル名非表示 ** 正規表現 *** -E : 拡張正規表現 *** -F : 固定文字列 *** -P : Perl正規表現 @endmindmap
図1: grepの主要オプション
| オプション | 説明 | 例 |
|---|---|---|
| -i | 大文字小文字を区別しない | grep -i 'error' log.txt |
| -v | マッチしない行を表示 | grep -v '#' config.txt |
| -n | 行番号を表示 | grep -n 'TODO' *.py |
| -r | ディレクトリを再帰検索 | grep -r 'func' src/ |
| -c | マッチ行数を表示 | grep -c 'error' log.txt |
| -l | マッチしたファイル名のみ | grep -l 'pattern' *.txt |
正規表現
| パターン | 意味 | 例 |
|---|---|---|
| . | 任意の1文字 | a.c → abc, aXc |
| * | 直前の0回以上 | ab* → a, ab, abb |
| ^ | 行頭 | ^Error |
| $ | 行末 | done$ |
| [abc] | いずれか1文字 | [0-9]+ |
| \b | 単語境界 | \bword\b |
# 行頭がErrorで始まる行
grep '^Error' log.txt
# 数字を含む行
grep '[0-9]' file.txt
# IPアドレスパターン(拡張正規表現)
grep -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' access.log
# 空行を除外
grep -v '^$' file.txt
実践例
# ログからエラー抽出
grep -i 'error\|warning' /var/log/syslog
# プロセス検索(grep自身を除外)
ps aux | grep nginx | grep -v grep
# 設定ファイルからコメント以外を抽出
grep -v '^#' /etc/ssh/sshd_config | grep -v '^$'
# ソースコード内のTODO検索
grep -rn 'TODO\|FIXME' --include='*.py' src/
出典
[1] man grep - print lines that match patterns.
[2] man 7 regex - POSIX.2 regular expressions.
[2] man 7 regex - POSIX.2 regular expressions.