Hogyan használjuk a regexet mezőelválasztóként az awk-ban?

A regexet terepi elválasztóként próbálom használni a awk mezőben. Olvasmányomból ez lehetségesnek tűnik, de Nem tudom rendben a szintaxist.

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

Gondolatok? A cél, ha nem is obviouse, egy verziószám nélküli szoftverek listájának megszerzése.

Válasz

Összevagdalta idézeteit és szintaxisát. A beviteli mező elválasztójának beállításához a legegyszerűbb módja a -F opció a parancssorban:

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

vagy

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

Ez bármely számjegyet használna beviteli mező elválasztóként, majd minden sor első kimenetét adja ki.

A [0-9] és a [[:digit:]] kifejezések nem egészen ugyanazok, a területi beállításoktól függően. Lásd: “ Különbség a [0-9], [[: digit:]] és \ d ” között.

Beállítható FS magában a awk programban. Ez általában egy BEGIN blokkban történik, mivel egyszeri inicializálás:

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

Ne feledje, hogy a single az idézőjelek nem használhatók egyetlen idézett karaktersorozatban a héjban, és a awk karakterláncok mindig dupla idézőjeleket használnak.

Megjegyzések

  • Hozzáférhetünk az FS-hez és megnézhetjük a hozzá illesztett karakterláncot?

Válasz

+1 Kusalananda válaszához. Alternatívaként az FS változó beállítható a BEGIN blokkban:

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

Az FS megváltoztatása egy műveleti blokkban csak akkor lép érvénybe, amíg a következő sort elolvassa.

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

A kérdés többi hibája:

  • nem használhat egyetlen idézőjelet egyetlen idézőjelű karakterláncban
  • == egy összehasonlító operátor, = változó hozzárendelésére szolgál

megjegyzések

  • " Changi ng FS egy műveleti blokkban nem fog ' érvénybe lépni, amíg a következő sort be nem olvassák " I ' már az egész információt kereste.
  • plusz: ' nem használhat egyetlen idézőjelet a string értékéhez az awk-ban, még akkor sem, ha a shell pontosan
  • Lehetséges-e hozzáférni az FS-hez és megnézni az annak megfelelő sztringet?
  • FS egy változó, így bármi hasonlót megtehet bármely más változó (pl. print FS). Az FS-hez illeszkedő alkatrészek megszerzéséhez a POSIX awk-val azt hiszem, nem lehet. A GNU awk segítségével írhat n = split($0, fields, FS, separators) ahol fields és separators tömbök.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük