Notizia:
  • Rilasciata Precise Pangolin 12.04. Per ottenerla, visitate questa pagina, oppure provate il tour dal vivo con un browser web moderno.
  • Nuovo forum di Ubuntu-it, l'annuncio. È consigliato aggiornare il proprio profilo e controllare la sezione Gruppo Forum per problemi noti.
  • Rilasciata la versione italiana di Precise Pangolin 12.04. Per maggiori informazioni, consultare questa discussione.
  • Il vincitore del Concorso desktop del mese di aprile è Jerico. L'elenco dei precedenti vincitori è qui.
  • È uscito il numero 17 della Newsletter italiana di Ubuntu. Lo trovate a questo indirizzo.
  • È uscito il numero 59 di Full Circle Magazine in italiano. Lo trovate a questo indirizzo.

cercare più termini con grep

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

Re: cercare più termini con grep

Messaggioda l3on4rdo » martedì 7 febbraio 2012, 13:24

toro2k ha scritto:E infatti non avevo capito un tubo... :)
Pero` bisogna usare xargs altrimenti potrebbero venire fuori troppi parametri per il grep "esterno".

Codice: Seleziona tutto
grep -liwR PATTERN1 DIR | xargs grep -liw PATTERN2


bah, grep accetta una lista di file come input in cui cercare
manpage di grep ha scritto:SYNOPSIS
      grep [OPTIONS] PATTERN [FILE...]
      grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

Se ho capito cosa intendi, al massimo il problema lo si ha se ti pesca mille milioni di file (ma non so se xargs lo risolva, perché uso davvero raramente quel comando)

In realtà un problemino lo dà quando viene trovato un risultato che corrisponde ai criteri di ricerca ma ci sono degli spazi nel nome del file o delle cartelle che lo contengono.

Sì, questo era implicito.
Lo si ha praticamente sempre, ma basta usare le solite precauzioni una volta trovato il comando che va bene
(leggi, quota le variabili... oppure cambia la variabile IFS)

@Zoff
Prendi con le pinze, perché non ricordo dove l'ho letto né se era documentazione "attendibile"... ma mi pare che con grep sia più  veloce  :-\
Ultima modifica di l3on4rdo il martedì 7 febbraio 2012, 13:29, modificato 1 volta in totale.
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Re: cercare più termini con grep

Messaggioda Zoff » martedì 7 febbraio 2012, 13:45

Può essere vero che awk è meno performante di grep.
Ma se di grep ne devi usare piu' di uno e devi usare anche le pipe sono abbastanza certo che awk sia piu' veloce...
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
 
Messaggi: 24443
Iscrizione: ottobre 2007
Località: Romagna!!!
Distribuzione: Ubuntu 12.04
Desktop: Unity e Gnome Shell

Re: cercare più termini con grep

Messaggioda l3on4rdo » martedì 7 febbraio 2012, 13:47

Zoff ha scritto:Può essere vero che awk è meno performante di grep.
Ma se di grep ne devi usare piu' di uno e devi usare anche le pipe sono abbastanza certo che awk sia piu' veloce...

Concordo, ma non ci stavo pensando :)
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Re: cercare più termini con grep

Messaggioda toro2k » martedì 7 febbraio 2012, 14:08

@l3on4rdo
il problema e` proprio che il primo grep produca una lista di argomenti troppo lunga per il secondo.
Quanto puo` essere lunga la lista degli argomenti e` un parametro configurabile del kernel, normalmente su Linux e` di 128KiB, su Ubuntu 10.04 ho constatato che e` 2Mib, in effetti e` un limite abbastanza ampio.
Uso xargs in ossequio al principio "Se la soluzione e` semplice, risolvi anche i problemi che non ti sono ancora capitati ma che potrebbero capitarti". :)

@iononsbaLGiomai (e anche @l3on4rdo)
Un'altra ragione per usare xargs! :)
Codice: Seleziona tutto
grep -liwR PATTERN1 DIR | xargs -d'\n' grep -liw PATTERN2


