Wie verwende ich Regex als Feldtrennzeichen in awk?

Ich versuche, Regex als Feldtrennzeichen in awk zu verwenden. Nach meiner Lektüre scheint dies aber möglich zu sein 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 ist, wenn nicht offensichtlich, eine Liste von Software ohne Versionsnummer zu erhalten.

Antwort

Sie haben Ihre Anführungszeichen und Syntax durcheinander gebracht. Um das Eingabefeldtrennzeichen festzulegen, können Sie dies am einfachsten mit der Option -F in der Befehlszeile tun:

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 FS im Programm awk. Dies erfolgt normalerweise in einem BEGIN -Block, da es sich um eine einmalige Initialisierung handelt:

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

Beachten Sie diese Single Anführungszeichen können nicht in einer Zeichenfolge mit einfachen Anführungszeichen in der Shell verwendet werden, und awk Zeichenfolgen verwenden immer doppelte Anführungszeichen.

Kommentare

  • Ist es möglich, auf den FS zuzugreifen und die übereinstimmende Zeichenfolge anzuzeigen?

Antwort

+1 für Kusalanandas Antwort. Alternativ kann die FS-Variable im BEGIN-Block festgelegt 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:

  • kann keine einfachen Anführungszeichen in einer Zeichenfolge in einfachen Anführungszeichen verwenden
  • == ist ein Vergleichsoperator, = ist für die Variablenzuweisung

Kommentare

  • " Changi ng FS in einem Aktionsblock wird ' erst wirksam, wenn die nächste Zeile gelesen wird. " I ' habe überall nach diesen Informationen gesucht.
  • plus: ' kann keine einfachen Anführungszeichen für den Zeichenfolgenwert in awk verwenden, selbst wenn Sie sie von übergeben Shell korrekt
  • Ist es möglich, auf den FS zuzugreifen und die übereinstimmende Zeichenfolge anzuzeigen?
  • FS ist eine Variable, sodass Sie so etwas tun können jede andere Variable (z. B. print FS). Ich denke, Sie können nicht, um die Teile zu erhalten, die mit FS übereinstimmen, mit POSIX awk. Mit GNU awk können Sie n = split($0, fields, FS, separators) schreiben, wobei fields und separators Arrays sind.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.