2013-01-08 18 views
5

awkコマンド内のパターンに一致しますアンダースコアで区切られています。例えば正規表現は、私は次のパターンにマッチする正規表現を記述する必要が

: は、私は次のようにマッチする正規表現が必要です。

fltr_desc_name 
fltr_nameone_nametwo 
fltr_level_name_desc 

を、私は「もし」「AWK」の文の中にそれを使用しています:元について :

awk '/Transformation/ { if ($4=="Filter" && $5=="fltr_*") print $4,$5 }' filename 

正規表現を書いて助けてください、そして、 "awk"コマンドの中の "if"条件の中で正規表現を使う方法を教えてください。ありがとうございました。

+1

あなたがこれまでに試してみました何!!なぜ正規表現か。そのために文字列関数を使用する – diEcho

+0

こんにちは:) 私は正規表現を使用して、tranformationフィールドのタイプがFilter(つまり、$ 4、fileで指定された4番目のフィールド)の行をすべて検索しています。$ 5はフォーマットのshld b "fltr_followedbyanywrdsseparatedbyunderscore"私は質問に示されているようにawk cmdを使用していましたが、私は行をマッチさせることができませんでした。 – Karthik

答えて

4

あなたはifステートメントを使用する

awk '/Transformation/ && $4=="Filter" && match($5, /^fltr_[A-Za-z_]+/) { print $4,$5 }' filename 

必要がありませんを使用することができ、あなただけの上記のあたりなど、複数の一致条件を使用することができます。 matchは、正規表現^fltr_[A-Za-z_]+の一致場所を$5に返します。一致しない場合は0を返します。 0はfalseと評価し、それ以外は真とします。

+0

ありがとうございます。それはうまくいった:)歓声 – Karthik

+2

@Karthikマッチ()は不要です。あなたの主な問題は、単にRE比較演算子(〜)の代わりに文字列比較演算子(==)を使用していたことでした。本当の解決策を投稿します。 –

+0

@EdMorton、nice - 'man awk'で正規表現演算子を探していましたが、他の演算子の中にはリストされていませんでしたので、私はそれを逃して、代わりに' match'に行きました。ありがとう! –

1

fltr_[a-zA-Z_]+[a-zA-Z]

たり、文字列から一致させたい場合にのみ、文字列の末尾に起動します。あなたが書き込みのために良いプログラムが必要な場合

^fltr_[a-zA-Z_]+[a-zA-Z]$

+0

+1を明示していないにもかかわらず、アンダースコアで終わらないと+1 –

+0

@ sharp12345、ありがとうございます。 :) – Karthik

0

は、あなただけのfltr_\w+

を使用することができますし、正規表現をテストする。これを試してみてください:http://gskinner.com/RegExr/

+0

OPは、perlではなくawkを求めています。 –

+0

@selltheworldあなたの提案とリンクをありがとう: – Karthik

0

この

^fltr[_\d\w]+$ 

を試してみてくださいそれはあなたが必要とするすべてを、かかります。

+0

OPは、perlではなくawkを求めています。さらに、 '\ w'には既に' _'と '\ d'が含まれています - http://perldoc.perl.org/perlrecharclass.html#Word-characters –

+0

@og Grand、あなたの答えをありがとう。私もあなたの提案をお試しになります:) – Karthik

7
awk '/Transformation/ && $4=="Filter" && $5~/^fltr_[[:alpha:]_]+/ { print $4,$5 }' filename 
+1

ロケール対応文字クラスを使用する場合は+1。一般性のために、私は '[:alnum:]'を使用したいと思います。 –

+1

OPは、文字列に "アンダースコアで区切られた単語"が含まれていると言っていました。私の頭には少なくとも**単語**には数字は含まれていませんが、YMMVと思われます。 –

+0

これは、特に 'fltr_nameone_nametwo'の例ではわかりますが、' fltr_name1_name2'に拡張するためのストレッチではありません –

9

のawkでの正規表現のマッチングにチルダ文字~/ /を使用する必要がある、すなわち

if ($5 ~ /fltr_*/) 
+0

それは本当に助けた – SeeTheC