Newsgroup: it.comp.os.linux.iniziare
Titolo: espressioni regolari: tutto tranne

Ho bisogno di creare una espressione regolare che mi cerchi tutte le
righe che contengono una certa stringa purchè non sia presente anche
un'altra sulla stessa riga.
Con la | è facile:
$ cat file|grep STR_A|grep -v STR_B
ma io ho bisogno di farlo con una sola espressione.
cat file|sed "s/.*STR_A.*STR_B.*/------/"
mi trova una riga che abbia entrambe le stringhe (STR_B si troverà
sempre dopo stringa e va bene così).
ma io ho bisogno di
$ cat file|sed "s/.*STR_A.*(no STR_B).*/---------/"
se può aiutare, STR_B è 'st'; è sempre preceduta da '(' e susseguita da
1, 2 o 3 numeri piu' '):'fine della riga.
in caso STR_B non sia presente, (, numeri, ): POSSONO essere presenti
per un'altra stringa, ma possono non essere completamente presenti
perchè ci saranno ancora altre stringhe.
Per chi non lo avesse ancora capito, 'st' sta per 'scsi tape', l'altra
stringa possibile nelle parentesi è 'sd' o 'ssd' che sta per 'scsi
disk'. STR_A è WARNING
Il mio programma di monitoraggio si basa su queste stringhe regolari e
io non voglio essere avvertito per gli errori sui tape perchè è più o
meno normale (per ora; non me ne occupo io) che ci siano, e poichè sono
troppi, va a finire che non vedo più gli errori NON TAPE (ho perso già
due volte due dischi su un raid5.....)
come si fa questa cavolo di stringa regolare? in man non mi ha aiutato a
sufficenza.
Matteo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

due volte due dischi su un raid5.....)
E perche' non escludi i warning e cerchi solo gli error, o
addirittura solo i "NON TAPE"?
-- 
Ciao,		|   Attenzione! campo "Reply-To:"  alterato	|
Remigio Zedda	|   posta: ti.ilacsit@zoigimer  <-- dx/sn  ;^)	|
	-- GNU/Linux 2.4.25 su Slackware 9.1

 addirittura solo i "NON TAPE"?
Non ti seguo.
faccio prima a postarti un esempio di messaggi:
WARNING: /pci@1f,4000/SUNW,ifp@2/ssd@w2100002037593058,0 (ssd12):
WARNING: md d4: read error on /dev/dsk/c6t83d0s2
WARNING: md: d4: /dev/dsk/c6t83d0s2 needs maintenance
WARNING: /pci@1f,4000/scsi@4/st@2a,9 (st44):
la prima significa errori sui dischi
la seconda e terza errori sul raid
la quarta errori sul tape
io devo estrapolare la prime 3 e scartare la quarta.
Ovviamente in mezzo a queste righe ce ne sono altre su cui non c'è la 
parola WARNING. Quelle non sono di interesse e le devo skippare.


parola WARNING. Quelle non sono di interesse e le devo skippare.
Puoi redirigere lo stderr del tape a /dev/null, oppure
risparmi una pipe con grep -i warning file|grep -v st@2a
anziche' cat file|grep eccetera.
Se poi ci dici perche' non ti vanno bene due pipe..


 Se poi ci dici perche' non ti vanno bene due pipe..
$ cat messages|grep WARNING|grep -v \(st
è solo per rendere una idea.
Se poi si vogliono risparmiare le pipe:
$ sed -s "d/<espressione>/" messages
è equivalente alla grep sopra, a patto di trovare l'espressione
giusta... ed ho eliminato del tutto le pipe
In verità ciò che mi serve non è NE un grep NE un sed NE un cat
il mio sistema (che non è uno script) penserà a prendere in input il 
quello che deve monitorare (in questo caso il messages), lo passerà ad 
una stringa regolare che gli passo io, filtrerà l'output in modo da 
inviare la notifica via email e/o monitor
quindi a me serve solamente quella espressione.
ero riuscito a trovarla, ma valeva solo con una quantità fissa di 
numeri, quindi funzionava per st00 ma non per st0 o st000
era qualcosa del tipo (non la ricordo a memoria e non la ho davanti)
WARNING.*[^t]....$
questa mi elimina qualsiasi stringa che abbia una 't' come
quint'ultimo carattere. E' accettabile e supponibile che le stringhe 
che voglio invece visualizzare non abbiano una 't' in quella posizione
(anche perchè quelle che mi interessano di più finiscono per non 
finiscono con t....$
Per ora mi sono attrezzato con uno scriptino lanciato in crontab ogni 
ora che spara direttamente via email, ma è fuori del sistema di 
monitoraggio
Per la cronaca, il sistema è SMC


On Tue, 17 Aug 2004 22:06:56 +0000 (UTC), Matteo Rossini wrote:
[total snip]
Forse con perl o awk, ma mi spiace li conosco poco.
Se nessun altro qui ti aiuta prova a ripostare su .sys che
mi sembra piu` adatto.
