正規表現でのgrep(およびegrep)の使用

Using Grep With Regular Expressions



このチュートリアルでは、両方の使用方法について説明します グリップ (と egrep)t oファイル内のテキストを、単純な形式で、正規表現と組み合わせて検索します。それはいくつか含まれています 演習 、 もっと ソリューション 、視聴者が完了するために。

名前 グリップ ed(およびvim)コマンドg / re / pから取得されます。これは、特定の正規表現をグローバルに検索し、出力を出力(表示)することを意味します。







通常

ユーティリティを使用すると、ユーザーはテキストファイルで正規表現に一致する行を検索できます( 正規表現 )。正規表現は、テキストと1つ以上の11個の特殊文字で構成される検索文字列です。簡単な例は、行の先頭を一致させることです。



サンプルファイル

の基本形 グリップ 特定の1つまたは複数のファイル内の単純なテキストを検索するために使用できます。例を試すために、最初にサンプルファイルを作成します。



nanoやvimなどのエディターを使用して、以下のテキストをというファイルにコピーします。 myfile





xyz
xyzde
exyzd
dexyz
d?gxyz
xxz
xzz
x z
x * z
xz
x z
XYZ
XYYZ
xYz
xyyz
xyyyz
xyyyyz

例をコピーしてテキストに貼り付けることはできますが(二重引用符は正しくコピーされない場合があることに注意してください)、正しく学習するにはコマンドを入力する必要があります。

例を試す前に、サンプルファイルを確認してください。



$myfile

簡単な検索

ファイル内のテキスト「xyz」を見つけるには、次のコマンドを実行します。

$グリップxyz myfile

色の使用

色を表示するには、–color(二重ハイフン)を使用するか、単にエイリアスを作成します。例えば:

$グリップ - 色xyz myfile

また

$エイリアス グリップ= ’グリップ - 色'
$グリップxyz myfile

オプション

で使用される一般的なオプション グリップ コマンドが含まれます:

  • -私はすべての行を見つけます 関係なく 事例の
  • -NS カウント テキストを含む行数
  • -n表示行 数字 一致する行の
  • -l表示のみ ファイル 名前 その一致
  • -NS 再帰的 サブディレクトリの検索
  • -vすべての行を検索 いいえ テキストを含む

例えば:

$グリップ -私xyz myfile#大文字と小文字を区別せずにテキストを検索

$グリップ -ICxyz myfile#テキスト付きの行を数える

$グリップ -のxyz myfile#行番号を表示

複数のファイルを作成する

複数のファイルを検索する前に、まずいくつかの新しいファイルを作成します。

$捨てたxyz>>myfile1
$捨てた -とxyz nxzz nXYZ>>myfile2
$捨てた -とxxx nyyy>>myfile3
$myfile1
$myfile2
$myfile3

複数のファイルを検索

ファイル名またはワイルドカードを使用して複数のファイルを検索するには、次のように入力します。

$グリップ -ICxyz myfile myfile1 myfile2 myfile3
$グリップ -のxyz my*
#「my」で始まるファイル名に一致

演習I

  1. まず、ファイル/ etc / passwdにある行数を数えます。
ヒント:使用トイレ -NS /NS/passwd
  1. ここで、テキストのすべての出現箇所を検索します どこ ファイル/ etc / passwd内
  2. ファイル内のテキストが含まれている行数を検索します
  3. テキストが含まれていない行数を検索します どこ
  4. ログイン用のエントリを / etc / passwd

運動の解決策は、この記事の最後にあります。

正規表現の使用

コマンド グリップ 11個の特殊文字または記号の1つまたは複数を使用して検索を絞り込むことにより、正規表現で使用することもできます。正規表現は、次のようなユーティリティ内でパターンマッチングを可能にする特殊文字を含む文字列です。 グリップ私が来たsed 。文字列は引用符で囲む必要がある場合があることに注意してください。

使用可能な特殊文字は次のとおりです。

^ 行の開始
$ 行の終わり
任意の文字( n改行を除く)
* 前の式が0個以上
記号の前に置くと、文字通りの文字になります

コマンドラインで使用できる*は、noneを含む任意の数の文字と一致することに注意してください。 いいえ ここでも同じように使用されます。

次の例では、引用符の使用にも注意してください。

^文字を使用してテキストで始まるすべての行を検索するには:

$グリップ‘^ xyz’ myfile

$文字を使用してテキストで終わるすべての行を検索するには:

$グリップ‘xyz $’ myfile

^文字と$文字の両方を使用して文字列を含む行を検索するには:

$グリップ‘^ xyz $’ myfile

を使用して行を検索するには 任意の文字に一致させる:

$グリップ‘^ x.z’ myfile

*を使用して前の式の0個以上に一致する行を検索するには:

