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

Jessaie dutiliser regex comme séparateur de champ dans awk. Daprès ma lecture, cela semble possible mais Je ne peux 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 évident est dobtenir une liste de logiciels sans numéro de version.

Réponse

Vous avez foiré vos citations et votre syntaxe. Pour définir le séparateur de champ de saisie, le moyen le plus simple de le faire est dutiliser loption -F sur la ligne de commande:

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

ou

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

Cela utiliserait nimporte quel chiffre comme séparateur de champ dentrée, puis afficherait 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 FS dans le programme awk lui-même. Cela se fait généralement dans un bloc BEGIN car il « sagit dune initialisation unique:

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

Notez ce single les guillemets ne peuvent « t être utilisés dans une chaîne entre guillemets simples dans le shell, et les awk chaînes toujours utilisent des guillemets doubles.

Commentaires

  • Est-il possible daccéder au FS et de voir la chaîne à laquelle il correspond?

Réponse

+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 daction ne prendra effet quà la lecture de la ligne suivante.

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

Les autres erreurs de la question:

  • ne peut pas utiliser de guillemets simples dans une chaîne entre guillemets simples
  • == est un opérateur de comparaison, = est pour lattribution de variables

Commentaires

  • " Changi ng FS dans un bloc daction gagné ' t prend effet jusquà ce que la ligne suivante soit lue " I ' a cherché partout cette information.
  • plus: ' peut-il utiliser des guillemets simples pour la valeur de chaîne dans awk, même si vous les passez de shell correctement
  • Est-il possible daccéder au FS et de voir la chaîne à laquelle il correspond?
  • FS est une variable donc vous faites quelque chose comme toute autre variable (par exemple print FS). Pour obtenir les parties qui correspondent à FS, avec POSIX awk, je pense que vous ne pouvez pas. Avec GNU awk, vous pouvez écrire n = split($0, fields, FS, separators)fields et separators sont des tableaux.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *