grepコマンドまとめ

grepコマンド

grep は、各 FILE で PATTERNS を検索します。PATTERNS は、改行文字で区切られた 1 つまたは複数のパターンであり、grep はパターンに一致する各行を出力します。通常、PATTERNS はシェルコマンドで grep を使用する際に引用符で囲む必要があります。

FILE が「-」の場合は標準入力を意味します。FILE が指定されない場合、再帰的検索は作業ディレクトリを調べ、非再帰的検索は標準入力を読み取ります。

grep [オプション…] パターン [ファイル…]
grep [オプション…] -e パターン … [ファイル…]
grep [オプション…] -f パターンファイル … [ファイル…]

Pattern Syntax

オプション説明
-E, –extended-regexpPATTERNS を拡張正規表現 (ERE) として解釈します。
-F, –fixed-stringsPATTERNS を固定文字列として解釈し、正規表現とはしません。
-G, –basic-regexpPATTERNS を基本正規表現 (BRE) として解釈します。これがデフォルトです。

Matching Control

オプション説明使用例
-e PATTERN指定したパターンで検索するgrep -e "error" file.txt
-f FILE指定したファイル内のパターンを検索するgrep -f patterns.txt file.txt
-i大文字と小文字を区別せずに検索するgrep -i "warning" log.txt
-v一致しない行を表示する(反転検索)grep -v "DEBUG" log.txt
-w完全な単語として一致する行のみ表示するgrep -w "cat" words.txt
-x行全体が完全一致する場合のみ表示するgrep -x "Hello World" file.txt

色々なgrepの使い方

テスト用ファイルの作成

# 作業用ディレクトリの作成と移動
mkdir -p ~/work && cd ~/work

# テスト用のファイル作成
cat > grep_test1 <<EOF
apple
APPLE
banana
cherry
grape
EOF

# ファイルの内容確認
cat grep_test1

「appl」という文字列をgrep_test1から検索

grep appl grep_test1

複数のパターンをマッチする

grep -e apple -e cherry grep_test1

-iオプションは大文字と小文字を無視するため、大文字のAPPLEも表示されました

grep -i apple grep_test1

-vはパターンがマッチした行が表示されません。

grep -v apple grep_test1

General Output Control

オプション説明使用例
-c一致した行数のみを表示するgrep -c "error" log.txt
--color=auto一致部分を色付きで表示するgrep --color=auto "fail" log.txt
-L一致しないファイル名を表示するgrep -L "pattern" *.txt
-l一致するファイル名を表示するgrep -l "pattern" *.txt
-m NUM指定した回数だけ一致したら停止するgrep -m 5 "error" log.txt
-o一致した部分のみを表示するgrep -o "error[0-9]*" log.txt
-q出力をせず、ステータスコードのみ返すgrep -q "error" log.txt && echo "Found"
-s存在しないファイルのエラーメッセージを抑制するgrep -s "pattern" missing.txt

出力制御を試してみる

applに一致した行数を表示

grep -c "appl" grep_test1

ファイル内に「apple」が存在するファイル名を表示

grep -l "apple" *

Output Line Prefix Control

オプション説明使用例
-b各行の先頭にバイトオフセット(0からの位置)を表示grep -b "error" log.txt
-H各一致行の先頭にファイル名を表示(複数ファイル検索時のデフォルト)grep -H "pattern" file1.txt file2.txt
-hファイル名の表示を抑制(単一ファイル検索時のデフォルト)grep -h "pattern" file1.txt file2.txt
--label=LABEL標準入力のデータを仮想ファイル名として表示gzip -cd file.gz
-n各一致行の先頭に行番号を表示grep -n "error" log.txt
-T出力をタブで揃えて見やすくするgrep -T -n "pattern" file.txt
-Zファイル名の後に改行の代わりにNULL文字を出力grep -lZ "pattern" *.txt

出力行の接頭辞制御を試してみる

テスト用のファイルを作成

# 作業用ディレクトリの作成と移動
mkdir -p ~/work && cd ~/work
 
# テスト用のファイル作成1
cat > grep_test1 <<EOF
apple
APPLE
banana
cherry
grape
EOF
 
# テスト用のファイル作成2
cat > grep_test2 <<EOF
orange
apple
pear
EOF

一致したパターンにファイル名を表示させる

grep -H -e cherry -e orange grep_test1 grep_test2

ファイル名、一致した行を表示し、タブでそろえる

grep -nT -e cherry -e orange grep_test1 grep_test2

Context Line Control

オプション説明使用例
-A NUM一致した行の後に NUM 行を追加表示grep -A 3 "error" log.txt
-B NUM一致した行の前に NUM 行を追加表示grep -B 3 "error" log.txt
-C NUM / -NUM一致した行の前後 NUM 行を追加表示grep -C 3 "error" log.txt
--group-separator=SEPグループの区切り文字を変更(デフォルトは --grep -C 2 --group-separator="===" "error" log.txt
--no-group-separatorグループ区切りをなくすgrep -C 2 --no-group-separator "error" log.txt

コンテキスト行制御を試してみる

一致した行(app)の後に2行表示

grep -A 2 app grep_test1

File and Directory Selection

オプション説明使用例
-aバイナリファイルをテキストファイルとして処理grep -a "error" binary.log
-Iバイナリファイルを検索対象外にするgrep -I "error" *
-r指定ディレクトリ以下のすべてのファイルを再帰的に検索grep -r "error" /var/log
-R-r と同様だが、シンボリックリンクをたどるgrep -R "error" /var/log
--exclude=GLOB指定したパターンに一致するファイルを検索対象外にするgrep -r --exclude="*.log" "error" /var/log
--exclude-dir=GLOB指定したパターンに一致するディレクトリを検索対象外にするgrep -r --exclude-dir="backup" "error" /var/log
--include=GLOB指定したパターンに一致するファイルのみを検索grep -r --include="*.log" "error" /var/log

ファイル・ディレクトリ選択オプションを試してみる

テスト用のファイルを作成。今回はバイナリファイルも作成します

# 作業用ディレクトリの作成と移動
mkdir -p ~/work && cd ~/work

# バイナリファイル作成
printf '\x48\x65\x6C\x6C\x6F\x00\xFF\xFE\xFD' > binary_file.bin

# テスト用のファイル作成1
cat > grep_test1 <<EOF
apple
APPLE
banana
cherry
grape
EOF

# カレントディレクトリホームに戻す
cd

バイナリファイルを処理し、~/work/配下のファイルを検索対象とする

grep -a Hello -r ~/work/

コメント

タイトルとURLをコピーしました