はじめに
「grepコマンド
による文字列処理をやってみた」の続編です。
以前扱えていなかった内容をやっていきたいです。
grepコマンド
の基本については過去の記事を参照のこと。
skume.hatenablog.com
まずは、サンプルデータをダウンロードする
svn export https://github.com/kumeS/Blog/trunk/grep_practice_02
cd ./grep_practice_02
cat test.txt
検索語に一致した文字列のみを抜き出して出力する
grep -o
を使うと、検索後と同じものが、ヒットした文字列として出力されます。
grep -o 'abc' test.txt
grep 'abc' test.txt
grep -o 'fghij' test.txt
大文字・小文字を区別せず、検索語に一致した文字列のみを抜き出して出力する
grep -o -i
を使うと、大文字・小文字が区別されずに、ヒットした文字列が出力されます。
grep -o -i 'abc' test.txt
grep -i 'abc' test.txt
grep -o -i 'fghij' test.txt
検索語に一致した文字列の数をカウントする【部分一致検索】
grep -o
とgrep -c
を使うと、検索語に一致した文字列数が出力されます。
このとき注意することとしてコマンドを分けずに、grep -o -c
にすると、行数カウントになります。
grep -o 'abc' test.txt | grep -c 'abc'
grep -o -c 'abc' test.txt
grep -o 'fghij' test.txt | grep -c 'fghij'
検索語に一致した箇所の前後の行を出力する
grep -C
を使うと、前後の行(行数指定)を一緒に出力できます。
grep -C 1 'hijklmn' test.txt
grep -B 1 -A 3 'hijklmn' test.txt
grep -B -A
を使うと、-B
で検索語前の行数、-A
で検索語後の行数を指定できます。
検索語に一致した箇所の前後の文字列を出力する
上記で、行レベルで出力する方法を紹介したが、
正規表現. (ピリオド)
を使うと、前後の文字列も出力できます。
grep -o 'efghijk' test.txt
grep -o '....efghijk' test.txt
grep -o 'efghijk....' test.txt
grep -o '....efghijk....' test.txt
また、検索語を「変数」で指定することもできる。
TERMS=$"efghijk" ; grep -o "....$TERMS...." test.txt
TERMS=$'efghijk' ; grep -o "....$TERMS...." test.txt
やってみると、'
と"
の組み合わせが重要らしいです。
;
は、複数文を繋げて書く文法である。
検索語を行番号付きで出力する
grep -n
を使うと、行番号付きで出力されます。
grep -o -n 'abc' test.txt
grep -n 'abc' test.txt
grep -o -n 'fghij' test.txt
検索語の行番号のみを出力する
行番号のみを出力するには、sed
との組み合わせで行います。
grep -n 'abc' test.txt | sed -e 's/:.*//g'
grep -n 'fghij' test.txt | sed -e 's/:.*//g'
grepのエラーメッセージを消す
そのままではあまり使わないけど、プログラムを組むときには役に立つかもです。
grep 'abcd' test
grep: test: Is a directory
grep -s 'abcd' test
grep --no-messages 'abcd' test
まとめ
grep
コマンドは結構役に立つので、一通り覚えておくと、
いろいろなテキストの前処理とかに使えそうです。
補足
正規表現のまとめ
正規表現 (Regular Expression)は、文字列のパターン・マッチングなどの表記法として使用する。
また、メタキャラクタとは、文字列のパターンを表す特殊な記号のことを指す。
メタキャラクタ |
そのメタキャラクタが意味すること |
. |
任意の一文字 |
* |
前にある文字の0回以上の繰り返し |
+ |
前にある文字の1回以上の繰り返し |
? |
前にある文字の0回あるいは1回の意味 |
^ |
指定した文字が文頭 |
$ |
指定した文字が文末 |
[ ] |
指定した複数の文字の中のいずれか |
{ } |
前にある文字の指定した回数の繰り返し |
\w |
英数文字またはアンダーバー。[a-zA-Z0-9_]と同等 |
\W |
\w 以外の文字 |
\d |
数値文字。[0-9]と同等 |
\D |
数値以外の文字。[^0-9]と同等 |
\s |
空白文字 |
\S |
空白以外の文字 |
\b |
ワードの先頭、あるいは末尾にマッチ |
\B |
ワード内の文字列にマッチ |
\A |
文字列の最初にマッチ |
\Z |
文字列の最後にマッチ |
\t |
タブ |
\n |
改行 |
\r |
キャリッジリターン |
参考
www.wakuwakubank.com
webplus8.com
www.gadgety.net