順番に読み進めながら学べます

テキスト検索 — grep

ファイルから文字列を含む行を探す基本と、大文字小文字を無視する -i、行番号の -n、再帰検索の -rの使い分けを、ブラウザ端末で操作しながら学べます。

文字列を探す — grep

grepはファイルの中から指定した文字列を含む行だけを抜き出して表示するコマンドです。

grep 探す文字列 ファイル名の形で使い、一致する行があれば、その行がそのまま画面に出ます。

大量のログから必要な行だけを見つけるときに使います。

grep が一致行だけを抜き出す
applebananacherrygrep banana fruits.txt一致した banana だけ表示他の行は出ない
grepは指定文字列を含む行だけを抜き出し、他の行は出力しません。
echo 'error: disk full' > log.txt   # 1 行目を作成
echo 'info: started' >> log.txt     # 追記
echo 'error: timeout' >> log.txt    # 追記
grep error log.txt                  # error を含む 2 行
grep info log.txt                   # info を含む 1 行

echo 'error: disk full' > log.txtで 1 行目を作り、echo 'info: started' >> log.txtecho 'error: timeout' >> log.txtを追記して 3 行の素材ファイルを作成してください。

grepを使ってlog.txtからerrorを含む行だけを表示してください。

③ 表示された行がすべてerrorを含んでいることを確認してください。(正しく実行できれば解説が表示されます)

Linux console
0 / 4 実行済み
Loading Linux Terminal...

大文字小文字を無視する — -i / 行番号 — -n

grepは大文字と小文字を区別します。

-iを付けると区別せずに探せるため、Errorerrorの両方を拾えます。

-nを付けると、一致した行の前に何行目かの行番号が表示され、ファイル内の位置が分かります。

-i-ngrep -in error app.txtのように 1 つにまとめて同時に付けられます。

オプション意味
-i大文字小文字を区別しないgrep -i error log.txt
-n一致行の前に行番号を付けるgrep -n error log.txt
-v一致しない行を表示するgrep -v info log.txt
-rディレクトリ以下を再帰検索grep -r TODO src
echo 'Error in disk' > app.txt   # 1 行目を作成
echo 'error in app' >> app.txt   # 追記
echo 'ok' >> app.txt             # 追記
grep -i error app.txt            # Error と error の 2 行
grep -n error app.txt            # 2:error in app(行番号付き)

echo 'Error in disk' > app.txtで 1 行目を作り、echo 'error in app' >> app.txtecho 'ok' >> app.txtを追記して大文字小文字が混ざった素材を作成してください。

② まずgrepで大文字小文字を区別せずにerrorを探すオプションを付けて検索し、Errorの行も拾えることを確認してください。

③ 次に行番号を表示するオプションを付けて同じ検索を行い、一致した行の前に行番号が付くことを確認してください。

Linux console
0 / 5 実行済み
Loading Linux Terminal...

一致しない行を除く — -v

-vを付けると、grepは指定した文字列を含む行以外を表示します。

通常のgrepが一致した行を残すのに対し、-vは一致した行を取り除いて残りを出します。

ログから不要な行(infodebugなど)を除いて読みたいときに使います。

grep -v が一致しない行を残す
error: disk fullinfo: startederror: timeoutgrep -v info log.txtinfo を含む行は除外残りの error 2 行を表示
-vは指定文字列を含む行を除き、残りの行だけを表示します。
echo 'error: disk full' > log.txt   # 1 行目を作成
echo 'info: started' >> log.txt     # 追記
echo 'error: timeout' >> log.txt    # 追記
grep -v info log.txt                # info を含まない 2 行

echo 'error: disk full' > log.txtで 1 行目を作り、echo 'info: started' >> log.txtecho 'error: timeout' >> log.txtを追記して 3 行の素材ファイルを作成してください。

② 一致しない行を残すオプションを付けたgreplog.txtからinfoを含まない行だけを表示してください。

③ 表示された行がerrorの 2 行で、infoの行が消えていることを確認してください。

Linux console
0 / 4 実行済み
Loading Linux Terminal...

ディレクトリを再帰的に探す — -r

1 つのファイルだけでなく、ディレクトリ以下のすべてのファイルから探したいときは-rを付け、ファイル名の代わりにディレクトリを渡します。

サブディレクトリの中まで再帰的にたどり、一致した行を「ファイル名:行」の形で表示します。

grep -r がディレクトリを再帰的にたどる
grep -r TODO srcsrc/src/a.txtTODO: fix latersrc/sub/src/sub/b.txtTODO: review
grep -rは渡したsrcから始め、サブディレクトリsrc/subの中まで降りて全ファイルを探します。
mkdir -p src/sub                       # 素材ディレクトリを作成
echo 'TODO: fix later' > src/a.txt     # 親に 1 ファイル
echo 'TODO: review' > src/sub/b.txt    # サブに 1 ファイル
grep -r TODO src                       # src 以下を再帰検索

mkdir -p src/subでサブディレクトリ付きの素材ツリーを作成してください。

echo 'TODO: fix later' > src/a.txtecho 'TODO: review' > src/sub/b.txtで、親とサブの両方にファイルを作成してください。

③ 再帰検索のオプションを付けたgrepsrcディレクトリ以下からTODOを探し、両方のファイルの行が出ることを確認してください。

Linux console
0 / 4 実行済み
Loading Linux Terminal...
QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1grep error log.txtを実行すると何が表示されますか?

Q2grepで大文字小文字を区別せずに探したいときに付けるオプションはどれですか?

Q3-rを付けてディレクトリを渡すとgrepはどう動きますか?