Wie verwende ich Regex als Feldtrennzeichen in awk?

16

Ich versuche, Regex als Feldtrenner in zu verwenden awk. Aus meiner Sicht scheint dies möglich, aber ich kann die Syntax nicht richtig verstehen.

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

Gedanken? Das Ziel, wenn nicht offensichtlich, ist es, eine Liste von Software ohne Versionsnummer zu erhalten.

Graue Rasse
quelle

Antworten:

25

Sie haben Ihre Anführungszeichen und die Syntax durcheinander gebracht. Um das Trennzeichen für Eingabefelder festzulegen, verwenden Sie am einfachsten die -FOption in der Befehlszeile:

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

oder

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

Dies würde eine beliebige Ziffer als Eingabefeldtrennzeichen verwenden und dann das erste Feld aus jeder Zeile ausgeben.

Die Ausdrücke [0-9]und [[:digit:]]sind je nach Gebietsschema nicht ganz gleich. Siehe " Unterschied zwischen [0-9], [[: digit:]] und \ d ".

Man könnte auch FSim awkProgramm selbst einstellen . Dies geschieht normalerweise in einem BEGINBlock, da es sich um eine einmalige Initialisierung handelt:

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

Beachten Sie, dass einfache Anführungszeichen in einer Zeichenfolge in Anführungszeichen in der Shell nicht verwendet werden können und dass awkZeichenfolgen immer doppelte Anführungszeichen verwenden.

Kusalananda
quelle
12

+1 für Kusalanandas Antwort. Alternativ kann die FS-Variable im BEGIN-Block gesetzt werden:

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

Das Ändern von FS in einem Aktionsblock wird erst wirksam, wenn die nächste Zeile gelesen wird

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

Die anderen Fehler in der Frage:

  • Innerhalb einer Zeichenfolge in Anführungszeichen können keine einfachen Anführungszeichen verwendet werden
  • ==ist ein Vergleichsoperator, =dient zur variablen Zuordnung
Glenn Jackman
quelle
1
"Das Ändern von FS in einem Aktionsblock wird erst wirksam, wenn die nächste Zeile gelesen wird."
Samizdis
1
Plus: In awk können keine einfachen Anführungszeichen für den Zeichenfolgenwert verwendet werden, auch wenn Sie sie von der Shell aus korrekt übergeben
dave_thompson_085