Meer
Hoe gebruik ik shell variabelen in een awk script?
Ik heb wat manieren gevonden om externe shell variabelen door te geven aan een awk
script, maar ik'ben verward over '
en "
.
Eerst probeerde ik het met een shell script:
$ v=123test
$ echo $v
123test
$ echo "$v"
123test
Daarna probeerde ik het met awk:
$ awk 'BEGIN{print "'$v'"}'
$ 123test
$ awk 'BEGIN{print '"$v"'}'
$ 123
Waarom is het verschil?
Als laatste heb ik dit geprobeerd:
$ 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
Ik ben verward over dit.
258
3
Het gebruik van
-v
(De beste manier, meest portable)Gebruik de
-v
optie: (P.S. gebruik een spatie na-v
of het zal minder portable zijn. Bijv.awk -v var=
nietawk -vvar=
)Dit zou compatibel moeten zijn met de meeste
awk
, en de variabele is ook beschikbaar in hetBEGIN
blok:Als je meerdere variabelen hebt:
Waarschuwing. Zoals Ed Morton schrijft, escape sequenties worden geïnterpreteerd zodat
tab
een echtetab
wordt en niettab
als dat is waar je naar zoekt. Kan worden opgelost doorENVIRON[]
te gebruiken of het viaARGV[]
te benaderenPS Als je drie verticale streepjes als scheidingsteken
||
wilt, kan dat niet ge-escaped worden, dus gebruik-F"[|][|][|]"
Variabele na code blok
Hier krijgen we de variabele na de
awk
code. Dit werkt prima, zolang je de variabele niet nodig hebt in hetBEGIN
blok:Dit werkt ook met meerdere variabelen
awk '{print a,b,$0}' a="$var1" b="$var2" bestand
Variabele op deze manier gebruiken werkt niet in
BEGIN
blok:Here-string
Variabelen kunnen ook worden toegevoegd aan
awk
met behulp van een [here-string][1] van shells die dat ondersteunen (inclusief Bash):Gebruik een van deze, afhankelijk van hoe u wilt dat backslashes in de shell variabelen worden behandeld (
avar
is een awk variabele,svar
is een shell variabele):Zie http://cfajohnson.com/shell/cus-faq-2.html#Q24 voor details en andere opties. De eerste methode hierboven is bijna altijd je beste optie en heeft de meest voor de hand liggende semantiek.
Je zou de command-line optie
-v
kunnen doorgeven met een variabelenaam (v
) en een waarde (=
) van de omgevingsvariabele ("${v}"
):Of om het duidelijker te maken (met veel minder
v
s):