Încerc să folosesc regex ca separator de câmp în awk
. Din lecturile mele acest lucru pare posibil, dar Nu pot înțelege sintaxa corect.
rpm -qa | awk "{ "FS == [0-9]" ; print $1 }" awk: cmd. line:1: { FS awk: cmd. line:1: ^ unexpected newline or end of string
Gânduri? Dacă nu este respectat, obiectivul este să obțineți o listă de software fără numărul de versiune.
Răspuns
Ați combinat ghilimele și sintaxa. Pentru a seta separatorul de câmp de intrare, cel mai simplu mod de a face acest lucru este cu opțiunea -F
de pe linia de comandă:
awk -F "[0-9]" "{ print $1 }"
sau
awk -F "[[:digit:]]" "{ print $1 }"
Aceasta ar folosi orice cifră ca separator de câmp de intrare și apoi va scoate primul câmp din fiecare linie.
Expresiile [0-9]
și [[:digit:]]
nu sunt chiar la fel, în funcție de localizarea dvs. Vedeți „ Diferența dintre [0-9], [[: cifră:]] și \ d „.
S-ar putea seta și FS
în programul awk
în sine. Acest lucru se face de obicei într-un bloc BEGIN
deoarece este o inițializare unică:
awk "BEGIN { FS = "[0-9]" } { print $1 }"
Rețineți că ghilimelele nu pot fi utilizate într-un șir de ghilimele dintr-un shell și că awk
șirurile întotdeauna utilizează ghilimele duble.
Comentarii
- Este posibil să accesați FS și să vedeți șirul potrivit?
Răspuns
+1 pentru răspunsul lui Kusalananda. Alternativ, variabila FS poate fi setată în blocul BEGIN:
awk "BEGIN {FS="[0-9]"} {print $1}"
Schimbarea FS într-un bloc de acțiune nu va avea efect până la citirea următoarei linii
$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk "{FS="[0-9]"; print $1}" abc123 ghi
Celelalte erori din întrebare:
- nu se pot folosi ghilimele într-un șir de ghilimele unice
-
==
este un operator de comparație,=
este pentru atribuirea variabilelor
Comentarii
- " Changi ng FS într-un bloc de acțiune a câștigat ' să intre în vigoare până când următoarea linie este citită " I ' am căutat peste tot informațiile respective.
- plus: ' nu puteți folosi ghilimele simple pentru valoarea șirului în awk, chiar dacă le treceți de la shell corect
- Este posibil să accesați FS și să vedeți șirul potrivit?
-
FS
este o variabilă, astfel încât să faceți ceva de genul orice altă variabilă (de ex.print FS
). Pentru a obține piesele care se potrivesc cu FS, cu POSIX awk, cred că nu puteți. Cu GNU awk puteți scrien = split($0, fields, FS, separators)
undefields
șiseparators
sunt tablouri.