Newsgroup: it.comp.os.linux.development
Titolo: Flex

Ho un maledettisimo file di log dal quale vorrei estrarre tutti gli
indirizzi IP.
Per questo ho deciso di utilizzare flex come analizzatore lessicale che
utilizza le espressioni regolari.
Quindi ho scritto questo semplicissimo sorgente
/* file di test */
%{
#include <string.h>
#include <stdio.h>
%}
/* regular definitions */
DELIM [ \t]
WS {DELIM}+
LETTER [a-zA-Z]
DIGIT [0-9]
IP {DIGIT}+[.]{DIGIT}+[.]{DIGIT}+[.]{DIGIT}+
%%
{WS}
{IP}            { printf("%s\n",yytext); }
.
%%
main()
{
 yylex();
}
che viene compitato con il gcc e le opzioni -lfl e -o
Risultato : non funziona !!!
Per curiosita' mi sono scaricato il compilatore gcc e le relative
utility di Flex e Bison per w95 e una
volta compilato il programma , meraviglia delle meraviglie, funziona.
Non lo accetto : lo schifosissimo w95 genera un output corretto e linux
non tira fuori nulla.
Utilizzo la Red Hat 6.1.
Il problema adesso e' capire perche' lo stesso codice non funziona sotto
linux. Ci sono altre opzioni da specificare ? Se si quali
?
Insomma la richiesta e' mi date una mano a far funzionare questo codice,
buttando w95 ?
Grazie a tutti

]

indirizzi IP.
cat file	\
	| tr -c "[0-9.]" "\n" \
	| grep "[1-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[1-9][0-9]*" \
	| sort \
	| uniq \
	-c | sort -rn
Se NON togli l'ultima riga, te li ordina dai piu' frequenti ai meno
frequenti, se no te li da tutti (togliendo i doppioni).
Leonardo
".signature": bad command or file name

 volta compilato il programma , meraviglia delle meraviglie, funziona.
Forse perche` stai usando una versione piu` recente di flex che ha
questa feature?
-- 
Matteo Ianeselli  
matteoianeselli AT 
poboxes.com


Per lex non garantisco, ma per flex sicuramente si puo'


 Risultato : non funziona !!!
Mi sembra corretto... Che problemi hai riscontrato?
Ciao,
-- 
Diego    | Per le repliche elimina dal mio indirizzo le 
Dainese  | `x' e inverti le due parole intorno alla `@'

Ho riscontrato i seguenti problemi:
la stessa specifica (file.fl) se compilato su piattaforma w95 + flex, genera
un programma perfettamente funzionante.
Se lo stesso file lo porto su piattaforma Linux , dopo aver compilato il file
lex.yy.c , il programma eseguibile non funziona, e cioe' mi tira fuori delle
linee vuote al posto degli indirizzi IP.
Tra l'altro lo stesso programma e' stato compilato su piattaforma Linux da
un'altra persona e a suo dire funziona regolarmente.
Non sa' pero' quale sia la versione del kernel e della distribuzione.
Quindi ricapitolando lo stesso file .fl puo' essere portato sia su w95 che su
Linux.
Per w95 :
flex file.fl e genera un file lexyy.c
gcc lexyy.c -lfl -o log.exe genera l'eseguibile.
log.exe < log.txt tira fuori tutti gli indirizzi IP.
Per Linux
flex file.fl genera un file lex.yy.c
gcc lex.yy.c -lfl -o log genera l'esguibile.
./log <log.txt NON TIRA FUORI UN ... niente !
Potreste compilare sulle vostr macchine il file in questione e dirmmi se
funziona.
Al posto del file di test si potrebbe usare /etc/hosts
./log < /etc/hosts Dovrebbe tirare fuori gli indirizzi IP contenuti nel file.
Attendo con ansia le risposte !!!
Saluti a tutti


 
Da me funziona; ho una SuSE 6.3 con
  flex 2.5.4 
  egcs 2.91.66
  glibc 2.1.2
  linux 2.2.13
Ribadisco pero' che per questo genere di cose flex non e' il mezzo
piu' indicato, a meno che tu non abbia un estremo bisogno di
prestazioni.


Diego,
ti ringrazio innanzitutto per la disponibilita'.
Le versioni di software che hai indicato corrispondono esattamente a quelle che ho
io eccetto la versione del kernel che sulla macchina che ho installato e' la
2.2.12-20.
Non credo pero' che sia questa, perche' da quanto ne so' le distribuzioni includono
il kernel standard.
A questo punto sono ad un vicolo cieco e non so' come uscirne..
Le prestazioni poi sono molto importanti, in quanto la macchina non e'
particolarmente veloce, ne' ha molta ram, di conseguenza la scelta e' quasi
obbligata.
Grazie ancora.
Saluti Andrea


 
Di niente, ciao
-- 
Diego Dainese

FUNZIONAAAAAAAAAAAAAAA !
Ho semplicemente riscritto il file con il caro buon vecchio vi da zero.
Rispetto al file orgine (scritto in dos) ci sono alcuni bytes in meno.
Non ho fatto un hexdump per verificare quali fossero, pero' posso ipotizzare
l'esistenza di caratteri non stampabili che rendeva il file .c
inutlizzabile.
Guardero' comunque il daemon, e' sicuramente importante confrontarsi.
Ciao e grazie di nuovo
