Newsgroup: it.lavoro.informatica
Titolo: [OT] script per windows per manipolare testo

Scusate l'OT ma i gruppi di windows sono un po' inutili da sto punto di
vista.
Sto cercando di esportare i log di SQL server, che sono dei txt, ad un
demone syslog. Ho trovato un ottimo comando, klog, che consente tramite
un semplice pipe:
more log.txt | klog -h <ip> -i
di farmi mandare riga per riga il testo come fossero messaggi syslog.
C'è un modo semplice per far sì che ogni 30 secondi io possa
reiterare l'operazione solo per le nuove righe?
Per il primo caso, ho pensato ad "operazioni pianificate", ma per
prendere solo le righe nuove, senza bisogno di scrivere un batch in
perl di cui non so una cippola?
Se avete qualche idea è benvenuta...
Ciao e grazie

tonizzo ha scritto:

vbscript

 reiterare l'operazione solo per le nuove righe?
Mi vengono in mente (in questo momento) due idee, una richiede la
conoscenza del C, altra del Perl:
-Scaricati textutils da 
http://directory.fsf.org/textutils.html
 e cerca
il programma tail. L'opzione tail -f ti permette di visualizzare solo
le nuove righe. Modifica il sorgente secondo le tue esigenze
aggiungendo il reindirizzamento delle righe lette al programma che vuoi
tu,
-Scaricati da CPAN 
http://www.cpan.org/modules/01modules.index.html
 il
modulo Perl File::Tail (File-Tail-0.99.3.tar.gz) fatto da M. Grabnar.
Questo modulo (se non ricordo male) chiede come dipendenze anche il
Time::HiRes e probabilmente ancora qualche modulo che dovrebbe far
parte della distribuzione standard di Perl. File::Tail sta simulando il
"tail -f", ma con una interessante caratteristica. Tenendo conto la
velocita di scrittura di righe nuove nel file di log adegua la sua
velocità di lettura. In pratica, se a un file di log arrivano le righe
lentamente, File::Tail (opportunamente configurato) evita di sprecare
cicli del processore andando a leggerlo spesso. Se le righe cominciano
ad arrivare più spesso,  riduce l'intervello tra due letture, e
viceversa. File::Tail ha ancora una caratteristica importante: tiene
conto anche della rotazione dei file di log.
Spero di essere stato d'aiuto.

P.S:
Perl ti conviene impararlo comunque.

 tu,
Se masculo tu non fossi te bacierei :)
Pare essere esattamente quel che cercavo... Ho passato un'ora a
smadonnare con gawk (awk per windows)...
Speriamo funzioni, grazie mille...

 Speriamo funzioni, grazie mille...
In bocca al lupo. Facci sapere poi, e restituisci il favore alla
comunità dei sviluppatori e condividi i sorgenti. :-)

 comunità dei sviluppatori e condividi i sorgenti. :-)
Allora, è bastato poco e funziona quasi del tutto. E' quel quasi che
non lo fa funzionare per nulla... :)
Lo script è banalissimo:
use File::Tail;
$file=File::Tail->new("C:/sql_server_logs/LOGPROVA.txt");
while (defined($line=$file->read)) {
	print "$line";
}
Ok, butta fuori l'output ogni 60 secondi (tempo di default) a schermo,
riga per riga... Allora ho pensato di lanciare sto comandino in pipe:
provalog.pl
 | klog -h 192.168.1.2 -i
Non passa nulla a keylog! Da notare che se faccio
more file.txt | klog -h 192.168.1.2 -i
oppure
dir /p | klog -h 192.168.1.2 -i
Funziona! Forse è errato usare "print" nel file perl per l'output?
Mortacci, mi manca una briciola... forse :)

 Mortacci, mi manca una briciola... forse :)
