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.
- 772 megtekintés
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
- A hozzászóláshoz be kell jelentkezni
Ha busybox, akkor szerintem ash és awk áll rendelkezésére.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Arra is van releváns találsz, amin érdemes elindulni: http://stackoverflow.com/questions/22550265/read-certain-key-from-certa…
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Igen ash a shell.
awk, grep, sed, cut rendelkezésre áll.
Teljesen mindegy, hogy mivel csinálom mert ugyanannyira új terület nekem. Már a regexp is olyan, hogy csak erős próbálgatással ollóztam össze amit kellett.
Eddig grep-el kerestem és sed-el módosítottam.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Az OK, hogy megtudom. Már pár órája kiszenvedtem hogy olvassam és írjam, csak abban a fájlban nem volt ismétlődő elem, mint itt a [node] részek.
Bár szerintem azt sem a legszebb úton oldottam meg.
Szóval a kérdés a hogyan.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Aztán a következő ini szekció elején vissza kell billenteni a 'nagyon figyelj' változót 'nem' értékre. Szerintem ezt kihagytad.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
"és mostantól nem kell nagyon figyelni"
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
A fenti megoldásban nem az ini szekció állítja be a flag-et, hanem a megfelelő label.
Akkor hibás az enyém, ha a megfelelő label-t nem követ user az adott szekción belül, amire előzetes kikötést tettem.
Vagy félreértek valamit?
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Szoktam arra törekedni, hogy a programom ne omoljon össze akkor sem, ha van hiba a feldolgozandó file-ban.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
És ha a következő szekció jelölése hibás, mondjuk lemarad a [ vagy a ]?
Üdv,
Marci
- A hozzászóláshoz be kell jelentkezni
Awk-ban közel C szintaxissal tudsz programozni, nem csak a regexp-ekben jó az a nyelv.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
$ 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
- a
label
mindig auser
előtt van - minden
user
egylabel
é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 hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
-n
opció: ne írjon a kimenetre/label.*=.*abcd/,/[node]/
: ez két reguláris kifejezés vesszővel elválasztva, mégpediglabel.*=.*abcd
és[node]
. Ezzel egy tartományt(?) jelölök ki, hogy hol dolgozzunk. Azaz attól a sortól kezdve, hogylabel.*=.*abcd
, és a[node]
sorig tartson.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 ased
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 :)
- A hozzászóláshoz be kell jelentkezni
Í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.
- A hozzászóláshoz be kell jelentkezni
Ááááá, 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...
- A hozzászóláshoz be kell jelentkezni
[A-Z], [0-9], [123456789], [:space:] és társai.
Ezek megvannak de nem tűnt fel. :)
Köszi!
- A hozzászóláshoz be kell jelentkezni
Egészségedre!
Remélem, most már rendesen működik :)
- A hozzászóláshoz be kell jelentkezni