Jak používat regex jako oddělovač polí v awk?

Pokouším se použít regex jako oddělovač polí v awk. Z mého čtení se to zdá možné, ale Nemohu správně pochopit syntaxi.

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

Myšlenky? Pokud to není zřejmé, je cílem získat seznam softwaru bez čísla verze.

Odpovědět

Složili jste své nabídky a syntaxi. Nejjednodušší způsob, jak nastavit oddělovač vstupního pole, je možnost -F na příkazovém řádku:

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

nebo

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

Jako oddělovač vstupního pole by se použila jakákoli číslice a z každého řádku by se vygenerovalo první pole.

Výrazy [0-9] a [[:digit:]] nejsou zcela stejné, v závislosti na vašem národním prostředí. Viz „ Rozdíl mezi [0-9], [[: digit:]] a \ d „.

Lze také nastavit FS v samotném programu awk. To se obvykle provádí v BEGIN bloku, protože se jedná o jednorázovou inicializaci:

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

Všimněte si, že jeden uvozovky nelze použít v řetězci s jednou uvozovkou v shellu a awk řetězce vždy používají uvozovky.

Komentáře

  • Je možné získat přístup k FS a zobrazit řetězec, který odpovídá?

Odpovědět

+1 pro odpověď Kusalanandy. Alternativně lze proměnnou FS nastavit v BEGIN bloku:

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

Změna FS v akčním bloku se projeví až po přečtení dalšího řádku.

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

Další chyby v otázce:

  • nelze použít uvozovky uvnitř řetězce s jednou uvozovkou,
  • == je operátor porovnání, = je pro přiřazení proměnných

Komentáře

  • " Changi ng FS v akčním bloku se ' projeví až do přečtení dalšího řádku " I ' tyto informace hledal všude.
  • plus: nemůže ' t použít jednoduché uvozovky pro hodnotu řetězce v awk, i když je předáte z správně shell
  • Je možné získat přístup k FS a zobrazit řetězec, který se shoduje?
  • FS je proměnná, takže můžete dělat cokoli jako jakákoli jiná proměnná (např. print FS). Chcete-li získat součásti, které odpovídají FS, s POSIX awk, myslím, že nemůžete. S GNU awk můžete psát n = split($0, fields, FS, separators) kde fields a separators jsou pole.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *