Comment utiliser regex comme séparateur de champ dans awk?

16

J'essaie d'utiliser regex comme séparateur de champ awk. D'après ma lecture, cela semble possible mais je n'arrive pas à obtenir la bonne syntaxe.

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

Pensées? Le but sinon obviouse est d'obtenir une liste de logiciels sans numéro de version.

Course grise
la source

Réponses:

25

Vous avez détruit vos citations et votre syntaxe. Pour définir le séparateur de champ de saisie, la façon la plus simple de le faire est avec l' -Foption sur la ligne de commande:

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

ou

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

Cela utiliserait n'importe quel chiffre comme séparateur de champ d'entrée, puis sortirait le premier champ de chaque ligne.

Les expressions [0-9]et [[:digit:]]ne sont pas tout à fait les mêmes, selon vos paramètres régionaux. Voir " Différence entre [0-9], [[: digit:]] et \ d ".

On pourrait également définir FSle awkprogramme lui-même. Cela se fait généralement dans un BEGINbloc car il s'agit d'une initialisation unique:

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

Notez que les guillemets simples ne peuvent pas être utilisés dans une chaîne entre guillemets simples dans le shell, et que les awkchaînes utilisent toujours des guillemets doubles.

Kusalananda
la source
12

+1 pour la réponse de Kusalananda. Alternativement, la variable FS peut être définie dans le bloc BEGIN:

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

La modification de FS dans un bloc d'action ne prendra effet qu'après la lecture de la ligne suivante

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

Les autres erreurs dans la question:

  • ne peut pas utiliser de guillemets simples dans une chaîne entre guillemets simples
  • ==est un opérateur de comparaison, =est pour l'affectation des variables
glenn jackman
la source
1
"Changer FS dans un bloc d'action ne prendra effet que lorsque la ligne suivante sera lue" J'ai cherché partout cette information.
Samizdis
1
plus: ne peut pas utiliser de guillemets simples pour la valeur de chaîne dans awk, même si vous les transmettez correctement depuis le shell
dave_thompson_085