2016/03/04更新

[シェル] Grepでand検索、or検索、not検索、正規表現、再帰的に検索、圧縮ファイル内検索、など行う

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
今日はシェルコマンドで良くお世話になるgrepについて、いろいろな絞り込み方法をブログに書きたいと思います。

画像


目次




基本的な使い方

まずはgrepの基本的な使い方です。検索したい文字列とファイル名を指定して絞り込みを行います。
# $ grep "検索したい文字列" ファイル名
$ grep "トヨタ" twitter_ja.tsv

# ワイルドカードで複数ファイルも対象にできる
$ grep "トヨタ" twitter_*.tsv

# catなどの処理結果をgrepもできる
cat twitter_ja.tsv | grep "トヨタ"



AND条件で検索する

grepをパイプでつなぐことで、AND条件で検索することができます。
$ grep "トヨタ" twitter_ja.tsv | grep "株価"



OR条件で検索する

grep-eオプションを使うことで、OR条件で検索することができます。
$ grep -e "トヨタ" -e "ソニー" twitter_ja.tsv



NOT検索する

grep-vオプションを使うことで、指定した文字に該当しない行を検索することができます。
$ grep -v "トヨタ" twitter_ja.tsv



正規表現を使ってgrepする

検索する場合に、正規表現は大変役立ちます。Eオプションを利用して正規表現を利用します。正規表現の詳細はこちらをご参照ください。
# リツイートのみを抽出
grep -E "RT\s@.*?\s" twitter_ja.tsv



指定したフォルダ以下を再帰的にgrepする

とあるフォルダ以下にあるファイルを一括でgrepしたいという時はよくありますよね。その場合にはrオプションを利用します。
# tmpディレクトリ以下を再帰的に探す
$ grep -r "トヨタ" tmp
tmp/subdir/ccc.dat:さようならトヨタさん
tmp/bbb.txt:トヨタは愛知県にあります
tmp/aaa.txt:トヨタはいい

# 指定した拡張子のみを探す
$ grep -r --include="*.dat" "トヨタ" tmp
tmp/subdir/ccc.dat:さようならトヨタさん



圧縮ファイル内をgrepする

ログデータなどは容量削減のため圧縮して保存されることがよくあります。圧縮ファイル内はzgrepzcatコマンドを使ってgrepします。
# Gzip圧縮内をgrepする
$ zgrep "トヨタ" aaa.txt.gz

# zcatからパイプしてもOK
$ zcat aaa.txt.gz | grep "トヨタ"

# tar.gzの場合
# zcatした内容をパイプでgrepする
# その際に、-aオプションをつけて強制的にテキストファイルとして処理する
$ zcat tmp3.tar.gz | grep -a "トヨタ"

# tar.gzの場合
# tarコマンドでもOK
$ tar -Oxzf tmp3.tar.gz | grep "トヨタ"

# zipファイルの場合
$ zcat bbb.txt.zip | grep "トヨタ"
# または
$ zgrep "トヨタ" bbb.txt.zip 



ヒットした行の行番号を表示する

ファイルのどの辺がヒットしたのかを調べる場合には、nオプションを利用します。
$ grep -n "トヨタ" twitter_ja.tsv



参考資料

grepに関して以下の情報を参考にさせていただきました。ありがとうございます。

- grepコマンドで覚えておきたい使い方14個 | 俺的備忘録 〜なんかいろいろ〜

- grep コマンド | コマンドの使い方(Linux) | hydroculのメモ

- 正規表現 メタ文字一覧-正規表現サンプル集



最後に

本日はシェルのgrepコマンドについて、いろいろな使い方をブログに書きました。僕自身シェルコマンドはあまり詳しくないので、こんな感じでブログを書いていき少しずつ覚えていければいいなーと考えています。

本ブログでは、フロントエンド・Python・機械学習を中心に発信していきます。気になった方はぜひ、本ブログのRSSTwitterをフォローして頂けると幸いです ^ ^。

最後までご覧頂きましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。