/ / Eine awk Funktion in bash deklarieren - regex, linux, bash, awk

Eine awk Funktion in bash deklarieren - regex, linux, bash, awk

Ich habe ein awk-Skript, das folgendermaßen aufgerufen wird:

awk -f myawkfile.awk arguments

Das awk-Skript wird mit dem gleichen Aufruf in mein Bash-Skript aufgerufen.

Kann ich, anstatt das awk-Skript aufzurufen, es als Funktion in meiner bash deklarieren Skript. Ich dachte, es wäre einfach, indem ich ein schreibe awk vor und zurück tickt den gesamten Code und weist dann einen Funktionsnamen zu, um ihn beliebig aufzurufen. Irgendwie macht es den Trick nicht.

Ich versuche das, weil ich nicht möchte, dass mein Skript von einem anderen Skript abhängig ist. Und ich bin nicht derjenige, der das geschrieben hat awk Skript. Es nimmt eine Datei als Eingabe, tut einige und gibt die modifizierte Datei zurück, die in meinem Skript verwendet wird.

Antworten:

9 für die Antwort № 1

Verwenden Heredoc-Notation Man kann so etwas schreiben

#!/bin/bash

awk_program=$(cat << "EOF"
/* your awk script goes here */
EOF
)

# ...

# run awk script
awk "$awk_program" arguments

# ...

2 für die Antwort № 2

Schreiben Sie einfach das awk-Skript in eine Funktion:

#!/bin/sh -e

foo() { awk "{print $2}" "$@"; }
foo a b                         # Print the 2nd column from files a and b
printf "a b cnd e fn" | foo   # print "bnen"

Beachten Sie, dass der awk-Standard im Verhalten mehrdeutig erscheint, wenn die leere Zeichenfolge als Argument übergeben wird, aber die Shell dies garantiert "$@" expandiert auf Nullfelder statt auf die leere Zeichenfolge, so dass es nur ein Problem ist, wenn Sie aufrufen foo mit einem leeren Argument.