Config fájl adat keresése és szerkesztése

Lenne egy kis busybox-os linux, tehát nem minden parancs/eszköz áll rendelkezésre, vagy azok nem minden funkciójukkal.
Configurációs fájlokat szeretnék szerkeszteni, egyfajta alapbeállításhoz használatos scriptet csinálni. Több helyen vannak fájlok amikben érdemesebb lenne egyszerre kényelmesen módosítanom paramétereket.
Van már olyan amit sikerült keresnem és szerkesztenem, viszont elakadtam az alábbi konfigurációs fájl struktúránál.


[node]
label          = abcd
user           = usr1

[node]
label          = efgh
user           = usr2

Az "abcd" node-ban kellene kiolvasnom az user-t és megváltoztatnom.

Szívesen veszek minden javaslatot.

Hozzászólások

Ez az .INI file szerkezete, minden elterjedt scriptnyelv támogatja vagy van modul hozzá.

Milyen scriptnyelveket ismersz/preferálsz/áll rendelkezésre?

Üdv,
Marci

Nem tudom, hogy van-e szabvány az .ini fájl formátumára. Egyszer használtam a crudini programot ilyen célra, de az azt feltételezte, hogy az egyes szekciók neve eltérő. Pl. node1, node2,…. Emlékeim szerint, akkor több programot is megnéztem, de mindegyik feltételnek tekintette ezt. Az OP-ban levő struktúra kicsit megnehezíti a helyzetet.

Most néztem meg a LEDE router-emen, busyboxban is van awk. Azzal biztosan meg tudod csinálni, amit szeretnél.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Feltételezve, hogy label mindig megelőzi user-t.

Nagyon figyelj:= nem
Ha nem vagy végén a filenak ismételd ezt:
-olvass be egy sort
-ha illeszkedik a label=abcd sorra, akkor nagyon figyelj:= igen
-ha nagyon kell figyelni és user= minta van a sor elején, módosítsd a sort, ahogy kell és mostantól nem kell nagyon figyelni
-írd ki a sort

Üdv,
Marci

De nem, mert akkor mondjuk az előző ini szekció beállítja a figyelő flag-et, viszont nem használja azt el, a következő szekcióban még áll a flag, de a label nem stimmel, viszont mégis felhasználásra kerül, s fals lesz az eredmény.

Azt mondom, nem akkor kell visszaírni a flag-et figyelmetlenségre, amikor felhasználtuk, hanem a szekció végén, viszont ilyen jelünk nincs, így a következő szekció elején.

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Ezzel a résszel tisztában vagyok. Ha megvan az adat kilépek az olvasásból. Majd az újboli hívás megoldja a reset-et.
Viszont, megkeresni levágni stb... részeket az adatból, tehát az awk használata már nem nagyon megy.
Mióta javasoltátok az awk-t keresgetek, példákat, mintákat. Majd kitisztul a működése az agyamban.

$ cat teszt.dat
[node]
label          = abcd
user           = usr1

[node]
label          = efgh
user           = usr2

$ # kiíratás
$ sed -n "/label.*=.*abcd/,/[node]/ s,user *= *\(.*\),\1,p" teszt.dat
usr1

$ # megváltoztatás
$ sed "/label.*=.*abcd/,/[node]/ s,user\( *=\).*,user\1 xyz," teszt.dat
[node]
label          = abcd
user           = xyz

[node]
label          = efgh
user           = usr2

Persze csak akkor működik, ha

  1. a label mindig a user előtt van
  2. minden user egy label és egy [node] között van, ellenkező esetben az utolsó node-ban semmiféleképpen sem lesz csere. Ez persze orvosolható, ha ( cat teszt.dat ; echo '[node]' ) | sed ... módon hívod meg.

A label mindig az user előtt van. Viszont nem mindig azonnal utána jön. Lehetnek közötte más beállítások is. (Itt lehet a gond)
Valami hasonlót próbáltam összerakni én is. Bár még nem nagyon értem mi mire való teljesen a regexp-ben.
A teszt.dat-al tökéletesen működik, viszont a rendes config fájllal nem akar menni. (Itt van adat a label és az user között)
Volt egy merész ötletem, hogy kiszedek belőle ezt, azt, de nagyon nem sikerült a dolog. Bár arra rájöttem, hogyha nem busybox-on próbálgatom, akkor látok hibaüzenetet is.
A kiíratás résszel gyakoroltam.
Azt is szívesen veszem ha két sorban leírod mi mit jelent. Mert amire próbáltam rájönni, az se nagyon sikerült.
Ha jól értem az elején egy keresés van label+"bármi"+=+"bármi"+abcd-re, de utána már a "/[node]/ s"-t sem nagyon értem. Sőt szerintem az első részt sem.

Viszont nem mindig azonnal utána jön. Lehetnek közötte más beállítások is. (Itt lehet a gond)

Szerintem ez nem gond. De ha esetleg megosztod, hogy pontosan mi a fájl (vagy legalább a hibás részt), lehet, hogy megtalálom, hogy mit szúrtam el.

Azt is szívesen veszem ha két sorban leírod mi mit jelent.

Na, legyen egy kis gyereknap :)

$ sed -n "/label.*=.*abcd/,/[node]/ s,user *= *\(.*\),\1,p" teszt.dat
  1. -n opció: ne írjon a kimenetre
  2. /label.*=.*abcd/,/[node]/: ez két reguláris kifejezés vesszővel elválasztva, mégpedig label.*=.*abcd és [node]. Ezzel egy tartományt(?) jelölök ki, hogy hol dolgozzunk. Azaz attól a sortól kezdve, hogy label.*=.*abcd, és a [node] sorig tartson.
  3. s,user *= *\(.*\),\1,p boncolgatása:
    • s: cserélni fogunk
    • ,: szeparátor (kb. bármelyik karakter lehetne)
    • user *= *\(.*\) esetén "user-szóközök-egyenlőség-szóközök-bármi" karaktersorozatot keresünk és cserélünk. A "bármi"-t megjegyezzük (zárójelbe raktam, ez lesz majd a user neve, amit kiírunk).
    • \1: az előző pontban elsőként megjegyzett sztringre (gy.k. user neve) cserélünk.
    • p: ezt viszont kiírjuk (a -n paraméter miatt csak azt fogja a sed kiírni, amire kifejezetten megkérjük)

A cserélős rész hasonló, szerintem ez alapján már meg lehet érteni. De ha mégsem, kérdezz :)

Így már világosabb.
Túl egyszerűsítettem a config fájlt, első körben. Ezzel nem működik, jelenleg. Itt már kicsit több adat van benne mint az első példában.


[node]
label            = abcd
address          = 1.2.3.4
user             = usr1
password         = pwd1
enabled          = yes

[node]
label            = efgh
address          = 8.8.8.8
user             = usr2
password         = pwd2
enabled          = no

A segítségen kívül a magyarázatot is köszönöm.

Ááááá, ez nekem fáj :)
Szóval a lényeg: a [node]-ot cseréld le \[node\]-ra :)
Ui. a [node] (sed-ben) azt jelenti, hogy az n, o, d és e karakterek közül valami, és már az "address"-ben is van d betű (meg e), azaz nem fogja tovább nézni, és nyilván addig nem talált user-mezőt...