$グリップ‘^ xy*z’myfile

。*を使用して0個以上の任意の文字に一致する行を検索するには:

$グリップ‘^ X。*z’myfile

を使用して行を検索するには *文字をエスケープするには:

$グリップ‘^ X *z’myfile

文字を見つけるには、次を使用します。

$グリップ‘\’ myfile

式grep– egrep

NS グリップ コマンドは、使用可能な正規表現のサブセットのみをサポートします。ただし、コマンド egrep:

  • すべての正規表現をフルに活用できます
  • 複数の式を同時に検索できます

式は引用符で囲む必要があることに注意してください。

色を使用するには、–colorを使用するか、エイリアスを再度作成します。

$エイリアス egrep='egrep --color'

複数を検索するには 正規表現 NS egrep コマンドは複数行にまたがって書くことができます。ただし、これは次の特殊文字を使用して実行することもできます。

| どちらか一方の交代
(…) 式の一部の論理グループ化
$egrep '(^ root | ^ uucp | ^ mail)' /NS/passwd

これにより、root、uucp、またはmailで始まる行がファイル|から抽出されます。オプションのいずれかを意味する記号。

次のコマンドは いいえ メッセージは表示されませんが、基本的なので動作します グリップ コマンドはすべての正規表現をサポートしているわけではありません。

$グリップ '(^ root | ^ uucp | ^ mail)' /NS/passwd

ただし、ほとんどのLinuxシステムでは、コマンド grep -E 使用するのと同じです egrep

$グリップ -と '(^ root | ^ uucp | ^ mail)' /NS/passwd

フィルタの使用

配管 は、あるコマンドの出力を別のコマンドへの入力として送信するプロセスであり、利用可能な最も強力なLinuxツールの1つです。

パイプラインに表示されるコマンドは、多くの場合、変更されたストリームを標準出力に送信する前に、渡された入力をふるいにかけるか変更するため、フィルターと呼ばれることがよくあります。

次の例では、からの標準出力 ls -l 標準入力としてに渡されます グリップ 指図。からの出力 グリップ 次に、コマンドが入力として もっと 指図。

これにより、内のディレクトリのみが表示されます /NS

$ls -NS /NS|グリップ‘^ d’|もっと

次のコマンドは、フィルターの使用例です。

$ps -ef|グリップcron

$|グリップkdm

サンプルファイル

レビュー演習を試すには、最初に次のサンプルファイルを作成します。

nanoやvimなどのエディターを使用して、以下のテキストをというファイルにコピーします。 人:

パーソナルJ.スミス25000
パーソナルE.スミス25400
トレーニングA.ブラウン27500
トレーニングC.Browen23400
(管理者)R.Bron 30500
Goodsout T.Smyth 30000
パーソナルF.ジョーンズ25000
トレーニング* C.Evans 25500
Goodsout W.Pope 30400
グラウンドフロアT.スマイス30500
パーソナルJ.マラー33000

演習II

  1. ファイルを表示する その内容を調べます。
  2. 文字列を含むすべての行を検索します スミス ファイルpeople.Hint:コマンドgrepを使用しますが、デフォルトでは大文字と小文字が区別されることに注意してください。
  3. 文字列で始まるすべての行を含む新しいファイルnpeopleを作成します 個人的 peopleファイル内。ヒント:コマンドgrepを>とともに使用します。
  4. ファイルをリストして、ファイルnpeopleの内容を確認します。
  5. ここで、テキストが文字列で終わるすべての行を追加します 500 ファイルpeopleからファイルnpeople.Hint:コマンドgrepを>>で使用します。
  6. ここでも、ファイルをリストして、ファイルnpeopleの内容を確認します。
  7. ファイルに保存されているサーバーのIPアドレスを検索します / etc / hosts .Hint:$(hostname)でコマンドgrepを使用します
  8. 使用する egrep から抽出するには / etc / passwd を含むファイルアカウント行 lp またはあなた自身 ユーザーID

運動の解決策は、この記事の最後にあります。

より正規表現

正規表現は、ステロイドのワイルドカードと考えることができます。

特別な意味を持つ11文字があります:開始と終了の角括弧[]、円記号、キャレット^、ドル記号$、ピリオドまたはドット。、縦棒またはパイプ記号|、疑問符?、アスタリスクまたはスター*、プラス記号+、および開始と終了の丸括弧{}。これらの特殊文字は、メタ文字とも呼ばれます。

特殊文字の完全なセットは次のとおりです。

^ 行の開始
$ 行の終わり
任意の文字( n改行を除く)
* 前の式が0個以上
| どちらか一方の交代
[…] 一致する明示的な文字セット
+ 前の式の1つ以上
前の式の0または1
記号の前に置くと、文字通りの文字になります
{…} 明示的な数量詞表記
(…) 式の一部の論理グループ化

