2016-09-08 13 views
6

私はこのように私はここ awkの変数で与えられたパターンをどのように一致させるか?

awk -F ":" '/REWARD REQ. SERVER HEADERS/{print $1, $2, $3, $4}' sample_profile.txt 

、「報酬REQ、コマンドの下に使用される、特定のパターンがパイプ区切りファイルから存在するサブストリングを抽出します。 SERVER HEADERS 'はファイル内で検索されるパターンで、最初の4つの部分をコロンで区切った行に出力します。

今、パターンとして動作するようにbash変数を送信します。私は以下のコマンドを使用しましたが、動作しません。

awk -v pat="$pattern" -F ":" '/pat/{print $1, $2 , $3, $4 } sample_profile.txt 

どのように私は、単一のawkコマンドで-v-Fを使用することができますか?

答えて

15

ここでの問題は-Fとは関係ありません。

patを変数にしたい場合、問題は/pat/の使用です。 /pat/と言うと、awkはそれを文字通りの "pat"として理解しているので、文字列 "pat"を含む行とのマッチングを試みます。すべて一緒に

awk -v pat="$pattern" '$0 ~ pat' 

は、あなたのコードは次のようになります。:あなたは変数を介してパターンを提供したい場合は

は、あなたがこのよう~を使用する必要が

awk -v pat="$pattern" -F ":" '$0~pat{print $1, $2, $3, $4 }' file 
#        ^^^^^^ 

を参照してください。例:

このファイルが指定されています:

$ cat file 
hello 
this is a var 
hello bye 

さんは "こんにちは" を含む行を探してみましょう:

$ awk -v pat="hello" '/pat/' file 
$         # NO MATCHES! 

$ awk '/hello/' file 
hello 
hello bye 

は、今度は、変数に含まれる "PAT"、あなたはそれをやっていた方法を探してみましょう$0 ~ pat式を使用しましょう:

$ awk -v pat="hello" '$0~pat' file 
hello         # WE MATCH! 
hello bye 

もちろん、このような式を使用して1つのフィールドと一致させることができ、awk -v pat="$pattern" '$2 ~ pat' fileと言うことができます。

GNU Awk User's Guide → 3.1 How to Use Regular Expressionsから:

正規表現は、このようなのfoo//としてスラッシュで囲まれているとき、私たちはずっと5.27のように、正規表現定数を呼び出し数値定数と「foo」が文字列定数です。

そしてGNU Awk User's Guide → 3.6 Using Dynamic Regexps:「!〜」

「〜」またはの右側演算子は、すなわち、(正規表現 一定である必要はありません、スラッシュの間の文字列)。任意の の式でよい。 が必要な場合は、式が評価され、文字列に変換されます。文字列の内容は正規表現として使用されます。

BEGIN { digits_regexp = "[[:digit:]]+" } 
$0 ~ digits_regexp { print } 

これは、1桁以上の数字を記載している正規表現にdigits_regexp設定 入力レコードは、この正規表現に一致するかどうかをテスト:この方法で計算 正規表現は、動的正規表現または計算 正規表現と呼ばれます。あなたが正規表現//表記内の変数を使用することはできません

+1

おかげで私のミスを指摘するためにその詳細な説明についてはAWKの境界を越えて、それを操作することができます。 –

4
awk -v pat="$pattern" -F":" '$0 ~ pat { print $1, $2, $3, $4 }' sample_profile.txt 

patを探してからそれを区別するための方法はありません)。変数が~(マッチング)演算子を持つ正規表現であることを指定する必要があります。

+0

これは機能しています。ありがとう、あなたは私の時間を救った。 –

0

これはハックのようなものですが、それは私にとって少し簡単です。

cmd="awk '/$pattern/'" 
eval $cmd 

それを作る文字列が最初にあなたが

関連する問題