pont-ra keresés (sed)

pont-ra keresés (sed)

Hozzászólások

Hát, a ciklusos ránézegetés itt még oké is, mert nem számottevő az erőforrás-igénye, hacsak nincs pl. több tízezer file a könyvtáradban, mert azt feldolgozni már zúzósabb.
Az is igaz, hogy kicsit túllövés erre külön kódot írni, de... csak nem tudtam megállni, úgyhogy itt van, ha másnak nem, hát sormintának jó lesz valahová :) :
[code:1:d83723b2f9]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#define __USE_GNU
#include <fcntl.h>
#include <signal.h>
#include <string.h>
#include <errno.h>

int go_daemon = 0;
const char* dirname = "/tmp/ize";
int fd_access, fd_modify, fd_create, fd_delete, fd_rename, fd_attrib;

void sigio_handler(int signo, siginfo_t *info, void* context)
{
const char *reason;

if (info->si_fd == fd_access) reason = "access";
else if (info->si_fd == fd_modify) reason = "modify";
else if (info->si_fd == fd_create) reason = "create";
else if (info->si_fd == fd_delete) reason = "delete";
else if (info->si_fd == fd_rename) reason = "rename";
else if (info->si_fd == fd_attrib) reason = "attrib";
else reason = "unknown";
printf("Event happened; action='%s'\n", reason);
}

int my_open(const char *dirname, int mask)
{
int fd;

fd = open(dirname, O_RDONLY);
if (fd < 0)
exit(printf("Can't open %s; err='%s'\n", dirname, strerror(errno)));
if (fcntl(fd, F_SETSIG, SIGRTMIN))
exit(printf("Can't change signal; err='%s'\n", strerror(errno)));
if (fcntl(fd, F_NOTIFY, mask | DN_MULTISHOT))
exit(printf("Can't set F_NOTIFY; err='%s'\n", strerror(errno)));
return fd;
}

int main(void)
{
int i, j;
struct sigaction action;

action.sa_handler = NULL;
action.sa_sigaction = sigio_handler;
sigemptyset(&action.sa_mask);
action.sa_flags = SA_SIGINFO | SA_NOMASK;
action.sa_restorer = NULL;

if (go_daemon)
{
i = fork();
if (i < 0)
return printf("Can't fork daemon process; err='%s'\n", strerror(errno));
else if (i > 0)
return 0;

/*for (i = 0; i < 3; i++)
{
j = open("/dev/null");
if (j < 0)
return printf("Can't open /dev/null; err='%s'\n", strerror(errno));
if (dup2(j, i) < 0)
return printf("Can't redirect standard fd to /dev/null; fd='%d', err='%s'\n", i, strerror(errno));
close(j);
}*/
setsid();
}

if (sigaction(SIGRTMIN, &action, NULL))
return printf("Can't register SIGIO handler; err='%s'\n", strerror(errno));

fd_access = my_open(dirname, DN_ACCESS);
fd_modify = my_open(dirname, DN_MODIFY);
fd_create = my_open(dirname, DN_CREATE);
fd_delete = my_open(dirname, DN_DELETE);
fd_rename = my_open(dirname, DN_RENAME);
fd_attrib = my_open(dirname, DN_ATTRIB);

while (1) pause();
}
// vim:ts=4:noexpandtab:cino='':shiftwidth=4:
[/code:1:d83723b2f9]
Ez itt csak írkálja, hogy mi is történt annak a szerencsétlen könyvtárnak a file-jaival (igen, tudom, nem szerencsés signal handlerből printf-et hívni), és ennek okán daemon-módban nem is zárattam le vele az stdin/out/err-t, ahogy azt kellene. Plusz nem parancssori paraméterből szedem a könyvtárnevet, azt, hogy menjen-e daemon-módba, a hibakezelése is finoman szólva trehány, tehát ez a kód _csak_vázlat_.
Akit csak fárasztottam vele, attól bocsi, aki meg tudja használni valamire, annak pedig sok szerencsét :)!

Köszi! Ugyan én most maradok a parancssori eszközöknél, de jó lesz ez máshova! Jól látom, ez C-ben van?

Többezer fájlt nem kell átviszgálni, a temorary könyvtárak nem tartalmaznak ennyit, és egyes fájlok vizsgálata sem tart egy másodpercnél tovább. Ha ezt sleepelem néhány másodpercre, akkor az pont ideális.

