LPIC-1 - 101試験 - 103:GNUとUnixのコマンド - 103.7 正規表現を使用してテキストファイルを検索する

Last Update : September 18 2014 21:34:21

     

a. 正規表現

正規表現とは、「いくつかの文字列を一つの形式で表すための表現方法」です。
正規表現を使うことで、たくさんの文章の中から的確に特定のパターンを持つ文字列を検索することができます。

パターンを表現するための特別な文字をメタ文字と言い以下の文字が使用されます。

● メタ文字
メタ文字 意味 記述例 記述例の意味
. 任意の一文字 A .. D Aで始まり、Dで終わる4文字の文字列
(文字列) 文字列を1つのパターンとして扱う (ABCD) ABCDをパターンとする
+ 直前の文字やパターンの1回以上の繰り返し ABX+ ABとXの1回以上の繰り返し
ABX , ABXX , ABXXX
(AB)+ パターンABの1回以上の繰り返し
AB , ABAB , ABABAB
* 直前の文字やパターンの0回以上の繰り返し ABX* ABとXの0回以上の繰り返し
AB , ABX , ABXX , ABXXX
? 直前の文字やパターンの0または1回の繰り返し ABCD? ABCまたはABCD
次に続く文字またはメタ文字ではなく、文字そのものとして扱う AB¥* 文字列AB*
| 文字やパターンの選択 A | B AまたはB
(AB)|(CDE) パターンABまたはCDE
[ ] [ ]の中のどれか1文字
文字クラス
[1-9] 1から9までのいずれか1文字
[ABCD] A,B,C,Dいずれか1文字
[A-D]
^ 行頭 ^A 行の先頭がAで始まる
$ 行末 Z$ 行の終わりがZのもの

メタ文字自体を文字として扱う場合は、「 \ 」バックスラッシュに続けてメタ文字を記述します。ただし、\ が有効なのは直後の1文字だけです。メタ文字1字に対してひとつの \ が必要です。



1. grep コマンド

grep コマンドは、ファイルに対してパターンマッチングを行い、マッチする行を出力します。 一部の正規表現を使用することが可能です。検索対象が指定されない場合は、標準入力に対してパターンマッチングを行います。複数のファイルを同時に検索することも可能です。

● grep コマンド構文
  grep [オプション] [検索文字列] [ファイル名]

● grep コマンドオプション
 -b行のブロック番号をつける
 -cパターンに一致した行の行数のみを出力する
 -h複数ファイルを指定した際に、ファイル名を出力しない
 -i大文字と小文字を区別しない
 -lパターンに一致した行を含むファイル名だけを出力する
 -nパターンに一致した行のファイル内での行番号を表示する
 -sエラーメッセージのみを表示する
 -vパターンに一致しない行を表示する

# cat test1.txt
acaba
acdtj
abcfp
bcaca
vhsir
babca
# grep 'abc' test1.txt  <--- 文字列abcを含む行を検索する
abcfp
babca 
# grep '^abc' test1.txt  <--- 先頭の文字列abcを含む行を検索する
abcfp
# grep '[^abc]' test1.txt  <--- 文字 a , b , c 以外の文字を含む行を検索する
acdtj
abcfp
vhsir


2. egrep コマンド

egrep も文字列検索で使いますが、複数の検索が一度にできます。 grepよりも高度な正規表現を使用できます。

● egrep コマンド構文
 egrep [オプション] [検索文字列パターン] ファイル

● egrep コマンドオプション
 -i 検索する際、アルファベットの大文字小文字を区別しない。
 -n マッチした行の行番号も表示する。
 -c マッチした行数を出力する。
 -v マッチしない行を出力する。
 -[数値] マッチした行の前後[数値]行も出力する。
 -A [数値] マッチした行の後[数値]行も出力する。
 -B [数値] マッチした行の前[数値]行も出力する。

● egrepで使用できる正規表現
 ^ 行頭
 $ 行末
 . 任意の一文字
 [ABC] ABCのいずれか
 [A-Z] A~Zの範囲いずれか
 [^ABC] ABCいずれでもない
 [^A-Z] A~Zの範囲いずれでもない
 + 1回以上の繰り返し
 * 0回以上の繰り返し
 {n} n回の繰り返し
 {n}, n回以上の繰り返し
 {n,m} n回以上m回以下の繰り返し
 r1|r2 正規表現r1かr2のいずれか
