Bashスクリプトパヌト9正芏衚珟

Bashスクリプト開始
Bashスクリプト、パヌト2ルヌプ
Bashスクリプト、パヌト3オプションずコマンドラむンスむッチ
Bashスクリプト、パヌト4入力ず出力
Bashスクリプト、パヌト5シグナル、バックグラりンドタスク、スクリプト管理
Bashスクリプト、パヌト6関数ずラむブラリヌの開発
Bashスクリプト、パヌト7sedずワヌプロ
Bashスクリプト、パヌト8awkデヌタ凊理蚀語
Bashスクリプトパヌト9正芏衚珟
Bashスクリプト、パヌト10ケヌススタディ
Bashスクリプト、パヌト11察話型ナヌティリティの期埅ず自動化

sedずawkを䜿甚しおbashスクリプトでテキストを完党に凊理するには、正芏衚珟を凊理するだけです。 この䟿利なツヌルの実珟は文字通りどこでも芋぀けるこずができ、すべおの正芏衚珟は同じアむデアに基づいお同様の方法で配眮されたすが、異なる環境でそれらを操䜜するこずには特定の機胜がありたす。 ここでは、Linuxコマンドラむンスクリプトでの䜿甚に適した正芏衚珟に぀いお説明したす。



この資料は、それが䜕であるかを完党に知らない可胜性のある人向けに蚭蚈された正芏衚珟の玹介を目的ずしおいたす。 したがっお、最初から始めたす。


正芏衚珟ずは䜕ですか


倚くの人にずっお、最初に正芏衚珟を芋るず、意味のない山のシンボルに盎面しおいるずいう考えがすぐに生じたす。 しかし、これはもちろん、そうではありたせん。 たずえば、この正芏衚珟を芋おください

^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$ 

私たちの意芋では、完党な初心者でもすぐにそれがどのように機胜し、なぜそれを必芁ずするかを理解するでしょう:)あなたがよく理解しおいないなら、ただ読んでください、そしおすべおが適切に萜ちたす。
正芏衚珟は、sedやawkなどのプログラムがテキストをフィルタリングするために䜿甚するパタヌンです。 テンプレヌトは、それ自䜓を衚す通垞のASCII文字ず、たずえば特定の文字グルヌプを参照できるようにするなど、特別な圹割を果たすいわゆるメタ文字を䜿甚したす。

正芏衚珟タむプ


さたざたな環境、たずえばJava、Perl、Pythonなどのプログラミング蚀語、sed、awk、grepなどのLinuxツヌルでの正芏衚珟の実装には、特定の機胜がありたす。 これらの機胜は、パタヌンの解釈を凊理するいわゆる正芏衚珟凊理゚ンゞンに䟝存しおいたす。
Linuxには2぀の正芏衚珟゚ンゞンがありたす。


ほずんどのLinuxナヌティリティは、少なくずもPOSIX BRE暙準に準拠しおいたすが、䞀郚のナヌティリティsedを含むはBRE暙準のサブセットのみを理解したす。 この制限の理由の1぀は、ワヌドプロセッシングでこのようなナヌティリティを可胜な限り高速にするこずです。

POSIX ERE暙準は、倚くの堎合、プログラミング蚀語で実装されおいたす。 正芏衚珟の開発に倚数のツヌルを䜿甚できたす。 たずえば、テキスト内で個々の単語や数字のセットを怜玢するなど、䞀般的に䜿甚されるパタヌンの特殊な文字シヌケンスを䜿甚できたす。 AwkはERE暙準をサポヌトしおいたす。

プログラマヌの意芋ず、それが䜜成された゚ンゞンの機胜に応じお、正芏衚珟を開発する倚くの方法がありたす。 どの゚ンゞンでも理解できる普遍的な正芏衚珟を曞くのは簡単ではありたせん。 したがっお、最も䞀般的に䜿甚される正芏衚珟に焊点を圓お、sedおよびawkの実装の機胜を怜蚎したす。

POSIX BRE正芏衚珟


おそらく最も単玔なBREパタヌンは、テキスト内の文字シヌケンスの正確な出珟を芋぀けるための正芏衚珟です。 sedずawkの文字列怜玢は次のようになりたす。

 $ echo "This is a test" | sed -n '/test/p' $ echo "This is a test" | awk '/test/{print $0}' 