Egy behatolásfigyelő programot készítettem, eddig crontaboltam, de kicsit sokalltam az 1 percet. Ezt a progiköteget ciklusba rakva, néhány másodpercre szunnyantva kb. 1, esemény bekövetkeztekor és annak feldolgozásakor max 3%-os CPU-terheltséget ad, ami bőven a tűréshatáron belül van.

Egy automatizált tükröző rendszert is készítek, primitíven egyszerű, és néhány forintból megvan, csak egy munkaállomásnak megfelelő gépre van szükség. (Volt egy másik változat, ami a SCSI-s RAID-vezérlők egyik nagy előnyét használta ki, de azt anyagi okból elvetették -- milyen hely lehet ez?) Lehet, hogy az marad a crontabban, de lehet, hogy átteszem sleepesre, még meglátom. Mindkét progiköteg egyik fő résztvevője a sed, ami azt hiszem, nem is csoda.

Az ngrepet akarom még munkába fogni, szörnyen tetszik az a szerkezet. Ha az ngrep kimenetét nem utólagosan elemezgetem, hanem már a kapcsolat felállásakor, akkor azzal érdekes dolgokat lehet véghez vinni.

Megint van egy kérdésem:

Mi lehet annak az oka, hogy ha egy tömény adatfolyamot greppelek, majd awkolok, akkor az awk kimenete szörnyen lassan jelenik meg, illetve mit lehet tenni azért, hogy a lehető leggyorsabban megjelenjen az awk kimenete?

Ja, és ha sed-del is szűröm, akkor már teljesen használhatatlan. :( Mit lehet tenni a folyamok szűrésének gyorsításáért?

Hali!

Hogyan lehet megoldani, hogy a sed ne tegye tönkre a sortöréseket?

Ha szövegcserére fogom a sed-et, remekül végrehajtja a feladatát, de a sorvége jelekkel valamit tesz, mert a cserével ellátott állomány kiolvasásakor a sortörések eltűnnek, és egybesorokat kapok. Mit kell mondani a sed-nek, hogy ezt ne tegye?

[quote:34bac8f81e="szucs_t"]Hali!

Hogyan lehet megoldani, hogy a sed ne tegye tönkre a sortöréseket?

Ha szövegcserére fogom a sed-et, remekül végrehajtja a feladatát, de a sorvége jelekkel valamit tesz, mert a cserével ellátott állomány kiolvasásakor a sortörések eltűnnek, és egybesorokat kapok. Mit kell mondani a sed-nek, hogy ezt ne tegye?

A sed egyaltalan nem torodik a sortoresekkel, csak a sorokkal. ird le a hasznalt kifejezesedet, akkor kiderul mit rontottal el.:)

[quote:f3889354de="anr"]A sed egyaltalan nem torodik a sortoresekkel, csak a sorokkal. ird le a hasznalt kifejezesedet, akkor kiderul mit rontottal el.:)

Ilyet írtam:
[code:1:f3889354de]sed 's/soveg errol/szoveg erre/g' < regifajl >ujfajl[/code:1:f3889354de]

A fájlbairányítással van a gond. Mit tegyek jól?

[quote:5d18043bb4="szucs_t"]Ha szövegcserére fogom a sed-et, remekül végrehajtja a feladatát, de a sorvége jelekkel valamit tesz, mert a cserével ellátott állomány kiolvasásakor a sortörések eltűnnek, és egybesorokat kapok.

Ilyesmit csak úgy tudtam előidézni, hogy a kiindulási file dos-os sorvégeket használt (CR LF), és a lecserélendő kifejezés illeszkedett a sorvégre (pl. a sor utolsó szavát cserélni 'alma'-ra: s/[^ ]*$/alma/), így a sed a unixos sorvég (LF) előtti CR karaktert is lecserélte, így aztán úgymond _a dos-os_ sorvégeket 'elrontotta'.
Ha be tudod idézni a pontos sed kifejezésedet ill. azt, hogy a bemeneti file-od milyen sorvégeket használt, esetleg egy-két sort abból is, akkor szívesen utánanézek.

[quote:90ea515db9="gsimon"]Ilyesmit csak úgy tudtam előidézni, hogy a kiindulási file dos-os sorvégeket használt (CR LF), és a lecserélendő kifejezés illeszkedett a sorvégre (pl. a sor utolsó szavát cserélni 'alma'-ra: s/[^ ]*$/alma/), így a sed a unixos sorvég (LF) előtti CR karaktert is lecserélte, így aztán úgymond _a dos-os_ sorvégeket 'elrontotta'.
Ha be tudod idézni a pontos sed kifejezésedet ill. azt, hogy a bemeneti file-od milyen sorvégeket használt, esetleg egy-két sort abból is, akkor szívesen utánanézek.

