Hur använder jag regex som fältseparator i awk?

Jag försöker använda regex som fältseparator i awk. Från min läsning verkar detta möjligt men Jag kan inte få syntaxen rätt.

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

Tankar? Målet om inte obviouse är att få en lista över programvara utan versionsnummer.

Svar

Du har muggat upp dina citat och syntax. För att ställa in inmatningsfältavgränsaren är det enklaste sättet att göra det med alternativet -F på kommandoraden:

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

eller

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

Detta använder valfri siffra som inmatningsfältavgränsare och matar sedan ut det första fältet från varje rad.

[0-9] och [[:digit:]] uttrycken är inte helt samma, beroende på din plats. Se ” Skillnad mellan [0-9], [[: digit:]] och \ d ”.

Man kan också ställa in FS i själva programmet awk. Detta görs vanligtvis i ett BEGIN -block eftersom det är en engångsinitialisering:

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

Observera att singeln citat kan ”inte användas i en enda citerad sträng i skalet och att awk strängar alltid använder dubbla citat.

Kommentarer

  • Är det möjligt att komma åt FS och se strängen den matchade?

Svara

+1 för Kusalanandas svar. Alternativt kan FS-variabeln ställas in i BEGIN-blocket:

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

Att ändra FS i ett åtgärdsblock kommer inte att träda i kraft tills nästa rad läses

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

De andra felen i frågan:

  • kan inte använda enstaka citat i en enda citerad sträng
  • == är en jämförelseoperator, = är för variabel tilldelning

Kommentarer

  • " Changi ng FS i ett åtgärdsblock vann ' t träder i kraft tills nästa rad läses " I ' har letat över den informationen.
  • plus: kan ' inte använda enstaka citat för strängvärde i awk, även om du skickar dem från skal korrekt
  • Är det möjligt att komma åt FS och se strängen den matchade?
  • FS är en variabel så du gör något som vilken annan variabel som helst (t.ex. print FS). För att få delarna som matchar FS, med POSIX awk, tror jag att du inte kan. Med GNU awk kan du skriva n = split($0, fields, FS, separators) där fields och separators är matriser.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *