【初心者向け】grepコマンド「ファイル内から文字列検索」- 特定の行だけ抜き出す -【Linuxコマンド入門 #17】

UBUNTU-linuxコマンド入門シリーズのサムネイル。この記事シリーズでは、よく使うコマンドを優先的に紹介し、シリーズを通して最低限コマンドライン操作ができるようになることを目標に紹介しています。 18 記事
シリーズ

Linuxコマンド入門

LINUXコマンドの基礎について、ゼロから最低限ファイル操作などができるようになるまでの手順を紹介します。linux系な...

前回(#16)は、findコマンドを使い、ファイル名や更新日時といった「条件」でファイルそのものを探し出す方法を学びました。

findコマンドの使い方紹介、Linux Ubuntu初学者向けに、よく使うオプションを優先的に紹介しています。

【初心者向け】findコマンド「ファイル検索」- コピペで試せるオプション理解 -【Linuxコマンド入門 #16】

linuxでファイルを探す方法,findコマンドについて、実務でも使える、よく使うオプションや便利な使い方について紹介します。

findは「どのファイルか?」は教えてくれますが、「ファイルの中身に何が書かれているか?」までは分かりません。

「設定ファイルの中から、”Host” と書かれた行だけを抜き出したい」 「ログファイルから “Error” という単語が含まれる行だけを見たい」

こんな時に活躍するのが、grep コマンドです。

grepコマンドの使い方紹介、Linux Ubuntu初学者向けに、よく使うオプションを優先的に紹介しています。

1. grep コマンドとは?

grep(グレップ)は、指定した「検索文字列(パターン)」に一致する行を、ファイルや標準入力から探し出し、その行全体を表示するコマンドです。

findが「ファイル」を探すのに対し、grepは「ファイルの中身(行)」を探します。

2. grep の基本的な使い方

grepは検索文字列と検索対象のファイルを指定して実行します。

grep "[検索文字列]" [対象のファイル名]

2-1. ファイルから検索する

memo.txt というファイルから Hello という文字列が含まれる行を探してみましょう。

# cat で中身を確認
cat memo.txt
# Hello, World.
# This is a memo.
# Goodbye.
# Hello, Linux!

# grep で "Hello" を検索
grep "Hello" memo.txt
# Hello, World.
# Hello, Linux!

2-2. 複数のファイルから検索する / ワイルドカード

grepは、複数のファイルや *(ワイルドカード)を対象にできます。

# .txt で終わるすべてのファイルから "lumenHero" を探す
grep "lumenHero" *.txt
# config.txt:User=lumenHero
# memo.txt:Written by lumenHero

2-3. 【超重要】パイプ (|) と組み合わせる

grepが真価を発揮するのは、他のコマンドの「実行結果」を検索するときです。 |(パイプ)を使って、前のコマンドの出力を grep に渡すことができます。

# ls -l の結果が多すぎて見づらい
ls -l /etc

# ls -l の結果から ".conf" という文字列を含む行だけを grep で絞り込む
ls -l /etc | grep ".conf"
# -rw-r--r-- 1 root root  1916  8/15  2024 hosts.conf
# -rw-r--r-- 1 root root  1101 10/30  2024 resolv.conf
# ...

findコマンドの結果をさらに絞り込むのにも使えます。

パイプについては、次のシリーズで詳しく紹介予定です。

linuxコマンドを連結しより高度に扱うためのパイプやリダイレクトの仕方について紹介するシリーズのサムネイル
シリーズ

続・Linuxコマンド入門 ~パイプとリダイレクトを使いこなす~

Linuxコマンドの出力に対して処理してデータを加工したり、処理を自動化する「コマンド結合」の方法について紹介します。

3. もっと詳しく見る grep の便利オプション

3-1. 大文字小文字を区別しない -i (Ignore Case)

ignore case(大文字・小文字を無視)の略です。grepはデフォルトで大文字・小文字を厳密に区別します。-iを付けると、それらを無視して検索します。

# "error" は "Error" や "ERROR" にヒットしない
grep "error" system.log

# -i を付けると "Error" や "ERROR" にもヒットする
grep -i "error" system.log
# [ERROR] Failed to start service.
# [Error] User login failed.
# [debug] no error found.

3-2. 再帰的に検索 -r (Recursive)

findのように、recursive(再帰的)にディレクトリの中身をすべて検索します。grep -r "[文字列]" [場所]find を使わなくても「ディレクトリ以下を丸ごと検索」できる便利な使い方です。

# 今いる場所(.)から下の階層すべてを対象に "my_function" を探す
grep -r "my_function" .
# ./src/main.py:def my_function():
# ./src/utils.py:  my_function()

3-3. 行数表示 -n (Number)

見つかった行のnumber(行番号)を一緒に表示します。ログファイルやプログラムのエラー箇所を特定するのに必須です。

grep -in "error" system.log
# 10: [ERROR] Failed to start service.
# 45: [Error] User login failed.
# 99: [debug] no error found.

3-4. 一致しないものを表示 -v (Invert Match)

vert(反転)の略です。検索文字列に「一致しなかった」行だけを表示します。 ログファイルから不要なデバッグ情報(DEBUG)を除外して見たい時などに使います。

# "DEBUG" という行を除外して、それ以外をすべて表示する
cat system.log | grep -v "DEBUG"
# [INFO] System started.
# [ERROR] Failed to start service.
# [INFO] User login.

第17回のまとめ

  • grep : ファイルの中身や標準入力から、「文字列」に一致するを抜き出す。
  • grep "[文字列]" [ファイル] : 基本的な使い方。* で複数ファイルも対象にできる。
  • [コマンド] | grep "[文字列]" : パイプとの組み合わせがgrepの使いどころ。
  • -i : 大文字・小文字を無視する。
  • -r : ディレクトリを再帰的に(中身ごと)検索する。
  • -n : 行番号を表示する。
  • -v : 一致しない行を表示する(除外フィルター)。

次回予告

お疲れ様でした! 今回は yについて紹介しました。

これで、linuxコマンド入門は一旦終了です。第1回よりターミナルの操作、移動・作成と削除・権限・検索とこのシリーズを通して、最低限度のlinuxターミナルでの操作ができるようになったと思います。

次回は、入門編で学べることをまとめて、一覧にした総集編です。したいことから逆引きしたり、一覧で学んだことを振り返りたいときなどに使ってください。

linuxコマンド入門のまとめ記事です。ls cd mkdir find grep など基本的なコマンドの使用目的からどのコマンドを使えばいいか逆引きできます。

総まとめ!目的別に見る基本コマンド逆引きリファレンス【Linuxコマンド入門 #18】

Linuxコマンド入門シリーズ全17回の総まとめ記事です。学んだコマンドを「やりたいこと」から探せる、目的別の逆引きリファレンスとしてご活用ください。

次のシリーズ “linuxコマンド初心者編”では、ここでは触れられなかった、コマンドや環境変数などlinuxの操作で初心者でも知っておくべきことを紹介していこうと思います。

次のシリーズ

指定されたシリーズが見つかりません。(スラッグ: 構成案思案中しばらくお待ちください)

今のシリーズ

UBUNTU-linuxコマンド入門シリーズのサムネイル。この記事シリーズでは、よく使うコマンドを優先的に紹介し、シリーズを通して最低限コマンドライン操作ができるようになることを目標に紹介しています。 18 記事
シリーズ

Linuxコマンド入門

LINUXコマンドの基礎について、ゼロから最低限ファイル操作などができるようになるまでの手順を紹介します。linux系な...

ここまで読んでいただきありがとうございます。

では、次の記事で。 lumenHero