A parancs:[code:1:90ea515db9]sed 's/netmask 255.255.255.0 up/netmask 255.255.255.0 down/g' < rc.config > rc.config.uj[/code:1:90ea515db9]
Hogy tudom megnézni a bemeneti fájl kódolását? A recode-dal, ha jól tudom, csak átkódolni lehet.

[quote:25af7ae3bd="gsimon"]...és a lecserélendő kifejezés illeszkedett a sorvégre (pl. a sor utolsó szavát cserélni 'alma'-ra: s/[^ ]*$/alma/), így a sed a unixos sorvég (LF) előtti CR karaktert is lecserélte, így aztán úgymond _a dos-os_ sorvégeket 'elrontotta'.

Nekem nem illeszkedik a lecserélendő szöveg a sorvégére.

Van valami, ami, ha más nem, utólagosan átkonvertája a sorvégéket sorvégére?

Bevallom, nem tudtam reprodukálni a jelenséget, nálam rendesen működött.
Legegyszerűbben talán a midnight commander nézőkéjével nézheted meg, hogy milyen sorvégek vannak, F4-et nyomva hexa nézetben, esetleg hexcat vagy hasonló paranccsal, de tekintve, hogy tiszta unix rendszerről van szó (dos/win alatt legalábbis nem láttam még rc.*-ot :)...), nem valószínű, hogy ez a hiba.
A sed parancsban ugyan a pontok nincsenek ki-escape-elve ('255\.255\.255\.0'), így bármire illeszkednek, de ettől még működnie kellene.
A regex lib alapból a tetszőleges karakter-re ('.') illeszti ugyan a sorvégjelet (van ez ellen flagje :REG_NEWLINE), de nálad valószínűleg nem ez az eset, no meg a sed alapból amúgy is soronként olvas és azt dolgozza fel. Próbáld meg ki-escape-elni a pontokat, de nem hiszem, hogy ez lenne a gond. Ezen kívül viszont nincs tippem.
Ha nem ez az, akkor vágj már be ide pár sort abból az rc.config-ból légyszi!

Meg van!

Nyilván meg van rá a magyarázat, mégis különösnek tartom.

A kimeneti fájlnak a végére nem ".uj"-at írtam, hanem "-uj"-at, és úgy kafa minden!

Tehát a parancsom:
[code:1:465b406bde]sed 's/netmask 255.255.255.0 up/netmask 255.255.255.0 down/g' < rc.config > rc.config-uj[/code:1:465b406bde]

Mégis van megkülönböztető kiterjesztése a fájloknak Linux alatt?

[quote:fb8461090a="szucs_t"]Nyilván meg van rá a magyarázat, mégis különösnek tartom.
A kimeneti fájlnak a végére nem ".uj"-at írtam, hanem "-uj"-at, és úgy kafa minden!
Tehát a parancsom:
[code:1:fb8461090a]sed 's/netmask 255.255.255.0 up/netmask 255.255.255.0 down/g' < rc.config > rc.config-uj[/code:1:fb8461090a]
Mégis van megkülönböztető kiterjesztése a fájloknak Linux alatt?

Hát szerintem csak akkor, ha van egy rc.config-uj nevű file-od is, hibás tartalommal, és azt nézed, miközben ő korrektül generálja az rc.config.uj-at :).
De azért örülök, hogy végül is meglett!

[quote:7ac83d494c="gsimon"]...Legegyszerűbben talán a midnight commander nézőkéjével nézheted meg, hogy milyen sorvégek vannak, F4-et nyomva hexa nézetben, esetleg hexcat vagy hasonló paranccsal, de tekintve, hogy tiszta unix rendszerről van szó (dos/win alatt legalábbis nem láttam még rc.*-ot :)...), nem valószínű, hogy ez a hiba.
A sed parancsban ugyan a pontok nincsenek ki-escape-elve ('255\.255\.255\.0'), így bármire illeszkednek, de ettől még működnie kellene.

A "."-ok elé betettem a "\" jelet, de ugyanúgy rossz a régi fájlnévvel. A 0A karaktereket nevezte át 20-ra. Hogy milyen megfontolásból, nem tudom. Érdekes!

Mindegy, fő, hogy az új "." nélküli, "kiterjesztetlen", illetve csak egy kiterjesztéses(?) fájlnévvel működik. Mégis jó lenne tudni, mitől más, ha a fájl kiterjesztésének valamit megadok.