※正規表現を使用する際は検索文字列パターンを''で囲む。

● file01内の3桁の数字を含む行を出力する。
$ egrep '[0-9]{3}' file01

● file01内のtest01又はTest02という文字列を含む行を出力する。
$ egrep 'test01|Test02' file01

● file01内の..
$ egrep '[0-9]{5,}ミリ秒' file01

grep 'CT001.+str1|CT001.+str2' file01


3. fgrep コマンド

正規表現で使用するメタ文字という特殊な文字(\、[、]、^、$、*、.など)を含む文字列を検索する際はメタ文字の前にバックスラッシュ(\)を付けなければなりません。メタ文字が少数であれば問題ありませんが、数が多くなるとバックスラッシュでエスケープするのが大変です。そんなときは、正規表現をサポートしないgrepである fgrep コマンドを使います。fgrepを使う場合は、メタ文字をエスケープしなくても検索ではます。

例えば、「********」という文字を検索する場合、grepコマンドでは、

$ grep "\*\*\*\*\*\*\*\*" file01

としなければならないが、fgrepコマンドならば、

$ fgrep "********" file01


4. sed コマンド

sed コマンドは、ファイルを読み込み、指定されたスクリプトに従って文字列の置換、行の削除をします。
結果は標準出力(ディスプレイ)に表示されます。もし、ファイルに保存したい場合は出力のリダイレクトを利用します。


● sed コマンド構文
  sed [オプション] [スクリプト] ファイル名

● sed コマンドオプション
 -e 条件式指定した条件式で変換処理を行う
 -f ファイル名指定したファイルに記述されているコマンドや条件式に従って処理を行う

● sed スクリプト
 行数 処理する行数を指定する
 行数,行数 指定した行数間の文字列を処理する。$を指定すると最後の行を表せる
 /文字列/ 指定した文字列が現れる行を処理する。先頭に「^」を付けると指定した文字列から始まる行、末尾に「$」を付けると指定した文字列で終わる行が対象になる。行数の範囲指定でも利用できる
 d 指定された行を出力しません。
 s/検索パターン/置換パターン/[g] 検索パターンにマッチする文字列を置換パターンに変換します。
検索パターンにマッチする部分が1行の中に複数個所あっても最初の1ヶ所しか置換しません。マッチするすべての部分を置換するには g を末尾に記述してください。g の代わりに数字を末尾に記述すると数字番目のものを置換します。
 y/検索文字列/置換文字列/ 1文字ずつ検索して置換します。、検索文字列の中の文字とマッチする文字が見つかった場合、検索文字列の検索文字の位置と同じ位置の置換文字列の文字と置き換えます。

# cat test1.txt
acaba
acdtj
abcfp
bcaca
vhsir
babca
# sed '2,4d' test1.txt  <--- 2~4行目を削除します
acaba
vhsir
babca
# sed s/ca/wz/ test1.txt  <--- 文字列caを文字列wzに置換する
awzba
acdtj
abcfp
bwzca  <--- 文字列caが残っている
vhsir
babwz
# sed s/ca/wz/g test1.txt  <--- 文字列caすべてを文字列wzに置換する
awzba
acdtj
abcfp
bwzwz
vhsir
babwz
# sed y/abc/123/ test1.txt  <--- 文字 a は 1, b は 2 , c は 3 に置換する
13121
13dtj
123fp
23131
vhsir
21231

z. 出題範囲概要

●説明 正規表現を使用してファイルおよびテキストデータを操作する。これには、いくつかの表記要素から成る簡単な正規表現の作成も含まれる。また、正規表現ツールを使用して、ファイルシステムまたはファイルの内容からの検索を実行することも含まれる。
●主要な知識範囲
いくつかの表記要素から成る簡単な正規表現を作成する
正規表現ツールを使用して、ファイルシステムまたはファイルの内容からの検索を実行する
●重要なファイル、用語、ユーティリティ
grep, egrep, fgrep, sed, regex(7)


  [ 例題 ] 
  1. 101:103.7 問01  fgrepコマンド
  2. 101:103.7 問02  sedコマンド
  3. 101:103.7 問03  正規表現
  4. 101:103.7 問04  文字列の置換
  5. 101:103.7 問05  正規表現
  6. 101:103.7 問06  パターンマッチング
  7. 101:103.7 問07  文字列の置換


     

www.it-shikaku.jp