kzen.dev
  • Întrebări
  • Tag-uri
  • Utilizatori
Notificări
Recompense
Înregistrare
După înregistrare, veți primi notificări despre răspunsurile și comentariile la întrebările DVS.
Logare
Dacă aveţi deja un cont, autentificaţi-vă pentru a verifica notificările noi.
Aici vor fi recompensele pentru întrebările, răspunsurile și comentariile adăugate sau modificate.
Mai mult
Sursă
Editează
 hqjma
hqjma
Question

Cum folosesc shell variabile într-o awk script?

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.

258 2013-09-29T07:45:03+00:00 7
 codeforester
codeforester
Întrebarea editată 3 septembrie 2018 в 7:41
Programare
shell
bash
awk
Solution / Answer
 Jotne
Jotne
29 septembrie 2013 в 7:51
2013-09-29T07:51:52+00:00
Mai mult
Sursă
Editează
#22360400

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.


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

Variabilă după bloc de cod

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}"

Aici-string

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 input

Ca 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 input

Ca 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

Variabilă în cod: UTILIZAȚI CU PRUDENȚĂ

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 aawk` 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.


Informatii suplimentare:

Utilizarea de dublu citat

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

Mai multe informatii despre AWK și variabile

Citeste acest faq.

 Jotne
Jotne
Răspuns editat 9 septembrie 2019 в 11:49
441
0
 TrueY
TrueY
6 noiembrie 2014 в 12:46
2014-11-06T12:46:34+00:00
Mai mult
Sursă
Editează
#22360418

Se pare că bine-vechi ENVIRON [tag:awk] built-in hash nu este menționat deloc. Un exemplu de utilizare a acestuia:

$ X=Solaris awk 'BEGIN{print ENVIRON["X"], ENVIRON["TERM"]}'
Solaris rxvt
26
0
Ed Morton
Ed Morton
29 septembrie 2013 в 1:22
2013-09-29T13:22:50+00:00
Mai mult
Sursă
Editează
#22360413

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.

Ed Morton
Ed Morton
Răspuns editat 29 septembrie 2013 в 1:54
9
0
 Johnsyweb
Johnsyweb
29 septembrie 2013 в 7:49
2013-09-29T07:49:33+00:00
Mai mult
Sursă
Editează
#22360399

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
 Johnsyweb
Johnsyweb
Răspuns editat 29 septembrie 2013 в 7:57
6
0
Steven Penny
Steven Penny
15 ianuarie 2017 в 7:05
2017-01-15T07:05:15+00:00
Mai mult
Sursă
Editează
#22360432

Puteți utiliza ARGV:

v=123test
awk 'BEGIN {print ARGV[1]}' "$v"

Rețineți că, dacă aveți de gând să continue în organism, va trebui să se adapteze ARGC:

awk 'BEGIN {ARGC--} {print ARGV[2], $0}' file "$v"
3
0
 Sina
Sina
2 martie 2016 в 8:07
2016-03-02T08:07:01+00:00
Mai mult
Sursă
Editează
#22360423

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

0
0
 edib
edib
10 aprilie 2018 в 7:34
2018-04-10T07:34:20+00:00
Mai mult
Sursă
Editează
#22360436

Am schimbat doar @Gigant's a răspunde pentru "pentru bucla".

for i in `seq 11 20`; do host myserver-$i | awk -v i="$i" '{print "myserver-"i" " $4}'; done
0
0
Adăugati o întrebare
Categorii
Toate
Tehnologii
Cultură
Viață / Artă
Stiință
Profesii
Afaceri
Utilizatori
Toate
Nou
Populare
1
工藤 芳則
Înregistrat 6 zile în urmă
2
Ирина Беляева
Înregistrat 1 săptămână în urmă
3
Darya Arsenyeva
Înregistrat 1 săptămână în urmă
4
anyta nuam-nuam (LapuSiK)
Înregistrat 1 săptămână în urmă
5
Shuhratjon Imomkulov
Înregistrat 1 săptămână în urmă
BG
DE
EL
ES
FR
ID
IT
JA
KO
NL
NO
PT
RO
RU
TR
ZH
© kzen.dev 2023
Sursă
stackoverflow.com
în cadrul licenței cc by-sa 3.0 cu atribuire