[bash] オプション探索 1回目 grep

bash

構築でも運用でも慣れてくると決まったオプションしか使わなくなるな〜と思い、改めていつも使うコマンドのオプションを調べてみようと思いました。
他にも当たり前に使うコマンドはいっぱいあるのですが、grepコマンドから始めてみます。

基本構文

説明するまでもないけど一応。

ファイル内に任意の文字列があるかを検索する場合
$ grep “検索文字列” <ファイル>

$ cat sample.txt
Hello, world.
hello, world.

$ grep “hello” sample.txt
hello, world.
↑ 大文字小文字が区別されるので、「hello」を含む2行目の「hello, world.」のみが検索される

コマンドの実行結果(標準出力)に任意の文字列があるかを検索する場合
$ <実行コマンド> | grep “検索文字列”

$ ls -1
sample.txt
dummy.txt
memo.txt
$ ls -1 | grep sample
sample.txt
↑ ls -1の結果から「sample」を含む行だけが出力される

オプション

一覧

使用例は後述するけど、まずは一覧で。

オプション説明
-E <文字列|文字列>| (パイプ)で区切って複数検索する。(or検索)
-e <文字列> -e <文字列>検索文字列毎に-e を指定して複数検索(or検索)
-f <ファイル>指定したファイルに記載されている文字列を検索する(改行が区切り)
-i <文字列>大文字、小文字を区別しない
-v <除外文字列>検索された行を表示させない
-c <文字列>検索された行数のみを出力する
-n <文字列>検索結果の行の前に行番号(何行目か)を出力する
-R <ディレクトリ>指定したディレクトリ以下にあるファイルを検索する
-A <数値>検索された行+指定した行数分後ろに続く行数を出力する
-B <数値>検索された行+指定した行数分前に記載されている行数を出力する
-C <数値>検索された行+指定した行数分前後に記載されている行数を出力する
使用例
サンプルファイル

この使用例で利用するテキストは以下の2つ。

./test/sample1.txt

HELLO, WORLD.
SAMPLE TEXT
grep test text

./test/sample2.txt

hello, world.
sample text
grep test text

複数検索 ( -E、 -e、 -f )

-E : 「|(パイプ)」で検索したい文字列を区切って複数指定。

$grep -E “SAMPLE|HELLO” ./test/sample1.txt
HELLO, WORLD.
SAMPLE TEXT

-e : 検索文字列毎に -e を指定。

$grep -e SAMPLE -e HELLO ./test/sample1.txt
HELLO, WORLD.
SAMPLE TEXT

-f : ファイルに記載されている

$ cat grep.txt
SAMPLE
HELLO

$ grep -f grep.txt ./test/sample1.txt
HELLO, WORLD.
SAMPLE TEXT

大文字小文字を無視( -i )、文字列を除外(-v)

-i : 大文字と小文字を無視して検索

$grep -i text ./test/sample1.txt
SAMPLE TEXT
grep test text

-v : 指定した文字列を除外

$grep -v text ./test/sample1.txt
HELLO, WORLD

検索数をカウント( -c )、行数を行頭に出力(-n)、ディレクトリ以下を検索(-R)

-c : 検索された行数をカウント

$grep -ic text ./test/sample1.txt
2

-n : 行数を行頭に出力

$grep -n text ./test/sample1.txt
3:grep test text

-R : 指定ディレクトリ以下を検索

$grep text -R ./test
test/sample2.txt:sample text
test/sample2.txt:grep test text
test/sample1.txt:grep test text

前後をまとめて表示( -A、-B、-C )

-A : 検索された行から後ろを、指定した行数表示

$grep -nA 1 SAMLE ./test/sample1.txt
2:SAMPLE TEXT
3:grep test text

-A : 検索された行から前を、指定した行数表示

$grep -nB 1 SAMLE ./test/sample1.txt
1:HELLO, WORLD
2:SAMPLE TEXT

-C : 検索された行から前後を、指定した行数表示

$grep -nC 1 SAMLE ./test/sample1.txt
1:HELLO, WORLD
2:SAMPLE TEXT
3:grep test text

正規表現
文字意味
.任意の1文字
^行頭の指定
$行末の指定
[]括弧([])内の任意の文字
複数指定は「,」区切り
範囲指定は「-」

サンプル

$cat sample.txt
1234567890
abcdefghi
aaaaaaaa
hgfedcba

$ grep a. sample.txt
abcdefgh
aaaaaaaa

$ grep ^a sample.txt
abcdefgh
aaaaaaaa

$ grep a$ sample.txt
aaaaaaaa
hgfedcba

$ grep [0-9,i] sample.txt
1234567890
abcdefghi

$ grep [a-c] sample.txt
abcdefghi
aaaaaaaa
hgfedcba

参考

複数ファイル指定

-R でディレクトリ以下を再起的に検索もできるけど、それだと多い。
一階層下だけで良いときは「<ディレクトリ>/*」とか使える。

$grep -i sample ./test/*
test/sample2.txt:sample text
test/sample1.txt:SAPLE TEXT

直接ファイル名を複数してもできる。

$grep -i sample ./test/sample1.txt ./test/sample2.txt
test/sample2.txt:sample text
test/sample1.txt:SAPLE TEXT

類似コマンド

egrep(grep -Eと同等) や fgrep(grep -F と同等)もありますが、推奨されていないようです。
古いスクリプトを移設しても利用できるように用意されているとのことでした。 (バグとか修正されないのかな?)

コメント

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