Tyűha, viszont észrevettem, hogy ".uj"-ként is működik, csak ".2" vagy a "." után bármilyen egyetlen számjeggyel nem. Bocsi, félrevezettem mindenkit!

De mi az oka?

[quote:9393d4892d="gsimon"]Hát szerintem csak akkor, ha van egy rc.config-uj nevű file-od is, hibás tartalommal, és azt nézed, miközben ő korrektül generálja az rc.config.uj-at :).
De azért örülök, hogy végül is meglett!

Tény és való, volt már mindenféle létrehozott fájl, de rosszul generálta le, de csak akkor, ha a fájl vége egy pont, és utána egy számjegy. Mi az ördögért?

[quote:441c0e854e="szucs_t"]Tény és való, volt már mindenféle létrehozott fájl, de rosszul generálta le, de csak akkor, ha a fájl vége egy pont, és utána egy számjegy. Mi az ördögért?

Most már akkor is érdekel, ha közben megoldódott :) !
Hmm. Pont-számjegyre végződő file-ok... Kissé manpage-hangulata van, és akként nézve tényleg áttördelve is jelenik meg (pl. 'man -l rc.config.0'-val). Mivel nézted? Simán ki-cat-elve is ömlesztve látszik?
(Pl. a midnight nézőkéje, ha valamilyen formátumúnak ítéli, átzavarja az általa jónak tartott szűrőn, és annak a kimenetét mutatja, ill. F4-re _annak_ a hezdump-ját... F8 a raw mode)

[quote:744daa9d5a="gsimon"]Most már akkor is érdekel, ha közben megoldódott :) !
Hmm. Pont-számjegyre végződő file-ok... Kissé manpage-hangulata van, és akként nézve tényleg áttördelve is jelenik meg (pl. 'man -l rc.config.0'-val). Mivel nézted? Simán ki-cat-elve is ömlesztve látszik?
(Pl. a midnight nézőkéje, ha valamilyen formátumúnak ítéli, átzavarja az általa jónak tartott szűrőn, és annak a kimenetét mutatja, ill. F4-re _annak_ a hezdump-ját... F8 a raw mode)

Igazad van! Vi-baj minden oké, csak az a nyamvadt MC hülyített be. Aztamindenit, az ilyen marhaságok csinálnak belőlem bohócot, illetve önmagam az ilyen marhaságokkal!

