Linux – 正規表現によるテキストファイルの検索 (grep / egrep / fgrep / sed)

Linux技术

 ◆ 正規表現

正規表現は任意の文字列パターンを表す表記方法です。正規表現はシェルのメタキャラクタと似ています。

正規表現 説明
*  直前の文字の0回以上の繰り返し
例 : 
1*3.txt は、13.txt、123.txt などを表す。
.  任意の1文字の文字列
例 : 
1..4.txt は、1234.txt、1ab4.txt などを表す。
[ ]  [ ] 内の任意の1文字の文字列
例 : 
1[23]4.txt は、124.txt または 134.txt を表す。
^  行頭
例 : 
^1 は、行頭にある 1 を表す。
$  行末
例 : 
1$ は、行末にある 1 を表す。

 ※ 直前に (半角のバックスラッシュ)を入力することで通常の文字として処理します。\は日本キーボードではとなります。

以下の「 + 」、「 ? 」、「 | 」 の3つは拡張正規表現と呼ばれる新しい表現です。

拡張正規表現 説明
+  直前の文字の1回以上の繰り返し
?  直前の文字の0回、もしくは1回の繰り返し
|  前後のいずれかの文字列

 ◆ メタキャラクタと正規表現の違い

表現方法 説明
メタキャラクタ  シェルにおいて、特別な意味を持つ記号のこと。
正規表現  文字列のパターンを表す時に利用される表現方法。

 

 ◆ grepコマンド

grepコマンドは、指定した文字列を含む行を出力するコマンドです。

 ◆ 構文 : grep [ オプション ] 検索文字列 ファイル名

オプション 説明
-c  パターンがマッチした行の行数だけを表示
-f  ファイルから検索パターンを読み込む
-i  大文字小文字を区別せずに検索
-n  検索結果と合わせて行番号も表示
-v  パターンがマッチしない行の表示
-E  拡張正規表現の使用。egrepコマンドを使用する場合と同じ。
-F  検索文字列を正規表現ではなく固定文字列として認識。fgrepコマンドを使用する場合と同じ。

※ grepで正規表現を使用する場合、正規表現の部分を「 ‘ 」で囲むことで、シェルのメタキャラクタとして解釈されなくなる。

 ◆ 実行例 : data.txt ファイルから、大文字小文字に関係なく abc という文字列を検索

 grep -i abc data.txt


※ 上記コマンドにより合致する文字列は、abc、ABC、Abc、ABc、aBC、abC、aBc、AbC のいずれかがマッチします。

 ◆ egrepコマンド

egrepコマンドは「 + 」、「 ? 」、「 | 」などの拡張正規表現を使用する際に使用するコマンドです。
ただし、拡張正規表現は、
grep -Eコマンドでも使用することも可能です。

 ◆ 構文 : egrep [ オプション ] 検索文字列 ファイル名

◆ fgrepコマンド

fgrepコマンドは検索文字列に正規表現を使用せず、固定文字列として検索する場合に使用するコマンド。
 grep -Fコマンドを使用する場合や正規表現の「 \ 」を用いた場合と同じ機能を持つコマンドです。

 ◆ 構文 : fgrep [ オプション ] 検索文字列 ファイル名

 ◆ 実行例 : “data.txt”ファイルから、「 * 」 を文字列として検索

 fgrep ‘*’ data.txt

 ◆ sed コマンド

sed コマンドは、テキストストリームに対して編集を行うコマンド。

 ◆ 構文 : sed [ オプション ] -f スクリプト [ ファイル ]

オプション 説明
-f ファイル  コマンドが書かれたスクリプトファイルを指定

◆ 構文 : sed [ オプション ] コマンド [ ファイル ]
◆ 構文 : sed [ オプション ] -e コマンド1 -e コマンド2 [ ファイル ]

オプション 説明
d  マッチした行の削除。「 “開始行,終了行d” 」 と指定することで削除を行う。
s  パターンに基づいた置換。「 s/検索パターン/置換パターン 」 と指定することで置換を行う。
y  文字の変換。「 y/検索文字/置換文字 」 と指定することで置換を行う。

 ◆ 実行例 : data1.txt ファイルの1行目から3行目を削除し、data2.txt ファイルとして保存

 sed ‘1,3d’ data1.txt > data2.txt

 ◆ 実行例 : data.txt ファイルの abc に合致する部分を ABC に置換

 sed s/abc/ABC/ data.txt

 ◆ 実行例 : data.txt ファイルにおいて「1 を a」、「2 を b」、「3 を c」に置換

 sed y/123/abc/ data.txt