Περισσότερα
Πώς μπορώ να χρησιμοποιήσω μεταβλητές κελύφους σε ένα σενάριο awk;
Βρήκα μερικούς τρόπους για να περάσω εξωτερικές μεταβλητές κελύφους σε ένα σενάριο awk
, αλλά είμαι μπερδεμένος σχετικά με τα '
και "
.
Αρχικά, δοκίμασα με ένα σενάριο κελύφους:
$ v=123test
$ echo $v
123test
$ echo "$v"
123test
Στη συνέχεια δοκίμασα awk:
$ awk 'BEGIN{print "'$v'"}'
$ 123test
$ awk 'BEGIN{print '"$v"'}'
$ 123
Γιατί είναι η διαφορά;
Τέλος, δοκίμασα αυτό:
$ awk 'BEGIN{print " '$v' "}'
$ 123test
$ awk 'BEGIN{print ' "$v" '}'
awk: cmd. line:1: BEGIN{print
awk: cmd. line:1: ^ unexpected newline or end of string
Έχω μπερδευτεί με αυτό.
258
3
Χρησιμοποιώντας το
-v
(Ο καλύτερος τρόπος, ο πιο φορητός)Χρησιμοποιήστε την επιλογή
-v
: (Υ.Γ. χρησιμοποιήστε ένα κενό μετά το-v
αλλιώς θα είναι λιγότερο φορητό. Π.χ.,awk -v var=
όχιawk -vvar=
)Αυτό θα πρέπει να είναι συμβατό με τα περισσότερα
awk
, και η μεταβλητή είναι διαθέσιμη και στο μπλοκBEGIN
:Εάν έχετε πολλαπλές μεταβλητές:
Προειδοποίηση. Όπως γράφει ο Ed Morton, οι ακολουθίες διαφυγής θα ερμηνευτούν έτσι ώστε το
\t
να γίνει πραγματικήtab
και όχι\t
αν αυτό είναι που ψάχνετε. Μπορεί να λυθεί με τη χρήση τουENVIRON[]
ή με πρόσβαση μέσω τουARGV[]
.PS Αν σας αρέσουν οι τρεις κάθετες γραμμές ως διαχωριστικό
||||
, δεν μπορούν να διαφυγούν, οπότε χρησιμοποιήστε-F"[|][|][|][|]"
Παράδειγμα λήψης δεδομένων από ένα πρόγραμμα/μια λειτουργία inn to
awk
(εδώ χρησιμοποιείται η ημερομηνία)Μεταβλητή μετά το μπλοκ κώδικα
Εδώ παίρνουμε τη μεταβλητή μετά τον κώδικα
awk
. Αυτό θα λειτουργήσει μια χαρά εφόσον δεν χρειάζεστε τη μεταβλητή στο μπλοκBEGIN
:Αυτό λειτουργεί επίσης με πολλαπλές μεταβλητές
awk '{print a,b,$0}' a="$var1"- b="$var2"- file
Η χρήση μεταβλητής με αυτόν τον τρόπο δεν λειτουργεί στο μπλοκ
BEGIN
:Here-string
Η μεταβλητή μπορεί επίσης να προστεθεί στο
awk
χρησιμοποιώντας ένα [here-string][1] από τα κελύφη που τα υποστηρίζουν (συμπεριλαμβανομένου του Bash):Χρησιμοποιήστε οποιαδήποτε από αυτές ανάλογα με το πώς θέλετε να χειρίζεστε τις backslashes στις μεταβλητές του κελύφους (
avar
είναι μια μεταβλητή awk,svar
είναι μια μεταβλητή του κελύφους):Δείτε το http://cfajohnson.com/shell/cus-faq-2.html#Q24 για λεπτομέρειες και άλλες επιλογές. Η πρώτη παραπάνω μέθοδος είναι σχεδόν πάντα η καλύτερη επιλογή σας και έχει την πιο προφανή σημασιολογία.
Θα μπορούσατε να περάσετε την επιλογή γραμμής εντολών
-v
με ένα όνομα μεταβλητής (v
) και μια τιμή (=
) της μεταβλητής περιβάλλοντος ("${v}"
):Ή για να το κάνουμε πιο σαφές (με πολύ λιγότερα
v
):