Köszi, a midnight volt az! Úgy látszik, a fejemben már éjfél van. A hexában megjelenített karakterkódok is csak a midnightban furcsák. Hogy lehet kikapcsolni ill. módosítani az MC-ben ezeket a szűrőket? Az F8-as átkapcsolgatás nem rossz, de tutira beleakadok hasonló hibába (bár ezek után nem valószínű!

[quote:8c741d4ca6="szucs_t"]Hogy lehet kikapcsolni ill. módosítani az MC-ben ezeket a szűrőket? Az F8-as átkapcsolgatás nem rossz, de tutira beleakadok hasonló hibába (bár ezek után nem valószínű!

F3 helyett Shift+F3.

[quote:f5f3e99b88="reviczky"]1) minden sor, ami "$$$"-vel kezdödik és csak szám van a végén (nem pedig szám-pont-szám) azt törölni akarom
Erre valami ilyesmit próbáltam:
[code:1:f5f3e99b88]sed /^[\$].*[^\.].*/d file[/code:1:f5f3e99b88] de ez így minden "$$$"-os sort kiszedte.
Érdekes, hogy csak a pontosokat viszont ki tudom szedni [code:1:f5f3e99b88]sed /^[\$].*[\.].*/d file[/code:1:f5f3e99b88]-el.

Teljesen jogos, hogy a második megy, az első meg nem. A második esetben megfogalmazod, hogy bármi, majd egy pont, majd megint bármi. Erre szépen illeszkedik mondjuk az "1.2".

Az első esetben azt fogalmazod meg, hogy bármi, majd egy nem pont, majd megint bármi. Erre is illeszkedik az "1.2". Például az első bármire az "1.", a nem pontra a "2", majd a második bármira az üres "" sztring. De másképp is lehet illeszteni. Persze lehet tudni, hogy a sed pontosan hogyan illeszt, de itt most csak az a lényeg, hogy lehet illeszteni.

Ha azt akarod leírni, hogy rakat számjegy, ami között nincs pont, akkor vonatkoztass el a pont karaktertől, és fogalmazd meg regexp-ben azt, hogy rakat számjegy. Például [0-9]+

[quote:9768b5ff7c="szucs_t"]Hogy lehet kikapcsolni ill. módosítani az MC-ben ezeket a szűrőket? Az F8-as átkapcsolgatás nem rossz, de tutira beleakadok hasonló hibába (bár ezek után nem valószínű!

- options/configuration/Use internal view: off :)
- az extension file-ban a 'view'-t kikommentezni az adott kategóriákra, de onnan nem fog menni az értelmezett nézet

Úgy vettem ki, hogy kapcsolója és/vagy config opciója arra, hogy indításkor a nyers nézetet mutassa, az nincs :(.

Egyébként még annyi megjegyzés, hogy az egy szem karaktert (még ha több karakterként is kódolod le), teljesen fölösleges [] közé tenni. Nyilván [\$] vagy [\.] írható simán \$ vagy \. alakban is.

Köszi mindkettőtöknek!

A Shift+F3 jó megoldás (megszokom!), a Use Internal is jó, a vi akármilyen faramuci is, sok előnye van.

Kicsit más, de bármilyen furcsának is tűnik, ide tartozik: tudtok megoldást arra, hogy a rendszer megadott időközönként ellenőrizze le az e2fs-t, úgy, hogy ő a /?

[quote:4b21f91dbe="szucs_t"]...ellenőrizze le az e2fs-t, úgy, hogy ő a /...

Legjobb tudomásom szerint ez erősen ellenjavallt dolog, legfeljebb akkor érdemes, ha már más megoldás nincs, a root fs csak olvashatóra van mountolva, és az fsck után rögtön újraindítás következik.
Ha belegondolsz, hogy pl. az fsck alatt az adatok lemezen való elhelyezkedése erősen változhat, viszont még az olvasások is cache-elve vannak, a legkevesebb, amire számítani lehet, az a korrupt olvasás, ami már önmagában sem egészséges. Ha ehhez hozzávesszük, hogy (az FHS-sel ellentétben) általában a root fs írhatóra van mountolva, még a lemezen is korrumpálja az adatokat, magyarán ha az fsck írja a lemezt, akkor több kárt csinál(hat), mint hasznot.

Elvileg read-only root fs esetén csak ellenőrzésre használható az fsck, mert nincs írás, tehát írási cache sem, így még ki nem írt adat sem. Ehhez egyszerűen be kell rakni cron-ba, és kész, mert ha nem sikerül az ellenőrzés, a parancs kimenetét a cron úgyis levélben küldi a megadott címre (man e2fsck, man crontab, man 5 crontab).

[quote:3e814f6dbd="gsimon"]Legjobb tudomásom szerint ez erősen ellenjavallt dolog, legfeljebb akkor érdemes, ha már más megoldás nincs, a root fs csak olvashatóra van mountolva, és az fsck után rögtön újraindítás következik.

Természetesen nem akarom felcsatolva ellenőrizni, éppen ez a lényeg! Automatán ellenőrizné és szükség szerint kijavítaná saját hibáit. Illetve az bosszant engem, hogy a sok fel-lefűzésnél, pontosabban az újraindítgatások sokasága (ami évekre vetítve tűnik soknak) után a következő újraindításnál állandóan figyelmeztet a rendszer, hogy sokszor volt újraindítva. Ezzel akarnék kezdeni valamit azon kívül, hogy ne indítsam újra a rendszert, mert vannak extrém esetek, amikor szükség van erre (és eppen egy ilyen extrém eset automatizált kezelését kívánom megoldani egy érdekesen egyszerű és olcsó módszerrel -- a honlapomon majd, ha sikeres lesz, elárulom, mi is az).

[quote:72b815308c="szucs_t"]Illetve az bosszant engem, hogy a sok fel-lefűzésnél, pontosabban az újraindítgatások sokasága (ami évekre vetítve tűnik soknak) után a következő újraindításnál állandóan figyelmeztet a rendszer, hogy sokszor volt újraindítva.

A tune2fs '-c' és '-i' opciói a te barátaid. Átírhatod, hogy hány újraindítás ill. mennyi idő után csináljon mindenképpen ellenőrzést, ill. le is tilthatod, bár a manpage-en van egy-két érv ez ellen.

[quote:140622a723="gsimon"]A tune2fs '-c' és '-i' opciói a te barátaid. Átírhatod, hogy hány újraindítás ill. mennyi idő után csináljon mindenképpen ellenőrzést, ill. le is tilthatod, bár a manpage-en van egy-két érv ez ellen.

Tényleg ez a barátom, és te is, köszi! Ez jó lesz!

Arra van valamilyen jó ötlet, hogy a crontab minimálisan 1 percét lecsökkentsük mondjuk 5-10 másodpercre? Vagy van valamilyen események figyelésére szakosodott héjprogram? Ha például megváltozik egy könyvtár tartalma, azonnal jelezzen. Ha ez is megvan, jön a királyság-császárság (ahogyan egy ismerősöm szokta volt mondani).

[quote:4c2e689aba="szucs_t"]Arra van valamilyen jó ötlet, hogy a crontab minimálisan 1 percét lecsökkentsük mondjuk 5-10 másodpercre?

Nem tudok ilyesmiről, legalábbis alapcsomagból nem.
[quote:4c2e689aba="szucs_t"]Ha például megváltozik egy könyvtár tartalma, azonnal jelezzen.

C-ből és perl-ből a doksik szerint lehet (2.4-től felfelé), bár még nem próbáltam. Elvileg az fcntl()-nek lehet olyat mondani, hogy F_NOTIFY, eseményeket, hogy mikre ugorjon (olvasás, írás, létrehozás, törlés, átnevezés, attribútum-változtatás), ilyenkor dob egy SIGIO signal-t, amit aztán úgy kezel le az ember, ahogy akar.
Ha minden jól megy, akkor próbálok estére v. holnapra összerakni egy kis példát rá (legalább én is kipróbálom :)...), de most van egy kis találkozóm egy makrancos kódrészlettel és a gdb-vel :evil:.
Perl vagy C érdekelne inkább?

Az mkfifo-val is próbálkoztam, de semmivel sem gyorsabb. Másfajta megközelítési mód kellene. Mi lehet az?

Na, perl-ben összeütöttem valamit, ami (jelen esetben) kiír egy sort, ha történik valami a '/tmp/ize' könyvtárban. Amit még ki kell reszelnem, hogy ugyan nyerjük már ki valahogy a handler-ben vagy a maszkot, hogy mi történt, vagy legalább az fd-t, hogy mivel, de egyelőre csak szívok vele. Van egy olyan, hogy bits/siginfo.ph, abban van si_fd() meg si_band(), ezt húzza be a linux/signal.ph, de képtelen vagyok működésre rugdalni.
Valakinek ötlete?

[code:1:06f8ed968e]
#!/usr/bin/perl -w

use strict;
use Config;
use Fcntl qw(F_NOTIFY DN_ACCESS DN_MODIFY DN_CREATE DN_DELETE DN_RENAME DN_ATTRIB DN_MULTISHOT);

my ($fd);

$| = 1;

sub sigio_handler()
{
print "valami tortent a /tmp/ize-vel\n";
}

$SIG{IO} = \&sigio_handler;

open($fd, "/tmp/ize") || die "Can't open /tmp/ize";
fcntl($fd, F_NOTIFY, DN_ACCESS | DN_MODIFY | DN_CREATE | DN_DELETE | DN_RENAME | DN_ATTRIB | DN_MULTISHOT) ||
die "Can't set F_NOTIFY on the fd";
while (<>)
{
print $_;
}
[/code:1:06f8ed968e]

[quote:fbc4487488="szucs_t"]Mi lehet annak az oka, hogy ha egy tömény adatfolyamot greppelek, majd awkolok, akkor az awk kimenete szörnyen lassan jelenik meg, illetve mit lehet tenni azért, hogy a lehető leggyorsabban megjelenjen az awk kimenete?

Nem tartom kizártnak, hogy az awk kimenete pufferelve van, pl. 4kbyte-onként. Tegyél be a kiírásaid után egy 'fflush()'-t, ha megjavul tőle, akkor ez volt az :).

