2013-02-22 5 views
8

私は、実行時に調整されたさまざまなawkスクリプト(script1.awk、script2.awk)を使用するbashスクリプト(script.sh)を使用していました。 私は最初のbashスクリプトの中にそれらを完全に埋め込む方法を探していました。 理想的には、私はこのように見ているファイルがしたい:代わりに伝統のシェルスクリプトにawkを埋め込む

################################ 
# AWK scripts     # 
################################ 
read -d '' scriptVariable <<'EOF' 
' 
{my block commands;} 
' 
EOF 
################################ 
# End of AWK Scripts   # 
################################ 
awk $scriptVariable ${inputfile} # This line obviously doesn't work 

:もちろん

awk '{ 
my script commands 
' ${intputfile} 

を、私は、ファイルに書き込むことができますが、全体のポイントはしません。助言がありますか ?

EDIT:次の問題は、< <の「HERE」タグでは改行文字が読み込まれないことです。それ以外の場合はawkスクリプトを解釈しようとしています(そしてそこに)$記号があります。改行がなければ、awkスクリプト内の何かをコメントすることはできません(改行文字が削除されているときにスクリプトの半分にコメントをつけることなく...)。誰でも ?

<< 'EOF' 
BEGIN{#Hello 
print $1 
} 
EOF # Is read as BEGIN{#Hello print $1} by awk; ie BEGIN{ 

<< EOF 
BEGIN{#Hello 
print $1 
} 
EOF #Is read correctly by awk but Bash tried to express $1 and fails 
+0

awkで動くかどうか$ scriptVariable "$ {inputfile}" – mouviciel

+0

スクリプト言語をPerlやPythonのようなものにアップグレードする必要があるようです。それはより簡単になり、より速く動作します。 – mvp

+0

既に試してみましたが、ソース行1でawk:syntax errorで失敗しました。 \t >>> '<<< awk:ソース行18で救済しています –

答えて

9

awkスクリプトに関する一重引用符を削除し、スクリプト変数を二重引用符で囲みます。これは私のために働きます:

################################ 
# AWK scripts     # 
################################ 
read -d '' scriptVariable << 'EOF' 
BEGIN { 
    print "start" 
} 
{ 
    print $0 
} 
END{ 
    print "hello" 
} 
EOF 
################################ 
# End of AWK Scripts   # 
################################ 

awk "$scriptVariable" ${inputfile} 
+0

それのおかげで非常に多くの –

+0

がAwkのの "-v" オプションを使用し、awkスクリプトにシェルVARSに合格するん ような何か:!。 **' VAR V1は= "シェル値" のawk -v awkVar =」 $ v1 "" $ scriptVariable "$ {inputfile} ' ** スクリプトでは、 'awkVar'は値「シェル値」を保持しますが、 – user1435666

0

Here-Documentを使用してbashスクリプト内にawkを組み込むことができます。

+1

その上のヒント、 '-f - 'オプションを 'awk -f - << EOD ' – cdarke

2

awkスクリプトの回りの単一引用符は、シェルではカンタンです。

echo dummy code | awk '/dummy/{print '$1' $2}' - another_file | while read LINE; do 
    case $LINE in 
     "$1 code")echo success;; 
     *)echo $LINE;; 
    esac 
done 

これは、標準入力から削除しanother_fileとダミーを含む出力ラインとあなたのbashスクリプトの最初の引数で最初のフィールドを置き換えます。 bash変数$ 1は引用符で囲まれていなければならないことに注意してください。

関連する問題