Jeg prøver at bruge regex som markseparator i awk
. Fra min læsning synes dette muligt, men Jeg kan ikke få syntaksen rigtig.
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 at få en liste over software uden versionsnummer.
Svar
Du har dræbt dine citater og syntaks. For at indstille inputfeltadskilleren er den nemmeste måde at gøre det med -F
på kommandolinjen:
awk -F "[0-9]" "{ print $1 }"
eller
awk -F "[[:digit:]]" "{ print $1 }"
Dette vil bruge ethvert ciffer som inputfeltadskiller og derefter sende det første felt fra hver linje.
[0-9]
og [[:digit:]]
udtryk er ikke helt de samme, afhængigt af dit land. Se “ Forskel mellem [0-9], [[: digit:]] og \ d “.
Man kunne også indstille FS
i selve awk
-programmet. Dette gøres normalt i en BEGIN
-blok, da den “er en engangsinitialisering:
awk "BEGIN { FS = "[0-9]" } { print $1 }"
Bemærk den enkelte citater kan “ikke bruges i en enkelt citeret streng i skallen, og at awk
strenge altid bruger dobbelt anførselstegn.
Kommentarer
- Er det muligt at få adgang til FS og se den streng, den matchede?
Svar
+1 for Kusalanandas svar. Alternativt kan FS-variablen indstilles i BEGIN-blokken:
awk "BEGIN {FS="[0-9]"} {print $1}"
Ændring af FS i en handlingsblok vil ikke træde i kraft, indtil næste linje læses
$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk "{FS="[0-9]"; print $1}" abc123 ghi
De andre fejl i spørgsmålet:
- kan ikke bruge enkelt anførselstegn inde i en enkelt citeret streng
-
==
er en sammenligningsoperator,=
er til variabel tildeling
Kommentarer
- " Changi ng FS i en handlingsblok vandt ' t træder i kraft, indtil den næste linje læses " I ' har været på udkig overalt for disse oplysninger.
- plus: kan ' ikke bruge enkelt anførselstegn for strengværdi i awk, selvom du sender dem fra shell korrekt
- Er det muligt at få adgang til FS og se den streng, den matchede?
-
FS
er en variabel, så du gør hvad som helst enhver anden variabel (f.eks.print FS
). For at få de dele, der matcher FS, med POSIX awk, tror jeg, du ikke kan. Med GNU awk kan du skriven = split($0, fields, FS, separators)
hvorfields
ogseparators
er arrays.