Come usare regex come separatore di campo in awk?


16

Sto cercando di usare regex come separatore di campo in awk. Dalla mia lettura questo sembra possibile ma non riesco a capire bene la sintassi.

rpm -qa | awk '{ 'FS == [0-9]' ; print $1 }'
awk: cmd. line:1: { FS
awk: cmd. line:1:     ^ unexpected newline or end of string

Pensieri? L'obiettivo, se non addirittura ovvio, è ottenere un elenco di software senza numero di versione.

Risposte:


25

Hai fatto confusione tra virgolette e sintassi. Per impostare il separatore del campo di input, il modo più semplice per farlo è con l' -Fopzione sulla riga di comando:

awk -F '[0-9]' '{ print $1 }'

o

awk -F '[[:digit:]]' '{ print $1 }'

Ciò userebbe qualsiasi cifra come separatore del campo di input e quindi emettere il primo campo da ciascuna riga.

Le espressioni [0-9]e [[:digit:]]non sono esattamente le stesse, a seconda delle impostazioni internazionali. Vedi " Differenza tra [0-9], [[: digit:]] e \ d ".

Si potrebbe anche impostare FSnel awkprogramma stesso. Questo di solito viene eseguito in un BEGINblocco poiché si tratta di un'inizializzazione una tantum:

awk 'BEGIN { FS = "[0-9]" } { print $1 }'

Si noti che le virgolette singole non possono essere utilizzate in una stringa a virgoletta singola nella shell e che le awkstringhe usano sempre virgolette doppie.


12

+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 fino alla lettura della riga successiva

$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk '{FS="[0-9]"; print $1}'
abc123
ghi

Gli altri errori nella domanda:

  • non è possibile utilizzare virgolette singole all'interno di una stringa tra virgolette singole
  • ==è un operatore di confronto, =è per assegnazione variabile

1
"La modifica di FS in un blocco di azioni non avrà effetto fino alla lettura della riga successiva" Ho cercato tutte queste informazioni.
Samizdis,

1
Inoltre: non è possibile utilizzare virgolette singole per il valore di stringa in awk, anche se le si passa dalla shell correttamente
dave_thompson_085
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.