1、「test.txt」ファイルから、「PINGT」または「pingt」という文字列を含まない行を抽出したい。
・grep -Ev ‘PINGT|pingt’ test.txt
・egrep -v ‘PINGT|pingt’ test.txt
解説:
ファイルや標準入力から、正規表現のパターンにマッチする文字列を含む行を抽出するにgrepコマンドを利用します。
grep [オプション]検索パターン「ファイル名」
オプション 説明
-c マッチした行の行数のみ表示
-f 検索パターンをファイルから読み込む
-i 大文字と小文字を区別しない
-n 先頭に行番号をつけて、マッチした行を表示
-v マッチしなっかた行を表示
-E 拡張正規表現を使用(egrepコマンドと同様)
-F 検索パターンを正規表現ではなく、固定文字列とする(fgrepコマンドと同様)
参考:
正規表現とは、文字列の特定のパターンを認識するために使用する表現方法です。文字列の検索や置換などを行う際に利用します。正規表現には基本正規表現(BRE:Basic Regular Expression)と拡張正規表現(ERE:Extended Regular Expression)があります。
以下は主な正規表現とその使用例をまためたものです。
記号 説明 使用例
. 任意の1文字 a.. aから始まる3文字(aaa,abcなど)
* 直前の文字の0回以上の繰り返し .* 任意の文字列
[] []内のいずれか1文字 [abc] a,b,cのどれか1文字
[]内では、以下の表現と併用可能
- 範囲指定 [a-z] 小文字のアルファベット1文字
^ 先頭にある場合は後続の文字以外 [^abc] a,b,c 以外のどれか1文字
^ 行頭 ^a aから始まる行
$ 行末 a$ aで終わる行
\ 次の1文字をエスケープ \*
(通常の文字として処理) *という文字
+ 直前の文字の1回以上の繰り返し a+/
[拡張正規表現] aを1回以上繰り返す文字列(a,aa,aaaなど)
? 直前の文字の0回もしくは1回の繰り返し windows? windowsのsが0または1文字
[拡張正規表現] (window,windows)
| 右左いずれかの文字列 abc|xyz
[拡張正規表現] abcまたはxyz
正規表現には次のような基本の概念があります。
・特殊文字
「|」や「\(エスケープ文字)」などのように特殊な意味を持つ文字のことです。
・文字クラス
「[]」内の文字集合のことです。
・数量詞
「*」や「+」などのように文字列内での位置を示す文字のことです。
・アンカー
「^」や「$」などのように文字列内での位置を示す文字のことです。
なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なる
ので注意してください。シェルは「*」を0文字以上の文字列を解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「”」(ダブルクォーテーション)の
引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタ
として扱われなくなります。
正規表現を利用する主なコマンドは以下のとおりです。
・grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
なお、「-E」オプションを併用すると拡張正規表現が使えます(egrepコマンドと同様)。
・sed
ファイルや標準入力の内容を編集して表示するコマンド
例1)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合
$grep "[1-5]" test.txt
例2)「test.txt」ファイルの「#」から始まる行を削除して出力する場合
$sed '/^#/d' test.txt
基本正規表現と拡張正規表現の違いに注意してください。grepコマンドは、-Eオプションを
付けないと検索パターンを基本正規表現と判断しますので、上表の拡張正規表現が使えません。