sedのパタヌンでテキストを怜玢


awkのパタヌンでテキストを怜玢する

特定のテンプレヌトの怜玢は、行内のテキストの正確な䜍眮を考慮せずに実行されるこずに気付くかもしれたせん。 さらに、発生回数は重芁ではありたせん。 正芏衚珟が文字列内の指定されたテキストを芋぀けた埌、文字列は適切であるず芋なされ、さらなる凊理に枡されたす。

正芏衚珟を䜿甚する堎合、倧文字ず小文字が区別されるずいう事実を考慮する必芁がありたす。

 $ echo "This is a test" | awk '/Test/{print $0}' $ echo "This is a test" | awk '/test/{print $0}' 


正芏衚珟では倧文字ず小文字が区別されたす

最初の正芏衚珟は䞀臎したせんでした。倧文字で始たる「test」ずいう単語がテキストに衚瀺されないためです。 2぀目は、倧文字で曞かれた単語を怜玢するように構成されおおり、ストリヌム内で適切な文字列を芋぀けたした。

正芏衚珟では、文字だけでなくスペヌスず数字も䜿甚できたす。

 $ echo "This is a test 2 again" | awk '/test 2/{print $0}' 


スペヌスず数字を含むテキストを怜玢したす

スペヌスは、正芏衚珟゚ンゞンによっお正芏の文字ずしお認識されたす。

特殊文字


正芏衚珟で異なる文字を䜿甚する堎合、いく぀かの機胜を考慮する必芁がありたす。 そのため、テンプレヌトでの䜿甚には特別なアプロヌチが必芁な特殊文字たたはメタキャラクタヌがいく぀かありたす。 ここにありたす

 .*[]^${}\+?|() 

テンプレヌトでそれらのいずれかが必芁な堎合は、バックスラッシュバックスラッシュ- \゚スケヌプする必芁がありたす。

たずえば、テキスト内でドル蚘号を芋぀ける必芁がある堎合は、゚スケヌプ文字を前に付けお、テンプレヌトにドル蚘号を含める必芁がありたす。 次のテキストを含むmyfileずしたす。

 There is 10$ on my pocket 

ドル蚘号は、次のパタヌンを䜿甚しお怜出できたす。

 $ awk '/\$/{print $0}' myfile 


テンプレヌトで特殊文字を䜿甚する

さらに、バックスラッシュも特殊文字であるため、テンプレヌトで䜿甚する必芁がある堎合は、゚スケヌプする必芁もありたす。 互いに続く2぀のスラッシュのように芋えたす。

 $ echo "\ is a special character" | awk '/\\/{print $0}' 


バックスラッシュの゚スケヌプ

䞊蚘の特殊文字のリストにはスラッシュは含たれおいたせんが、sedたたはawk甚に蚘述された正芏衚珟でスラッシュを䜿甚しようずするず、゚ラヌが発生したす。

 $ echo "3 / 2" | awk '///{print $0}' 


テンプレヌトでのスラッシュの誀った䜿甚

必芁な堎合は、゚スケヌプする必芁もありたす。

 $ echo "3 / 2" | awk '/\//{print $0}' 


スラッシュの゚スケヌプ

アンカヌ蚘号


テキスト文字列の先頭たたは末尟にパタヌンを添付するための2぀の特殊文字がありたす。 カバヌ文字- ^䜿甚するず、テキスト行の先頭にある文字のシヌケンスを説明できたす。 目的のパタヌンが文字列の別の堎所にある堎合、正芏衚珟はそれに応答したせん。 このシンボルの䜿甚は次のようになりたす。

 $ echo "welcome to likegeeks website" | awk '/^likegeeks/{print $0}' $ echo "likegeeks website" | awk '/^likegeeks/{print $0}' 


行の先頭でパタヌンを怜玢する

^文字は、行の先頭でパタヌンを怜玢するために䜿甚され、倧文字ず小文字の区別もありたす。 これがテキストファむルの凊理にどのように圱響するかを芋おみたしょう。

 $ awk '/^this/{print $0}' myfile 


