Jeg prøver å bruke regex som feltseparator i awk
. Fra min lesing virker dette mulig, men Jeg kan ikke få syntaksen riktig.
rpm -qa | awk "{ "FS == [0-9]" ; print $1 }" awk: cmd. line:1: { FS awk: cmd. line:1: ^ unexpected newline or end of string
Tanker? Målet hvis ikke obviouse er å få en liste over programvare uten versjonsnummer.
Svar
Du har slått sammen sitatene og syntaksen. For å angi inndatafelteskilleren, er den enkleste måten å gjøre det med alternativet -F
på kommandolinjen:
awk -F "[0-9]" "{ print $1 }"
eller
awk -F "[[:digit:]]" "{ print $1 }"
Dette vil bruke ethvert siffer som inndatafelteseparator, og deretter sende det første feltet fra hver linje.
[0-9]
og [[:digit:]]
uttrykkene er ikke helt de samme, avhengig av lokaliteten din. Se « Forskjell mellom [0-9], [[: digit:]] og \ d «.
Man kan også angi FS
i selve awk
-programmet. Dette gjøres vanligvis i en BEGIN
-blokk, da den er en engangsinitialisering:
awk "BEGIN { FS = "[0-9]" } { print $1 }"
Legg merke til den anførselstegn kan ikke brukes i en enkelt sitert streng i skallet, og at awk
strenger alltid bruker doble anførselstegn.
Kommentarer
- Er det mulig å få tilgang til FS og se strengen den matchet?
Svar
+1 for Kusalanandas svar. Alternativt kan FS-variabelen settes i BEGIN-blokken:
awk "BEGIN {FS="[0-9]"} {print $1}"
Endring av FS i en aksjonsblokk vil ikke tre i kraft til neste linje leses
$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk "{FS="[0-9]"; print $1}" abc123 ghi
De andre feilene i spørsmålet:
- kan ikke bruke enkle anførselstegn i en enkelt sitert streng
-
==
er en sammenligningsoperator,=
er for variabel tildeling
Kommentarer
- " Changi ng FS i en handlingsblokk vant ' t trer i kraft til neste linje leses " I ' har lete overalt for den informasjonen.
- pluss: kan ' t bruke enkelt anførselstegn for strengverdi i awk, selv om du sender dem fra shell riktig
- Er det mulig å få tilgang til FS og se strengen den matchet?
-
FS
er en variabel slik at du gjør noe som hvilken som helst annen variabel (f.eks.print FS
). For å få delene som samsvarer med FS, med POSIX awk, tror jeg du ikke kan. Med GNU awk kan du skriven = split($0, fields, FS, separators)
derfields
ogseparators
er matriser.