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 írhatn = split($0, fields, FS, separators)
aholfields
ésseparators
tömbök.