[quote:dc0deb56e5="gsimon"]Nem tartom kizártnak, hogy az awk kimenete pufferelve van, pl. 4kbyte-onként. Tegyél be a kiírásaid után egy 'fflush()'-t, ha megjavul tőle, akkor ez volt az :).

Köszi, az awk-on segít (a Posix asszem nem érdekel), de ha megadok valami hasonlót:[code:1:dc0deb56e5]ngrep -d eth1 | grep 'bomb|al-kaida' | awk '{print $4; fflush();}' | sed 's/:[0-9]*//g' > /terror/gyanus.log[/code:1:dc0deb56e5], akkor mire a kimeneti fájlban megjelenik a kért adat, addigra lemegy a nap.

Felőlem agyalhattok ezen, de mi lenne ha olyasmit csinálnátok, aminek több haszna van? Aki KDE-t vagy GNOME-t használ, annak ugyanis valószínűleg (inetd-ből) fut egy fam nevű szerver szoftvere (esetleg használhat a disztribed gamin -t is helyette). fam = File Alteration Monitor (SGI találmány), ez pontosan ezt csinálja meg; viszonylag egyszerű C API-ja van, amivel meg lehet kérni, hogy mit figyeljen (dir-t, file-t, stb). Akkor már inkább ahhoz írjatok akármilyen nyelvű szkriptet.