@Zoff (e anche @l3on4rdo)
lo script awk che hai scritto verifica che le due parole siano presenti sulla stessa riga. Sarebbero comunque necessarie due invocazioni del comando.
Se poi si vuole metterla sul piano di "chi va piu` veloce", vi lascio a arrovellarvi! :)
Software is meant to be soft!
Avatar utente
toro2k
Prode Principiante
 
Messaggi: 24
Iscrizione: gennaio 2012

Re: cercare più termini con grep

Messaggioda l3on4rdo » martedì 7 febbraio 2012, 14:13

And the winner is:

Codice: Seleziona tutto
grep -liwR PATTERN1 DIR | xargs -d'\n' grep -liw PATTERN2


ps: tanto per fare il punto :)
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Re: cercare più termini con grep

Messaggioda crap0101 » mercoledì 8 febbraio 2012, 0:48

l3on4rdo ha scritto:
Zoff ha scritto:Può essere vero che awk è meno performante di grep.
Ma se di grep ne devi usare piu' di uno e devi usare anche le pipe sono abbastanza certo che awk sia piu' veloce...

Concordo, ma non ci stavo pensando :)



più che altro il problema con grep è che (in questo caso) devi per forza leggere tutto il file, anche nell'ipotesi che si sappia per certo il risultato alla prima linea (i.e. `-m` non va bene).

Con AWK è invece più agevole fermarsi prima.
Esempio, con i seguenti file:
crap0101@crap0101-M:~/TEST$ cat /tmp/y.txt
miao
maio fef e
eef miao ef e
dfefe miao
bau
crap0101@crap0101-M:~/TEST$ cat /tmp/x.txt
miao
maio fef e
bau eef miao
dfefe miao bau
bau
crap0101@crap0101-M:~/TEST$ cat /tmp/z.txt
miaba ba u
umia fef ef mia o
mife fe
fe