Allora, premetto che di Windows so poco o niente, e il programma che
hai usato (klog) non lo conosco e non so cosa potrebbe essere
l'intoppo, e se l'intoppo sta in quello. Mi vengono in mente alcuni
altri problemi che ritengo più probabili. Uno è che - se non ricordo
male, e tieni presente anche la mia ignoranza in Windows - è che mi
sembrava che le pipe di Windows non erano così complete di
funzionalità come quelle di UNIX. So che c'era una estensione (penso
si chiamasse Win32::Pipe, che aggiungeva a Perl altre funzionalità, ma
non l'ho mai provata e non ti so dire di più). Inoltre File::Tail l'ho
usato ultima volta tre anni fa e non mi ricordo tutti i particolari
(Provato il: perldoc File::Tail ?), ma mi ricordo che c'era un
parametro nowait che faceva in modo che il programma non si bloccasse
in attesa dei dati. Forse è quello il problema perché al pipe non
perviene niente? Oppure, un altro potenziale problema che potrebbe
essere il mancato flushing del buffer?
La cosa che ti potrei suggerire (scusa, ma sono troppo preso per
aiutarti a cercare soluzioni, se non hai fretta bestiale potrei
vedere...tra qualche giorno) è di invocare il klog dentro lo script
Perl. Dentro lo script Perl puoi aprire una pipe e passare i dati da un
processo ad un altro.
Alcuni esempi di funzionamento li puoi vedere qui:
http://www.cs.cmu.edu/People/rgs/pl-exp-io.html
O qui:
http://www.wellho.net/solutions/perl-controlling-multiple-asyncronous-processes-in-perl.html
http://www.thescripts.com/forum/thread50239.html
Ti suggerisco di leggere:
perldoc -f pipe
perldoc -q pipe
perldoc perlopentut
perldoc perlipc
Sono alcune delle cose che ho trovato con una ricerca velocissima e
superficiale, e che vanno molto oltre a quello che serve a te, e non so
se risponderanno a tutte le tue domande (scusa, ma come ti ho detto non
ho tempo di sperimentarle io), ma spero che ti possano dare sufficenti
indicazioni per poter cercare tu stesso le soluzioni.
Ciao.

Dimenticavo:
Il ng it.comp.lang.perl è il luogo adatto dove puoi chiedere ulteriori
spegazioni. Non lo frequanto da un bel po' e non so se la squadra sia
cambiata, ma erano persone sempre molto disponibili, e anche i livelli
di discussioni erano decisamente più elevati e seri di quelli che
spesso si legge qui. Il mio consiglio è di chiedere a loro.
Ciao.

 Perl.
Stavo cercando di scoprire infatti come fare. Non credo che usare il
comando klog, che è un eseguibile, dentro uno script possa
funzionare... O no?
Grazie mille cmq, mi sei stato d'aiuto parecchio...
Ciao

 Grazie mille cmq, mi sei stato d'aiuto parecchio...
Ho visto che hai postato il discorso su it.comp.lang.perl. Hai fatto
bene. Dopo dò un'occhiata anche'io al programma e ti rispondo lì se
trovo qualcosa di sbagliato.

 trovo qualcosa di sbagliato.
Sì, ho postato con gli ultimi tentativi... Se non trovo nulla domani
cambierò metodo, ma mandare messaggi in pipe mi aveva esaltato. Potrei
anche appendere i cambiamenti ad un nuovo file di testo eppoi
schedulare il klog, ma è molto macchinosa come soluzione...
Ciao e grazie

 Se avete qualche idea č benvenuta...
Io ne ho una:
Logparser (sito unofficial 
http://www.logparser.com
)
Log Parser is a free command-line tool from Microsoft that lets you run
SQL queries against a variety of log files and other system data
sources, and get the results out to an array of destinations, from SQL
tables to CSV files.
E' fatto da un italiano emigrato negli USA, supporta molti input
e output differenti (tra cui proprio syslog come output)
Input: 
http://www.logparser.com/InstantKB/article.aspx?id=10005
Output: 
http://www.logparser.com/InstantKB/article.aspx?id=10006
Tra le diverse cose che supporta c'e' anche una modalita' di caricamento
"progressivo" dei log/event/file (tramite "checkpoint") che gli permette
di ricordare  a che punto e' arrivato ed effettuare la query successiva
solo sulla restante parte del log/event/file.
Non so dirti se matcha al 100% con il tuo obiettivo (imho sicuramente
permette di farlo ma magari trovi un metodo piu' semplice) ma e'
sicuramente un tool sufficientemente flessibile da risultare utile per
diversi lavori da sistemista windows...
Ciao,
NC

> Logparser (sito unofficial 
http://www.logparser.com
)
parrebbe fare al caso mio ma...
ormai mi son già fatto lo script in Perl... :(
Ciao e grazie