Természetesen az előbbi kód balgaság, márcsak azért is, mert az ngrep már önmagában képes a mintakeresésre, de a grepre emellett is szükség lehet, ahogyan a következő kódban is: [code:1:c56a6cc887]ngrep -d eth1 -t -i 'sex|porno|teenies' port 80 | grep '172.16.1.123' >> /gonosz/sag.log[/code:1:c56a6cc887] Azonban ha a grep kimenetét egy awkkal szűröm, majd azt egy seddel, amit végül egy fájlba nyomok, akkor szörnyen lassan érkezik a folyam a célhoz. Már az awkig is lassú, az awk az fflushsal kicsit gyorsabb, de a sed megint nagyon belassít. Az ngrep és a sed ugye nem pufferel?

Köszi gsimon!

Igazság szerint a C jobb lenne, egyáltalán nem értek Perlül, de ahogyan a kódból látom, majdnem C. A probléma főként az, hogy a Linux programozásába még nem vetettem bele magamat, a DOS-Windows rendszerekhez szoktam (itt szégyellem is magamat). Az fcntl()-t és annak F_NOTIFY-ja tényleg jó megoldásnak tűnik, de meg kell tudnom, hogyan is működnek.

A kérdésedre sajnos én nem tudom a választ, remélem valaki igen. Mert a progika jónak tűnik első ránézésre (mádosikra sem tudom jobban megítélni), ami már önmagában is megoldást nyújt egy-két dologra. Pláne, hogy az eseménykezelés jobb az időzítésnél. Ha megtörtént a változás, akkor bármi mással meg lehet nézni, mi is, és hogyan is, úgyhogy jó lesz ez. Illetve... Hogyan lehet perlben bash utasításokat adni?

[quote:ae20d31880="Zahy"]Aki KDE-t vagy GNOME-t használ, annak ugyanis valószínűleg (inetd-ből) fut egy fam nevű szerver szoftvere (esetleg használhat a disztribed gamin -t is helyette).

Jó lehet az a FAM, de az általa készített programok működnek X nélkül is, héjban futtatva? Valamiféle nagyon egyszerű példát tudnál mutatni?

Félreértetted. A fam egy szerverprogram, az X-től teljesen független, csak épp tudtommal a GNOME és a KDE is használja. Doksinak pedig "man 3 fam" és a "man 1 fam" a javasolt.

Hali!

Két dolgot szeretnék sed-el csinálni:

a forrás fájl úgy néz ki, hogy:
[code:1:07ad0695dd]
$$$szöveg 1.2
szöveg
$$$szöveg 10
szöveg
$$$szöveg 55.12
szöveg
.
.
.
[/code:1:07ad0695dd]

1) minden sor, ami "$$$"-vel kezdödik és csak szám van a végén (nem pedig szám-pont-szám) azt törölni akarom
Erre valami ilyesmit próbáltam:
[code:1:07ad0695dd]sed /^[\$].*[^\.].*/d file[/code:1:07ad0695dd] de ez így minden "$$$"-os sort kiszedte.
Érdekes, hogy csak a pontosokat viszont ki tudom szedni [code:1:07ad0695dd]sed /^[\$].*[\.].*/d file[/code:1:07ad0695dd]-el. Ráadásul a pont negáltja egyáltalán nem akar menni, mert a [code:1:07ad0695dd]sed /^[^\.]/d file[/code:1:07ad0695dd] sem megy (nem ad ki semmit, akkor is ha van pont-tal kezdödö sor).

/hogy most [\.]-ot használok vagy csak [.]-ot nem változtat aproblémán/

2) minden sor, ami "$$$"-vel kezdödik, abban a pontot kettöspontra szeretnem cserélni
Ehhez meg hozzá sem tudok kezdeni (hogyan lehet összehozni, hogy valamire rákeresek és utána csak 1 karaktert cserélek ebben?)