のデフォルトバージョン グリップ 正規表現のサポートは限られています。次のすべての例を機能させるには、次を使用します。 egrep 代わりにまたは grep -E

を使用して行を検索するには | いずれかの式に一致する:

$egrep‘xxz|xzz’myfile

|を使用して行を検索するには文字列内のいずれかの式に一致させるには、()も使用します。

$egrep‘^ X((Yz|yz)。’myfile

[]を使用して任意の文字に一致する行を検索するには:

$egrep‘^ X[Yy]z’myfile

[]を使用してどの文字とも一致しない行を検索するには:

$egrep‘^ X[^ Yy]z’myfile

*を使用して前の式の0個以上に一致する行を検索するには:

$egrep‘^ xy*z’myfile

+を使用して前の式の1つ以上に一致する行を検索するには、次のようにします。

$egrep‘^ xy + z’ myfile

?を使用して行を検索するには前の式の0または1に一致させるには:

$egrep‘^ xy?z’ myfile

演習III

  1. 名前を含むすべての行を検索します エヴァンス また 画家 ファイルの人々で。
  2. 名前を含むすべての行を検索します スミス、スミス また スマイス ファイルの人々で。
  3. 名前を含むすべての行を検索します ブラウン、ブローウェン また ソース ファイルの人々。時間があれば:
  4. 文字列を含む行を検索します (管理者)、 ファイルの人々の括弧を含む。
  5. ファイルpeopleで文字*を含む行を見つけます。
  6. 上記の5と6を組み合わせて、両方の式を見つけます。

その他の例

を使用して行を検索するには および*任意の文字セットに一致する場合:

$egrep‘^ xy。*z’myfile

{}を使用してN個の文字に一致する行を検索するには:

$egrep‘^ xy{{3}z’myfile
$egrep‘^ xy{{4}z’myfile

{}を使用してN回以上一致する行を検索するには、次のようにします。

$egrep‘^ xy{{3}z’myfile

{}を使用してN回一致するが、M回以下の行を検索するには:

$egrep‘^ xy{{23}z’myfile

結論

このチュートリアルでは、最初に使用方法を確認しました グリップ 1つのファイルまたは複数のファイル内のテキストを検索する簡単な形式です。次に、検索するテキストを単純な正規表現と組み合わせてから、を使用してより複雑な正規表現を組み合わせました。 egrep

次のステップ

ここで得た知識を生かしていただければ幸いです。試してみる グリップ 独自のデータに対するコマンドであり、ここで説明されている正規表現は、 私達sedawk

エクササイズソリューション

演習I

まず、ファイルの行数を数えます / etc / passwd
$ wc -l /etc/passwd
ここで、テキストのすべての出現箇所を検索します どこ ファイル/ etc / passwdにあります。
$ grep var /etc/passwd
ファイル内のテキストが含まれている行数を検索します どこ

グリップ -NSどこ/NS/passwd

テキストが含まれていない行数を検索します どこ

グリップ -履歴書どこ/NS/passwd

ログイン用のエントリを / etc / passwd ファイル
grep kdm /etc/passwd

演習II

ファイルを表示する その内容を調べます。
$ cat people
文字列を含むすべての行を検索します スミス ファイル内
$ grep 'Smith' people
新しいファイルを作成し、 npeople 、文字列で始まるすべての行を含む 個人的 の中に ファイル
$ grep '^Personal' people> npeople
ファイルの内容を確認してください npeople ファイルをリストすることによって。
$ cat npeople
ここで、テキストが文字列で終わるすべての行を追加します 500 ファイル内 ファイルに npeople
$ grep '500$' people>>npeople
もう一度、ファイルの内容を確認します npeople ファイルをリストすることによって。
$ cat npeople
ファイルに保存されているサーバーのIPアドレスを検索します / etc / hosts
$ grep $(hostname) /etc/hosts
使用する egrep から抽出するには / etc / passwd を含むファイルアカウント行 lp または独自のユーザーID。
$ egrep '(lp|kdm:)' /etc/passwd

演習III

名前を含むすべての行を検索します エヴァンス また 画家 ファイル内
$ egrep 'Evans|Maler' people
名前を含むすべての行を検索します スミススミス また スマイス ファイル内
$ egrep 'Sm(i|y)the?' people
名前を含むすべての行を検索します 茶色ブローウェン また ソース ファイルの人々で。
$ egrep 'Brow?e?n' people
文字列を含む行を検索します (管理者)、 ファイル内の角かっこを含む

$egrep '(管理者)'

文字を含む行を検索します * ファイルの人々で。
$ egrep '*' people
上記の5と6を組み合わせて、両方の式を見つけます。

$egrep '(管理者)| *'