2013-02-22 10 views
8

Ich habe ein Bash-Skript (script.sh) verwendet, das verschiedene awk-Skripts (script1.awk, script2.awk) verwendet, die auf "Laufzeit" zugeschnitten sind, indem Werte für Instanz ersetzt werden. Ich habe nach Möglichkeiten gesucht, sie vollständig in das erste Bash-Skript einzubetten. Im Idealfall würde Ich mag eine Datei wie folgt aussehen haben:Embedding awk in einem Shell-Skript

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

statt der traditionellen:

awk '{ 
my script commands 
' ${intputfile} 

Natürlich habe ich sie in eine Datei schreiben könnte, aber der springende Punkt ist nicht zu . Irgendwelche Vorschläge ?

EDIT: Obwohl Dogbane Antworten funktioniert gut, das nächste Problem ist, dass mit den < < 'HIER' Tags, Newline-Zeichen nicht gelesen werden. Ich kann nicht unquote da sonst, er versucht, das Awk-Skript dann zu interpretieren ein $ -Zeichen innerhalb (und es gibt). Ohne Zeilenumbrüche kann ich nichts im awk-Skript kommentieren (ohne das halbe Skript zu kommentieren, wenn die Zeilenumbrüche entfernt werden ...). Jeder?

<< '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

Funktioniert es mit 'awk $ $ scriptVariable" $ {inputfile} ' – mouviciel

+0

Es klingt, als ob Sie Ihre Skriptsprache einfach auf etwas Besseres aktualisieren müssen - Perl oder Python. Es wird einfacher und schneller arbeiten. – mvp

+0

bereits versucht, scheiterte es mit 'awk: Syntaxfehler bei Quellenleitung 1 Kontext ist \t >>> '<<< awk: Bürgen an der Quelle Linie aus 18' –

Antwort

9

Entfernen Sie die einfachen Anführungszeichen um das awk-Skript und schließen Sie die Skriptvariable in doppelte Anführungszeichen ein. Das funktioniert bei mir:

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

awk "$scriptVariable" ${inputfile} 
+0

Es macht vielen Dank sehr –

+0

-Shell übergeben vars, um das Skript awk verwenden awk der Option "-v" So etwas wie:. **' var v1 = "shell Wert" awk -v awkVar =“ $ v1 "" $ scriptVariable "$ {Eingabedatei} ' ** In Ihrem Skript wird 'awkVar' den Wert 'shell value' enthalten – user1435666

0

Sie können Ihre awk in Ihr Bash-Skript mit einer Here-Document einschließen.

+1

Ein Tipp darauf, verwenden Sie die '-f -' Option, wie in 'awk -f - << EOD ! ' – cdarke

2

Die einzelnen Anführungszeichen um awk-Skripte können in einer Shell streitsüchtig sein.

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 

Dies wird von stdin entfernen und dann Dummy another_file und Ausgangsleitungen enthalten, und das erste Feld mit dem ersten Argumente zu Ihrem Bash-Skript ersetzen. Beachten Sie, dass die Bash-Variable $ 1 nicht in Anführungszeichen gesetzt werden muss.