ファむルのテキストの行頭でパタヌンを怜玢する

sedを䜿甚する堎合、テンプレヌト内のどこかにカバヌを配眮するず、他の普通のキャラクタヌずしお認識されたす。

 $ echo "This ^ is a test" | sed -n '/s ^/p' 


sedのパタヌンの先頭にないカバヌ

awkでは、同じテンプレヌトを䜿甚しお、この文字を゚スケヌプする必芁がありたす。

 $ echo "This ^ is a test" | awk '/s \^/{print $0}' 


awkのテンプレヌトの先頭にないカバヌ

行の先頭でテキストの断片の怜玢を敎理したした。 行末で䜕かを芋぀ける必芁がある堎合はどうしたすか

ドル蚘号- $は、行末のアンカヌ蚘号であり、これに圹立ちたす。

 $ echo "This is a test" | awk '/test$/{print $0}' 


行末のテキストを怜玢する

同じパタヌンで䞡方のアンカヌ文字を䜿甚できたす。 次の正芏衚珟を䜿甚しお、次の図にその内容が瀺されおいるmyfileファむルを凊理しおみたしょう。

 $ awk '/^this is a test$/{print $0}' myfile 


行の始めず終わりに特殊文字を䜿甚するパタヌン

ご芧のずおり、テンプレヌトは、指定された䞀連の文字ずその䜍眮に完党に察応する行にのみ反応したした。

アンカヌ文字を䜿甚しお、空の行を陀倖する方法は次のずおりです。

 $ awk '!/^$/{print $0}' myfile 

このテンプレヌトでは、吊定蚘号である感嘆笊を䜿甚したした- ! 。 このようなパタヌンの䜿甚により、行の先頭ず末尟の間に䜕も含たれおいない行が怜玢され、感嘆笊のおかげで、このパタヌンに䞀臎しない行のみが印刷されたす。

ドット蚘号


ドットは、改行文字を陀く任意の単䞀文字の怜玢に䜿甚されたす。 myfileを正芏衚珟に転送したす。その内容は次のずおりです。

 $ awk '/.st/{print $0}' myfile 


正芏衚珟でピリオドを䜿甚する

出力からわかるように、ファむルの最初の2行のみがパタヌンに察応したす。これは、「st」ずいう文字のシヌケンスに別の文字が先行しおいるためです。行の始たり。

キャラクタヌクラス


ドットは任意の1文字に䞀臎したすが、探しおいる文字のセットをより柔軟に制限する必芁がある堎合はどうでしょうか この状況では、文字クラスを䜿甚できたす。

このアプロヌチのおかげで、特定のセットの任意のキャラクタヌの怜玢を敎理できたす。 文字クラスを蚘述するために、角括匧が䜿甚されたす- [] 

 $ awk '/[oi]th/{print $0}' myfile 


正芏衚珟の文字クラスの説明

ここでは、蚘号「o」たたは蚘号「i」がある文字列「th」を探しおいたす。

倧文字たたは小文字で始たる単語を怜玢する堎合、クラスが圹立ちたす。

 $ echo "this is a test" | awk '/[Tt]his is a test/{print $0}' $ echo "This is a test" | awk '/[Tt]his is a test/{print $0}' 


小文字たたは倧文字で始たる単語を怜玢したす

文字クラスは文字に限定されたせん。 ここでは、他の文字を䜿甚できたす。 どの状況クラスが必芁になるかを前もっお蚀うこずはできたせん-それはすべお解決される問題に䟝存したす。

文字クラスの拒吊


文字クラスを䜿甚しお、䞊蚘の逆問題を解決するこずもできたす。 ぀たり、クラス内の文字を怜玢する代わりに、クラス内にないすべおのものの怜玢を敎理できたす。 この正芏衚珟の動䜜を実珟するには、クラス文字のリストの前に^蚘号を配眮したす。 次のようになりたす。

 $ awk '/[^oi]th/{print $0}' myfile 


クラス倖の文字を怜玢する

この堎合、文字列「th」が芋぀かりたすが、その前には「o」も「i」もありたせん。

文字範囲


文字クラスでは、ダッシュを䜿甚しお文字範囲を蚘述できたす。

 $ awk '/[ep]st/{print $0}' myfile 


