Am găsit câteva modalități de a trece de cochilie externa variabile de la o awk
script-ul, dar am'm confuz despre ' " și " "
.
În primul rând, am încercat cu un script de shell:
$ v=123test
$ echo $v
123test
$ echo "$v"
123test
Apoi a încercat awk:
$ awk 'BEGIN{print "'$v'"}'
$ 123test
$ awk 'BEGIN{print '"$v"'}'
$ 123
De ce este diferența?
În cele din urmă am încercat acest lucru:
$ 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
Am'm confuz despre aceasta.
Obținerea de coajă variabile în
awk
poate fi făcut în mai multe moduri. Unele sunt mai bune decât altele. Acest lucru ar trebui să acopere cele mai multe dintre ele. Dacă aveți un comentariu, vă rugăm să lăsați mai jos.
-v
(Cel mai bun mod, cel mai portabil)Folosi -v
opțiune: (P. S. folosi un spațiu după -v
sau va fi mai puțin portabile. E. g., awk -v var=
nu awk -cauza războiului=
)
variable="line one\nline two"
awk -v var="$variable" 'BEGIN {print var}'
line one
line two
Acest lucru ar trebui să fie compatibile cu cele mai multe awk
, iar variabila este disponibil în BEGIN
bloc precum:
Dacă aveți mai multe variabile:
awk -v a="$var1" -v b="$var2" 'BEGIN {print a,b}'
Avertisment. Ca Ed Morton scrie, secvențe escape va fi interpretat \t
devine o adevărată " tab " și nu \t
, dacă asta este ceea ce căutați pentru. Pot fi rezolvate prin utilizarea ENVIRON[]
sau de acces prin ARGV[]
PS Dacă vă place de trei bare verticale de separare |||
, se poate't fi scăpat, așa că folosiți - - F"[|][|][|]"
de Exemplu pe obținerea de date de la un program/funcție inn
awk
(aici data este folosit)
awk -v time="$(date +"%F %H:%M" -d '-1 minute')" 'BEGIN {print time}'
Aici avem variabila după awk
cod. Acest lucru va funcționa bine, atâta timp cât nu aveți nevoie de variabila BEGIN
bloc:
variable="line one\nline two"
echo "input data" | awk '{print var}' var="${variable}"
or
awk '{print var}' var="${variable}" file
Acest lucru, de asemenea, funcționează cu mai multe variabile
awk '{print a,b,$0}' o="$var1" b="$var2" fișier
Folosind variabila de acest fel nu funcționează în BEGIN
bloc:
echo "input data" | awk 'BEGIN {print var}' var="${variable}"
Variabila poate fi, de asemenea, adăugate la awk
folosind un aici-string din scoici care le susțin (inclusiv Bash):
awk '{print $0}' <<< "$variable"
test
Acest lucru este la fel ca:
printf '%s' "$variable" | awk '{print $0}'
P. S. aceasta tratează variabila ca un fișier de intrare.
D
inputCa TrueY scrie, puteți utiliza ENVIRON
pentru a imprima Variabile de Mediu.
Setarea unei variabile înainte de a rula AWK, puteți să-l imprimați astfel:
X=MyVar
awk 'BEGIN{print ENVIRON["X"],ENVIRON["SHELL"]}'
MyVar /bin/bash
ARGV
inputCa Steven Penny scrie, puteți utiliza ARGV
pentru a obține date în awk:
v="my data"
awk 'BEGIN {print ARGV[1]}' "$v"
my data
Pentru a obține date în cod în sine, nu doar de a ÎNCEPE:
v="my data"
echo "test" | awk 'BEGIN{var=ARGV[1];ARGV[1]=""} {print var, $0}' "$v"
my data test
Puteți utiliza o variabilă în awk
cod, dar's murdar și greu de citit, și cum Charles Duffypuncte de afară, această versiune poate fi, de asemenea, o victimă de injectare de cod. Dacă cineva adaugă lucruri rele variabila, aceasta va fi executată ca parte a
awk` cod.
Aceasta funcționează prin extragerea variabilă în cod, astfel încât acesta devine o parte din ea.
Dacă doriți să faceți o awk
care se schimbă dinamic cu utilizarea de variabile, puteți face în acest fel, dar NU-l utilizați pentru variabile normale.
variable="line one\nline two"
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
Aici este un exemplu de injectare de cod:
variable='line one\nline two" ; for (i=1;i<=1000;++i) print i"'
awk 'BEGIN {print "'"$variable"'"}'
line one
line two
1
2
3
.
.
1000
Puteți adăuga o mulțime de comenzi pentru a awk
în acest fel. Chiar face accident cu non comenzi valide.
L's întotdeauna bun pentru a dubla citat variabilă "$variabila"
Dacă nu, mai multe linii vor fi adăugate ca pe o singură linie.
Exemplu:
var="Line one
This is line two"
echo $var
Line one This is line two
echo "$var"
Line one
This is line two
Alte erori puteți obține fără ghilimele:
variable="line one\nline two"
awk -v var=$variable 'BEGIN {print var}'
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ backslash not last character on line
awk: cmd. line:1: one\nline
awk: cmd. line:1: ^ syntax error
Și cu un singur citat, aceasta nu se extinde valoarea variabilei:
awk -v var='$variable' 'BEGIN {print var}'
$variable
Utilizați oricare dintre acestea în funcție de modul în care doriți backslash-uri în coajă variabile manipulate (avar
este un awk variabilă, svar
este o variabilă shell):
awk -v avar="$svar" '... avar ...' file
awk 'BEGIN{avar=ARGV[1];ARGV[1]=""}... avar ...' "$svar" file
Vezi http://cfajohnson.com/shell/cus-faq-2.html#Q24 pentru detalii și alte opțiuni. Prima metoda de mai sus este aproape întotdeauna cea mai bună opțiune și are cele mai evidente semantica.
Ai putea trece în opțiunea de linie de comandă -v
cu un nume de variabilă ("v") și o valoare (=
) variabilei de mediu ("${v}"
):
% awk -vv="${v}" 'BEGIN { print v }'
123test
Sau pentru a-l face mai lizibil (cu mult mai putine `v):
% environment_variable=123test
% awk -vawk_variable="${environment_variable}" 'BEGIN { print awk_variable }'
123test
Am avut pentru a introduce data de la începutul linii a unui fișier de log și it's face ca mai jos:
DATE=$(date +"%Y-%m-%d")
awk '{ print "'"$DATE"'", $0; }' /path_to_log_file/log_file.log
Acesta poate fi redirecționa către un alt fișier pentru a salva