Help us understand the problem. What is going on with this article?

grepでこういう時はどうする?

More than 1 year has passed since last update.

文字列を抽出するときも、抽出除外するときも便利なGREP、LinuxでCUI操作をするには無くてはならない存在です
ほとんど抽出にしか使いませんが、多少覚え書きがありましたので共有しておきます

  • よく使う使い方
grep 検索したい文字列 検索したいテキストファイル

コマンド | grep 検索したい文字列

grep -e 検索したい文字列1 -e 検索したい文字列2 検索したいテキストファイル

grep -i 検索したい文字列 検索したいテキストファイル
  • 正規表現を使う
grep -E '正規表現' source.txt

#利用できる正規表現

.                    改行文字以外の任意の1文字
*                    直前の1文字の0回以上の繰り返しに一致。直前の文字は正規表現でも構わない
^                    行の先頭
$                    行の末尾
[ ]                  かっこ内の任意の1文字に一致。ハイフン(-)で範囲指定もできる
[^ ]                 かっこ内の任意の1文字に不一致。ハイフン(-)で範囲指定もできる
\+                   直前の文字の1個以上の繰り返しに一致
\?                   直前の文字の0または1文字に一致
\{n\}                直前の文字のn個の繰り返しに一致
\{n,\}               直前の文字のn個以上の繰り返しに一致
\{,m\}               直前の文字のm個以下の繰り返しに一致
\{n,m\}              直前の文字のn個以上,m個以下の繰り返しに一致
pattern1\|pattern2   pattern1またはpattern2のいずれかに一致
\(pattern\)          patternをグループ化する。マッチした内容は\numで参照できる
\                    正規表現に使われる記号を普通の文字として扱う

例
grep '\[0-9]' source.txt                           # '[0-9]'の文字列を検索
grep -E '(\[0-9]){2}' source.txt                   # '[0-9]'が2回続く文字列を検索
grep '[Ll]inux' source.txt                         # 「Linux」または「linux」が含む行を検索する
grep '\<[Ll]inux\>' source.txt                     #  独立した「Linux」または「linux」が含む行を検索する、RedhatLinuxとかは含まない
grep '[1-9][0-9][0-9][A-Z][0-9]' source.txt        # 先頭に0を含まず123A7のようなパターンに一致
grep '^[0-9]' source.txt                           # 数字を含まない行を検索する
grep '.....' source.txt                            # 5文字以上の行だけ探す
grep '\<W...s\>$' source.txt                       # 先頭がW、末尾がsの文字列を探す
grep '.' source.txt                                # 空行を除外
grep '^\<EX\>\{1,3\}' source.txt                   # EXという文字が1~3回出る行
grep '\<[A-Z]\{\6,15\}\>' source.txt               # 大文字アルファベットが6~15文字含む行
grep '\<[A-Za-z]\{\6,15\}\>' source.txt            # 大文字小文字アルファベットが6~15文字含む行
grep '\<[^0-9A-Za-z]\{\6,15\}\>' source.txt        # 大文字小文字アルファベットと数字以外の文字が6~15文字含む行
grep '[0-9]\{3\}-[0-9]\{3\}-[0-9]\{4\}' source.txt # 電話番号000-000-0000を含む行
  • フォルダ内のファイルを再帰的に指定し"パターン"を見つけたら行番号をつけて表示
grep -rn 'パターン' *
  • アクセスログをリアルタイムに表示する
tail -f access_log | grep --line-buffered 'パターン'
  • if文の条件にする
if grep 'パターン' "ファイル" >/dev/null; then
    echo "パターンが含まれています"
else
    echo "パターンが含まれていません"
fi
  • 標準入力から見つける場合は
if echo "$STR" | grep 'パターン' >/dev/null; then
    echo "パターンが含まれています"
else
    echo "パターンが含まれていません"
fi

-マッチした行の前後数行を表示する

#関連オプション
-B, --before-context=NUM  一致した前の NUM 行を表示する
-A, --after-context=NUM   一致した後の NUM 行を表示する
-C, --context=NUM         一致した前後 NUM 行を表示する

# マッチした行とその前5行、後ろ3行を表示
grep -A3 -B5 banana thing.txt
  • 複数のパターンで検索する
grep -E 'パターン1|パターン2' source.txt
  • 大文字小文字区別せずに検索する
grep -i 'パターン' source.txt
  • 行頭または行末に限定してパターンを検索する
#行頭に#がついている行だけ
grep '^#' source.txt
cat /etc/my.cnf | grep '^#' 

#行末にlogがついている行だけ
grep 'log$' source.txt
cat /etc/my.cnf | grep 'log$'
  • ハイライトをつける
grep --color=always 'パターン' source.txt
  • パターンを除外して表示
grep -v 'パターン' source.txt

#たとえばps auxをした際
ps aux | grep java
#とすると"grep java"自体もヒットしてしまうが
ps aux | grep java | grep -v grep
#とすれば、grep自体は引っ掛からない
  • パータンの出現行数を数える
grep -c 'パターン' source.txt
  • 独立パターンだけ抽出
grep -w 'パターン' source.txt

#たとえば
grep -w 'if' source.txt
#とやると、elseifやendif、iftopなどifを含むものは引っ掛からず、" if "と独立しているモノだけ引っ掛かる
hirohiro77
インフラ屋さんやってます。構成の設計とか、仮想サーバのお守とか、システムのマイナーアップデートとか、監視など。 [[ また、このサイトにおける掲載内容はあくまで私自身の見解であり、私の所属団体・企業における立場、戦略、意見を代表するものではありません ]]
opt
"INNOVATION AGENCY" を標榜するインターネット広告代理店。エンジニア組織 "Opt Techonologies" を中心にアドテクetc...に取り組んでいます。
https://opt-technologies.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした