LinuC-1 - 101試験 - 1.03:GNUとUnixのコマンド - 1.03.4 正規表現を使用したテキストファイルの検索

Last Update : August 21 2022 17:47:13

     

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


z. 出題範囲概要

概要 :
  • 正規表現を使用してファイルおよびテキストデータを操作できる。これには、いくつかの表記要素を含む単純な正規表現の作成も含まれる。また、正規表現ツールを使用して、ファイルシステムまたはファイルの内容からの検索を実行することも含まれる。

詳細 :
  • いくつかの表記要素を含む単純な正規表現を作成する。
    sed, regex(7)
  • 正規表現ツールを使用して、ファイルシステムまたはファイルの内容からの検索を実行する。
    grep, egrep, fgrep

  [ 例題 ] 


         

    www.it-shikaku.jp