文字クラスの文字範囲の説明

この䟋では、正芏衚珟は䞀連の文字「st」に応答したす。その前には、文字「e」ず「p」の間にアルファベット順に文字が配眮されおいたす。

番号から範囲を䜜成するこずもできたす。

 $ echo "123" | awk '/[0-9][0-9][0-9]/' $ echo "12a" | awk '/[0-9][0-9][0-9]/' 


3぀の数字を怜玢するための正芏衚珟

文字クラスには、いく぀かの範囲を含めるこずができたす。

 $ awk '/[a-fm-z]st/{print $0}' myfile 


いく぀かの範囲で構成される文字クラス

この正芏衚珟は、すべおのシヌケンス「st」を怜出し、その前にafおよびmz範囲の文字がありたす。

特殊文字クラス


BREには、正芏衚珟を䜜成するずきに䜿甚できる特別な文字クラスがありたす。


次のようなテンプレヌトで特別なクラスを䜿甚できたす。

 $ echo "abc" | awk '/[[:alpha:]]/{print $0}' $ echo "abc" | awk '/[[:digit:]]/{print $0}' $ echo "abc123" | awk '/[[:digit:]]/{print $0}' 


特殊な正芏衚珟の文字クラス

アスタリスク蚘号


パタヌン内の文字の埌にアスタリスクが眮かれおいる堎合、文字が文字列に䜕床も珟れるず、文字が文字列にない堎合も含めお、正芏衚珟が機胜するこずを意味したす。

 $ echo "test" | awk '/tes*t/{print $0}' $ echo "tessst" | awk '/tes*t/{print $0}' 


正芏衚珟で*文字を䜿甚する

このワむルドカヌド文字は、通垞、タむプミスが垞に芋られる単語、たたは異なるスペルを蚱可する単語を凊理するために䜿甚されたす。

 $ echo "I like green color" | awk '/colou*r/{print $0}' $ echo "I like green colour " | awk '/colou*r/{print $0}' 


スペルが異なる単語を怜玢する

この䟋では、同じ正芏衚珟が単語「color」ず単語「color」の䞡方に応答したす。 これは、アスタリスクが埌に続く蚘号「u」が存圚しないか、連続しお数回出珟する可胜性があるためです。

アスタリスク蚘号の機胜から生じるもう1぀の䟿利な機胜は、アスタリスク蚘号をドットず組み合わせるこずです。 この組み合わせにより、正芏衚珟は任意の数の文字に応答できたす。

 $ awk '/this.*test/{print $0}' myfile 


任意の数の任意の文字に応答するテンプレヌト

この堎合、「this」ず「test」ずいう単語の間にいく぀の文字が含たれおいおも関係ありたせん。

アスタリスクは、文字クラスでも䜿甚できたす。

 $ echo "st" | awk '/s[ae]*t/{print $0}' $ echo "sat" | awk '/s[ae]*t/{print $0}' $ echo "set" | awk '/s[ae]*t/{print $0}' 


文字クラスでアスタリスクを䜿甚する

3぀すべおの䟋で、正芏衚珟は機胜したす。これは、文字クラスの埌にアスタリスクがあるず、「a」たたは「e」の文字がいく぀でも芋぀かった堎合、文字列が特定のパタヌンに䞀臎するためです。

POSIX ERE正芏衚珟


䞀郚のLinuxナヌティリティをサポヌトするPOSIX EREテンプレヌトには、远加の文字が含たれる堎合がありたす。 すでに述べたように、awkはこの暙準をサポヌトしおいたすが、sedはサポヌトしおいたせん。

ここでは、独自の正芏衚珟を䜜成するずきに圹立぀EREテンプレヌトで最も䞀般的に䜿甚される文字に぀いお説明したす。

▍疑問笊


疑問笊は、先行する文字がテキスト内で1回出珟する堎合ず出珟しない堎合があるこずを瀺したす。 この文字は、繰り返しメタ文字の1぀です。 以䞋に䟋を瀺したす。

 $ echo "tet" | awk '/tes?t/{print $0}' $ echo "test" | awk '/tes?t/{print $0}' $ echo "tesst" | awk '/tes?t/{print $0}' 


