Sto cercando di utilizzare regex come separatore di campo in awk
. Dalla mia lettura sembra possibile ma Non riesco a ottenere la sintassi corretta.
rpm -qa | awk "{ "FS == [0-9]" ; print $1 }" awk: cmd. line:1: { FS awk: cmd. line:1: ^ unexpected newline or end of string
Pensieri? Lobiettivo, se non ovvio, è ottenere un elenco di software senza numero di versione.
Risposta
Hai sbagliato le virgolette e la sintassi. Per impostare il separatore del campo di input, il modo più semplice per farlo è con lopzione -F
nella riga di comando:
awk -F "[0-9]" "{ print $1 }"
o
awk -F "[[:digit:]]" "{ print $1 }"
Questo userebbe qualsiasi cifra come separatore del campo di input, quindi produrrebbe il primo campo di ogni riga.
Le espressioni [0-9]
e [[:digit:]]
non sono esattamente le stesse, a seconda della tua lingua. Vedi “ Differenza tra [0-9], [[: digit:]] e \ d “.
Si potrebbe anche impostare FS
nel programma awk
stesso. Questo di solito viene fatto in un BEGIN
blocco in quanto è “uninizializzazione una tantum:
awk "BEGIN { FS = "[0-9]" } { print $1 }"
Nota che singolo le virgolette non possono “essere usate in una stringa tra virgolette singole nella shell e quelle awk
stringhe sempre usano virgolette doppie.
Commenti
- È possibile accedere a FS e vedere la stringa corrispondente?
Risposta
+1 per la risposta di Kusalananda. In alternativa, la variabile FS può essere impostata nel blocco BEGIN:
awk "BEGIN {FS="[0-9]"} {print $1}"
La modifica di FS in un blocco di azioni non avrà effetto finché non viene letta la riga successiva
$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk "{FS="[0-9]"; print $1}" abc123 ghi
Gli altri errori nella domanda:
- non posso “utilizzare virgolette singole allinterno di una stringa tra virgolette singole
-
==
è un operatore di confronto,=
è per lassegnazione di variabili
Commenti
- " Changi ng FS in un blocco di azioni non ' ha effetto finché non viene letta la riga successiva " I ' ho cercato queste informazioni dappertutto.
- plus: ' t utilizzare virgolette singole per il valore della stringa in awk, anche se le passi da shell correttamente
- È possibile accedere a FS e vedere la stringa a cui corrisponde?
-
FS
è una variabile quindi fai qualcosa di simile qualsiasi altra variabile (ad es.print FS
). Per ottenere le parti che corrispondono a FS, con POSIX awk, penso che non sia possibile. Con GNU awk potresti scriveren = split($0, fields, FS, separators)
dovefields
eseparators
sono array.