Üdv.:
Ádám

Ha a szovegekben nincs szam, akkor ird ezt:
[code:1:501e3f57cc]sed /^[\$][^0-9]*[^\.].*/d file[/code:1:501e3f57cc]

Ha van bennuk szam, akkor nehezebb dolgod lesz.

A szövegben nincs szám (de pont lehet benne).

Sajnos ezzel sem megy (valahogy nem jó ez a [^\.], de miért?)

[quote:80d7b9d426="reviczky"]
1) minden sor, ami "$$$"-vel kezdödik és csak szám van a végén (nem pedig szám-pont-szám) azt törölni akarom
2) minden sor, ami "$$$"-vel kezdödik, abban a pontot kettöspontra szeretnem cserélni
Ehhez meg hozzá sem tudok kezdeni (hogyan lehet összehozni, hogy valamire rákeresek és utána csak 1 karaktert cserélek ebben?)

[code:1:80d7b9d426] sed '/^\$\$\$.*[^\.0-9][0-9]*$/d;s/^\(\$\$\$[^\.]*\)\.\(.*\)/\1:\2/g' [/code:1:80d7b9d426]
Write-only :), de működik...

Hihetetlen :)))

Akkorát bámultam ezen és müködik mint állat!

Ezer köszi gsimon!

Üdv.:
Ádám

[quote:8e6808d649="reviczky"]
Erre valami ilyesmit próbáltam:
[code:1:8e6808d649]sed /^[\$].*[^\.].*/d file[/code:1:8e6808d649] de ez így minden "$$$"-os sort kiszedte.
2) minden sor, ami "$$$"-vel kezdödik, abban a pontot kettöspontra szeretnem cserélni
Ehhez meg hozzá sem tudok kezdeni (hogyan lehet összehozni, hogy valamire rákeresek és utána csak 1 karaktert cserélek ebben?)

Üdv.:
Ádám

erdemes eloszor tr-vel lecserelnek barmi masra ami tuti nincs a stringben, es utana arra mar tudsz sed-et irni, egyebkent a legtobbet az info sed-ben a LIST-re keresve talasz:
`

    '
    `[^LIST]'
    Matches any single character in LIST: for example, `[aeiou]'
    matches all vowels. A list may include sequences like
    `CHAR1-CHAR2', which matches any character between (inclusive)
    CHAR1 and CHAR2.

    A leading `^' reverses the meaning of LIST, so that it matches any
    single character _not_ in LIST. To include `]' in the list, make
    it the first character (after the `^' if needed), to include `-'
    in the list, make it the first or last; to include `^' put it
    after the first character.

    The characters `$', `*', `.', `[', and `\' are normally not
    special within LIST. For example, `[\*]' matches either `\' or
    `*', because the `\' is not special here. However, strings like
    `[.ch.]', `[=a=]', and `[:space:]' are special within LIST and
    represent collating symbols, equivalence classes, and character
    classes, respectively, and `[' is therefore special within LIST
    when it is followed by `.', `=', or `:'. Also, when not in
    `POSIXLY_CORRECT' mode, special escapes like `\n' and `\t' are
    recognized within LIST. *Note Escapes::.

    De talan a forrasban kene megnezni mit csinal ilyenkor amikor . van a []-ben.

Aha, köszönöm ezt a hozzászólást is, így világos hogy az enyém miért nem ment.

[quote:3d26a926f0="Zahy"]Félreértetted. A fam egy szerverprogram, az X-től teljesen független, csak épp tudtommal a GNOME és a KDE is használja. Doksinak pedig "man 3 fam" és a "man 1 fam" a javasolt.

Értem, köszi! Nekem ugyan nincs fent sem Gnome, sem KDE, és sajnos maga a FAM sem, de megnézem, bár úgy látom, nem lesz könnyű feltelepíteni a kerneltámogatás miatt.

Közben találtam egy egyszerű, bár időzítéssel rendelkező eseményfigyelő megoldást: a ciklust. A crontabbal és az egy percével szenvedtem, miközben nincs rá szükség. Kedvem szerint időzíthetek a sleep paranccsal, "oszt jóccakát"! A trapre vagyok még kíváncsi, azzal is megoldható néhány dolog. Meg lesz ez az eseménykezelés egyszerű eszközökkel, mindenféle telepítgetés nélkül. Az awk helyett is néhány esetben elegendő a cut, ami gyorsabb. Nagyon sok dolgot tudnak ezek a parancssoros eszközök. A sed sem olyan lassú!