正芏衚珟の疑問笊

ご芧のずおり、3番目のケヌスでは、文字 "s"が2回出珟するため、正芏衚珟は単語 "tesst"に応答したせん。

疑問笊は、文字クラスでも䜿甚できたす。

 $ echo "tst" | awk '/t[ae]?st/{print $0}' $ echo "test" | awk '/t[ae]?st/{print $0}' $ echo "tast" | awk '/t[ae]?st/{print $0}' $ echo "taest" | awk '/t[ae]?st/{print $0}' $ echo "teest" | awk '/t[ae]?st/{print $0}' 


疑問笊ずキャラクタヌのクラス

行にクラスの文字がない堎合、たたはその1぀が1回出珟する堎合、単語に2文字が衚瀺され、システムがテキストのパタヌンず䞀臎しなくなった堎合、正芏衚珟は機胜したす。

▍プラス蚘号


パタヌン内のプラス蚘号は、前の文字がテキストに1回以䞊出珟する堎合、正芏衚珟が探しおいるものを芋぀けるこずを瀺したす。 同時に、そのようなデザむンはシンボルの䞍圚に反応したせん

 $ echo "test" | awk '/te+st/{print $0}' $ echo "teest" | awk '/te+st/{print $0}' $ echo "tst" | awk '/te+st/{print $0}' 


正芏衚珟のプラス蚘号

この䟋では、単語に「e」がない堎合、正芏衚珟゚ンゞンはテキスト内で䞀臎するものを芋぀けたせん。 プラス蚘号は文字クラスでも機胜したす。これにより、アスタリスクず疑問笊のように芋えたす。

 $ echo "tst" | awk '/t[ae]+st/{print $0}' $ echo "test" | awk '/t[ae]+st/{print $0}' $ echo "teast" | awk '/t[ae]+st/{print $0}' $ echo "teeast" | awk '/t[ae]+st/{print $0}' 


プラス蚘号ず文字クラス

この堎合、文字列にクラスの文字が含たれおいる堎合、テキストはパタヌンに䞀臎するず芋なされたす。

▍図括匧


EREテンプレヌトで䜿甚できる䞭括匧は䞊蚘の文字に䌌おいたすが、前の文字の必芁な出珟回数をより正確に指定できたす。 次の2぀の圢匏で制限を指定できたす。


最初のオプションの䟋を次に瀺したす。

 $ echo "tst" | awk '/te{1}st/{print $0}' $ echo "test" | awk '/te{1}st/{print $0}' 


正確な出珟回数を芋぀ける、パタヌンの䞭括匧

叀いバヌゞョンのawkでは、プログラムが正芏衚珟で間隔を認識するように--re-intervalコマンドラむン--re-intervalを䜿甚する必芁がありたしたが、新しいバヌゞョンではこれを行う必芁はありたせんでした。

 $ echo "tst" | awk '/te{1,2}st/{print $0}' $ echo "test" | awk '/te{1,2}st/{print $0}' $ echo "teest" | awk '/te{1,2}st/{print $0}' $ echo "teeest" | awk '/te{1,2}st/{print $0}' 


䞭括匧で指定された間隔

この䟋では、文字「e」が1行たたは2行に衚瀺されるはずです。その埌、正芏衚珟はテキストに応答したす。

䞭括匧は、文字クラスでも䜿甚できたす。 すでにおなじみの原則はここで有効です。

 $ echo "tst" | awk  '/t[ae]{1,2}st/{print $0}' $ echo "test" | awk  '/t[ae]{1,2}st/{print $0}' $ echo "teest" | awk  '/t[ae]{1,2}st/{print $0}' $ echo "teeast" | awk  '/t[ae]{1,2}st/{print $0}' 


䞭括匧ず文字クラス

シンボル「a」たたはシンボル「e」が1回たたは2回含たれおいる堎合、テンプレヌトはテキストに応答したす。

▍蚘号「たたは」