Codice: Seleziona tutto
crap0101@crap0101-M:~/TEST$ awk '/miao/ {miao=1} /bau/ {bau=1} {if (bau && miao) { print FILENAME; miao=0; bau=0; nextfile } }' /tmp/*.txt
/tmp/x.txt
/tmp/y.txt
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
crap0101
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 4647
Iscrizione: ottobre 2007
Distribuzione: trisquel
Desktop: gnome-classic || LXDE

Re: cercare più termini con grep

Messaggioda l3on4rdo » mercoledì 8 febbraio 2012, 4:53

Se ho però capito il comando awk che hai postato, crap0101, con il comando grep in realtà si può usare l'opzione -m
... anzi io non ci avevo proprio pensato.
Per esempio, con questi file (che sono i "miei" più i tuoi):
Codice: Seleziona tutto
file1.txt
miao bau
miao pippo
foo miao
barabarabao miao
miao
bau

file2.txt
foo bar
miao
pippo

file3.txt
miao
maio fef e
eef miao ef e
dfefe miao
bau

file5.txt
miao
maio fef e
bau eef miao
dfefe miao bau
bau

file6.txt
miaba ba u
umia fef ef mia o
mife fe
fe


si ottengono gli stessi risultati:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/agrep$ awk '/miao/ {miao=1} /bau/ {bau=1} {if (bau && miao) { print FILENAME; miao=0; bau=0; nextfile } }' *.txt
file1.txt
file3.txt
file5.txt

Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/forum/agrep$ grep -liwRm 1 miao . | xargs -d'\n' grep -liwm 1 bau
./file3.txt
./file5.txt
./file1.txt


Non comprendo perché dici che con grep non si può usare l'opzione -m (cui ripeto io non avevo pensato), per stoppare (se ho capito) la ricerca di grep al primo match trovato.
Con il primo grep, stampi i nomi dei file (-l) che hanno almeno 1 miao (-m 1) e tra questi poi stampi i nomi dei file che hanno almeno un bau.
Fai praticamente la stessa cosa che fai con awk.
No?
Ultima modifica di l3on4rdo il mercoledì 8 febbraio 2012, 4:59, modificato 1 volta in totale.
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Re: cercare più termini con grep

Messaggioda crap0101 » mercoledì 8 febbraio 2012, 16:06

l3on4rdo ha scritto:
Non comprendo perché dici che con grep non si può usare l'opzione -m (cui ripeto io non avevo pensato), per stoppare (se ho capito) la ricerca di grep al primo match trovato.
in effettti stavo pensando a una situazione da grep singolo in cui non si avrebbe modo di sapere quando fermarsi, in questo caso invece sì.
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
crap0101
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 4647
Iscrizione: ottobre 2007
Distribuzione: trisquel
Desktop: gnome-classic || LXDE

Re: cercare più termini con grep

Messaggioda l3on4rdo » mercoledì 8 febbraio 2012, 16:15

A ne le pippe sulle performance intrippano fino all'ordine del femtosecondo.
Però, non so... magari è necessario leggere il codice di questi comandi.

Per esempio, per un ciclo awk come lo hai impostato tu... mi chiedo.
Con il primo grep dai una prima filtrata ai file che contengano almeno il primo match.
Con il ciclo awk devi comunque leggerli tutti, no?
Poi però controllando con time... awk è più performante, di un'inezia, ma è più veloce...
::)

ps: non facciamo più discorsi di performance... che mi si impicciano i neuroni.
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Re: cercare più termini con grep

Messaggioda crap0101 » mercoledì 8 febbraio 2012, 16:26

l3on4rdo ha scritto:Per esempio, per un ciclo awk come lo hai impostato tu... mi chiedo.
Con il primo grep dai una prima filtrata ai file che contengano almeno il primo match.
Con il ciclo awk devi comunque leggerli tutti, no?
Poi però controllando con time... awk è più performante, di un'inezia, ma è più veloce...
::)
con l'awk che ho scritto leggi il file linea per linea fino a che la condizione (ha trovato i 2 match) non è soddisfatta, a quel punto passi al file successivo.

Per la velocità, dipende molto da dove si trovano i pattern che matchano nel file. Usando grep con -m è sicuramente meglio di prima, ma con grep devi *comunque* leggere (almeno in parte) 2 volte i file.
Ipotizzando che in un file da 10000 linee i pattern matchanti si trovino alle linee 9998 e 9999, usando quel codice awk ti basta leggere 9999 linee, usando la soluzione con grep devi leggerne 9999 + 9998 (una volta per il primo pattern e una volta per il secondo).
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
crap0101
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 4647
Iscrizione: ottobre 2007
Distribuzione: trisquel
Desktop: gnome-classic || LXDE

Re: cercare più termini con grep

Messaggioda l3on4rdo » mercoledì 8 febbraio 2012, 16:50

Mamma mia quanto sono affascinanti le questioni sulle performance  (good)

Ultima domanda, poi magari aspettiamo che si riaffacci l'apritore della discussione che mi sa che s'è spaventato ;D
Per vedere il codice di questi programmi, c'è una strada "collaudata"... nel senso esiste un modo in cui si possono trovare (tutti) i codici dei comandi bash?
Magari un sito che li raccoglie tutti.
Può essere di qualche utilità? Dico ai fini di migliorare il proprio stile di programmazione.

Ciao
Come da regolamento, UNA DISCUSSIONE, PER OGNI PROBLEMA, DOPO aver verificato, con UNA RICERCA, che non sia stato già trattato.
E, prima di sparire con la soluzione, ricorda di mettere [Risolto] nel titolo del primo messaggio della discussione.
La vendetta è un piatto da consumare freddo. Per questo hanno inventato il freezer.
Avatar utente
l3on4rdo
Moderatore Globale
Moderatore Globale
 
Messaggi: 9705
Iscrizione: maggio 2008
Località: Roma
Distribuzione: Ubuntu 10.04.4 e 12.04 64bit
Desktop: Gnome

Precedente

Torna a Programmazione

Chi c’è in linea

Visualizzano questa pagina: crap0101, SuperStep e 6 ospiti