Engineering

【備忘録】ubuntu grepコマンドでファイルから文字列を検索する

  • 作成日:2024年3月24日19:48
  • 更新日:2024年4月4日22:34

tips

ubuntu

Ubuntuのgrepコマンドはファイルが指定した文字列を含むかどうか確認するときに用いられる便利なコマンドです。使用できるオプションは多岐にわたりますが、ここでは備忘録として特に有用ないくつかのユースケースについて出力例とともに紹介します。

man find
...
NAME
       grep, egrep, fgrep, rgrep - print lines that match patterns
...

以下順次更新していきます。
今回は以下のdemo-01.txtとdemo-02.txtを用意して結果を確認しています。

demo-01.txt

This is the first line
line 2
line 3
line line line
End of FILE

demo-02.txt

This is the first line of 2nd file
line 2 of 2nd file
line 3 of 2nd file
End of 2nd File

実行例1:特定のファイル名から指定した文字列を検索する場合

grep <検索文字列> <ファイル名>
最も簡単な実行方法だと思います。検索したい文字列を指定した後、ファイル名を指定します。
デフォルトで正規表現に対応しています。

# demo-01.txtファイルの中で「line」が含まれる部分を検索
demo@demo-01-Ubuntu22:~/ubuntu-commands$ grep "line" demo-01.txt
This is the first line
line 2
line 3
line line line
# 正規表現を含めて検索文字を指定することが可能
demo@demo-01-Ubuntu22:~/ubuntu-commands$ grep "^line" demo-01.txt
line 2
line 3
line line line

実行例2:特定のファイル名から複数の文字列を検索する場合

grep -e <検索文字列> -e <検索文字列> <ファイル名>
-eオプションで検索文字列を複数指定することでいくつかの文字列を同時に検索することができます。

# demo-01.txtファイルの中で「line」または「End」が含まれる部分を検索
demo@demo-01-Ubuntu22:~/ubuntu-commands$ grep -e "line" -e "End" demo-01.txt
This is the first line
line 2
line 3
line line line
End of FILE

実行例3:大文字/小文字の区別なく文字列を検索したい場合

grep -i <検索文字列> <ファイル名>
-iオプションでuppercase/lowercaseの区別なく検索することができます。

# オプションなしでコマンドを実行してもヒットしない
demo@demo-01-Ubuntu22:~/ubuntu-commands$ grep "end" demo-01.txt
demo@demo-01-Ubuntu22:~/ubuntu-commands$
# -iオプションを指定して実行することで「End」の文字列をヒットさせることができる
demo@demo-01-Ubuntu22:~/ubuntu-commands$ grep -i "end" demo-01.txt
End of FILE

実行例4:マッチしなかった行を確認したい場合

grep -v <検索文字列> <ファイル名>
-vオプションをつけると検索文字列でマッチしなかった部分を抽出することができます。

# 通常の検索
demo@demo-01-Ubuntu22:~/ubuntu-commands$ grep "End" demo-01.txt
End of FILE
#-vオプションをつけるとマッチしなかった行を出力する
demo@demo-01-Ubuntu22:~/ubuntu-commands$ grep -v "End" demo-01.txt
This is the first line
line 2
line 3
line line line

実行例5:マッチした行数を確認したい場合

grep -c <検索文字列> <ファイル名>
-cオプションをつけるとマッチした行数をカウントすることができます。

# 通常の検索
demo@demo-01-Ubuntu22:~/ubuntu-commands$ grep "line" demo-01.txt
This is the first line
line 2
line 3
line line line
# -cオプションを利用するとマッチした行数が確認できる
demo@demo-01-Ubuntu22:~/ubuntu-commands$ grep -c "line" demo-01.txt
4

実行例6:マッチした部分があるファイルを確認したい場合

grep -l <検索文字列> <ファイル名>
-lオプションをつけるとマッチした文字列を含むファイル名を出力します。

# -lオプションでマッチした文字列を含むファイル名を確認できる
demo@demo-01-Ubuntu22:~/ubuntu-commands$ grep -l "line" demo-01.txt demo-02.txt
demo-01.txt
demo-02.txt
# -Lオプションは反対にマッチしなかったファイルを出力する
demo@demo-01-Ubuntu22:~/ubuntu-commands$ grep -L "zzz" demo-01.txt demo-02.txt
demo-01.txt
demo-02.txt

実行例7:マッチした文字列がどのファイルに含まれているかを確認したい場合

grep -H <検索文字列> <ファイル名>
-Hオプションをつけるとマッチした文字列を含むファイル名を出力します。

# -Hオプションでマッチした文字列を含むファイル名を確認できる
demo@demo-01-Ubuntu22:~/ubuntu-commands$ grep -H "line" demo-01.txt demo-02.txt
demo-01.txt:This is the first line
demo-01.txt:line 2
demo-01.txt:line 3
demo-01.txt:line line line
demo-02.txt:This is the first line of 2nd file
demo-02.txt:line 2 of 2nd file
demo-02.txt:line 3 of 2nd file

実行例8:マッチした文字列が何行目にあるかを確認したい場合

grep -n <検索文字列> <ファイル名>
-nオプションをつけるとマッチした文字列がファイルの何行目にあるかを確認することができます。

# -nオプションで実行するとマッチした文字列が何行目に位置しているかも合わせて出力される
demo@demo-01-Ubuntu22:~/ubuntu-commands$ grep -n "line" demo-01.txt
1:This is the first line
2:line 2
3:line 3
4:line line line

実行例9:マッチした文字列の前後の内容もあわせて確認したい場合

grep -C <前後で表示する行数> <検索文字列> <ファイル名>
-Cオプションをつけるとマッチした文字列だけでなく前後の行を合わせて確認することができます。

# -Cオプションで実行すると前後の情報と合わせてマッチした文字列が出力される
demo@demo-01-Ubuntu22:~/ubuntu-commands$ grep -C 1 "line" demo-01.txt
This is the first line
line 2
line 3
line line line
End of FILE

実行例10:ディレクトリ内のファイルを再帰的に検索したい場合

grep -r <検索文字列> <フォルダ名>
-rオプションをつけてファイル名ではなくディレクトリ名を指定すると指定したディレクトリ内のファイルを再帰的に検索することができます。
以下のファイル構成で確認しています。

demo
├── demo
│   └── demo-a.txt
├── demo-a.txt
└── demo-b.txt

# demo-a.txt/demo-b.txtの中身は以下の通り(同じ内容)
demo@demo-01-Ubuntu22:~/ubuntu-commands$ cat demo/demo-a.txt
abc
def
ghi
EOF
# -rオプションで実行すると再帰的に検索をかけることができる
demo@demo-01-Ubuntu22:~/ubuntu-commands$ grep -r "a" demo
demo/demo/demo-a.txt:abc
demo/demo-b.txt:abc
demo/demo-a.txt:abc




参考文献:
- man grepコマンド
- https://www.gnu.org/software/grep/manual/grep.html
- https://www.gnu.org/software/findutils/manual/html_node/find_html/Full-Name-Patterns.html
- https://qiita.com/tamcchi103/items/16dba4d15dd8a87c8d4e