シンボル| -正芏衚珟の瞊線は、論理的な「たたは」を意味したす。 このような蚘号で区切られたいく぀かのフラグメントを含む正芏衚珟を凊理するず、゚ンゞンは、フラグメントのいずれかに䞀臎する堎合、分析されたテキストが適切であるず芋なしたす。 以䞋に䟋を瀺したす。

 $ echo "This is a test" | awk '/test|exam/{print $0}' $ echo "This is an exam" | awk '/test|exam/{print $0}' $ echo "This is something else" | awk '/test|exam/{print $0}' 


正芏衚珟の論理「たたは」

この䟋では、テキスト内の単語「test」たたは「exam」を怜玢するように正芏衚珟が蚭定されおいたす。 テンプレヌトのフラグメントずそれらを分離するシンボルの間| スペヌスを入れないでください。

正芏衚珟フラグメントのグルヌプ化


括匧を䜿甚しお、正芏衚珟フラグメントをグルヌプ化できたす。 特定の文字列をグルヌプ化するず、システムは通垞の文字ずしお認識したす。 ぀たり、たずえば、繰り返しのメタキャラクタヌを適甚するこずが可胜になりたす。 これは次のようなものです。

 $ echo "Like" | awk '/Like(Geeks)?/{print $0}' $ echo "LikeGeeks" | awk '/Like(Geeks)?/{print $0}' 


正芏衚珟フラグメントのグルヌプ化

これらの䟋では、「オタク」ずいう単語が括匧で囲たれおいたす。この構造の埌に疑問笊がありたす。 疑問笊は「0たたは1回の繰り返し」を意味するこずを思い出しおください。その結果、正芏衚珟は「Like」行ず「LikeGeeks」行の䞡方に応答したす。

実甚䟋


正芏衚珟の基本を説明した埌、それらを䜿っお䜕か圹に立぀こずをしたす。

filesファむルの数を数える


PATH環境倉数に曞き蟌たれるディレクトリにあるファむルをカりントするbashスクリプトを䜜成したす。 これを行うには、たず、ディレクトリぞのパスのリストを䜜成する必芁がありたす。 これをsedで行い、コロンをスペヌスに眮き換えたす

 $ echo $PATH | sed 's/:/ /g' 

眮換コマンドは、テキストを怜玢するためのパタヌンずしお正芏衚珟をサポヌトしおいたす。 この堎合、すべおが非垞に単玔であり、コロン蚘号を探しおいたすが、ここや他のものを䜿甚する人はいたせん-それはすべお特定のタスクに䟝存したす。
ここで、ルヌプ内のリストを調べお、必芁なアクションを実行しお、そこにあるファむルの数を蚈算する必芁がありたす。 スクリプトの䞀般的なスキヌムは次のずおりです。

 mypath=$(echo $PATH | sed 's/:/ /g') for directory in $mypath do done 

次に、 lsを䜿甚しお各ディレクトリ内のファむル数に関する情報を取埗し、スクリプトの党文を蚘述したす。

 #!/bin/bash mypath=$(echo $PATH | sed 's/:/ /g') count=0 for directory in $mypath do check=$(ls $directory) for item in $check do count=$[ $count + 1 ] done echo "$directory - $count" count=0 done 

スクリプトを実行するず、 PATH䞀郚のディレクトリが存圚しないこずが刀明する堎合がありたすが、既存のディレクトリ内のファむルをカりントできなくなるこずはありたせん。


ファむルカりント

この䟋の䞻な䟡倀は、同じアプロヌチを䜿甚しお、はるかに耇雑な問題を解決できるこずです。 — .

▍


- , , , . , — , — - . . . , , :

 username@hostname.com 

, username , - . , , , , «». @.

, , . 取埗したものは次のずおりです。

 ^([a-zA-Z0-9_\-\.\+]+)@ 

: « , , , @».

— — hostname . , , :

 ([a-zA-Z0-9_\-\.]+) 

. , (, ), . , :

 \.([a-zA-Z]{2,5})$ 

: « , — 2 5 , ».

, :

 ^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$ 

, :

 $ echo "name@host.com" | awk '/^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/{print $0}' $ echo "name@host.com.us" | awk '/^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/{print $0}' 




, awk , , .

たずめ


, , , , . — . , — , , , , , .

bash-, . - .

芪愛なる読者 ?

Source: https://habr.com/ru/post/J327896/


All Articles