2011-09-28 111 views
0

私はこのようになり、テキストファイルから値を引き出すために必要なシェルスクリプトを書いています:のAwk - 終端されていない正規表現

app.full.name /warfilelocation/ warfilename 

私のシェルスクリプトは、アプリケーション名のリストを反復処理して引き抜くことになりますAWKを使用する場所または名前。私はこれをコマンドラインで以下のようにテストしました: awk "\ $ 1〜/ app.full.name/{print $ 2}" applications.txt

これは私がこれを入れたときに私が期待するものを返しますシェルスクリプト私は問題が発生し始めます。

私はこのようになります機能があります。

function get_location() { 
     local application=$1 
     awk "\$1 ~/^$application/ { print \$2 }" applications.txt 
} 

をしかし、私は、この関数を呼び出すときに、私は次のエラーを取得する:

awk: $1 ~/^app.full.name 
awk: ^unterminated regexp 
awk: cmd. line:1: app.full.name 
awk: cmd. line:1:  ^syntax error 
awk: cmd. line:2: app.full.name/ { print $2 } 
awk: cmd. line:2: ^syntax error 

誰も私が間違ってここにやっているものを任意のアイデアを持っています。私は正しい変数をエスケープしていないと推測しますが、何を試しても機能しないようです。事前に

おかげで

+0

どのように関数を呼び出していますか?アプリケーションの価値は何ですか? –

答えて

6

使用このアプローチをawkのシェル変数を認識させるために:

awk -v "v1=$VAR1" -v "v2=$VAR2" '{print v1, v2}' input_file 

更新

$ cat input 
tinky-winky 
dipsy 
laa-laa 
noo-noo 
po 

$ teletubby='po' 

$ awk -v "regexp=$teletubby" '$0 ~ regexp' input 
po 

が も本格的、シェル変数に行くことができることに注意してください正規表現、例えば^d.*y。シェルが展開を行わないようにするには、一重引用符「 」を使用してください。

+0

彼はRegexに変数の値を埋めたいと思っています。 – Kent

+0

@Kent - '-v'はawkスクリプトでシェル変数を使うことができるということだけを述べています。その変数は、 'match()'関数の正規表現として使うことができます。しかし、私はその部分を外しました... –

+0

私はポイントがマッチ()だと思います。変数(by -v)は($ x〜/ here /)のようなawkの一致チェックでは使用できないからです。少なくとも私はこの場合どのように使用するのか分かりません。 :) – Kent

0

エラーメッセージは「ライン2」のエラーメッセージを与える$アプリケーションの終了時に浮遊改行があることを示しているように見えます。

+0

これは同じことをしません、彼は$ 1〜/^app/ –

+0

の最初のフィールドをテストしたいと思っています。ありがとう、これは実際のawk構文であるとは思いませんでした。編集されました。 – thiton

0

この参照:

kent$ app=app.ful 
kent$ echo "app.full.name /warfilelocation/ warfilename"|awk -v a=$app '{if(match($1,a))print $2}' 
/warfilelocation/ 
0

awkの試合()関数を使用して、それは$アプリケーションの正確価値を知らずに伝えるのは難しいですが、あなたは$アプリケーションで奇妙なキャラクターを持っているようにそれはそう、な」などをまたは/またはそのような何か。

$ export application=foo/bar 
$ awk "\$1 ~/^$application/ { print \$1 }" 
gawk: cmd. line:1: $1 ~/^foo/bar/ { print $1 } 
gawk: cmd. line:1:    ^parse error 

私はあなたが$アプリケーションを持っている正確な値を見て、それは/が含まれている場合は、それを逃れる。このwoulを行うには

1つの方法でしょうdを使用する:

$ export application=`echo foo/bar | sed -e 's;/;\\\\/;g'` 
$ awk "\$1 ~/^$application/ { print \$1 }" 
関連する問題