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.

cercare più termini con grep

Messaggioda andrew_taylor » martedì 7 febbraio 2012, 1:55

ciao a tutti.
ho un centinaio di cartelle che contengono parecchi documenti.
mi serve trovare tutti i documenti che contengono le parole X e Y, anche non sulla stessa riga. mi basta che contengano queste due parole.

parto da questo comando :

Codice: Seleziona tutto
grep -i -r -H "X" /home/cartella


come aggiungo una seconda keyword?
c'è un modo per creare un file di output .txt che contenga i risultati di grep?

thanx :)
andrew_taylor
Prode Principiante
 
Messaggi: 29
Iscrizione: settembre 2010

Re: cercare più termini con grep

Messaggioda iononsbaLGiomai » martedì 7 febbraio 2012, 2:03

Dovrebbe essere così:
Codice: Seleziona tutto
grep -i -r -H "KEYWORD1" PERCORSO1 && grep -i -r -H "KEYWORD2" PERCORSO2
Avatar utente
iononsbaLGiomai
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 2617
Iscrizione: novembre 2011

Re: cercare più termini con grep

Messaggioda andrew_taylor » martedì 7 febbraio 2012, 2:19

hmm .. non sembra andare .. le considera due operazioni diverse con due keyword diverse. in pratica mi recupera tutti i documenti con la keyword X e tutti quelli con la Y; a me servono i documenti con X e Y insieme.
andrew_taylor
Prode Principiante
 
Messaggi: 29
Iscrizione: settembre 2010

Re: cercare più termini con grep

Messaggioda l3on4rdo » martedì 7 febbraio 2012, 2:21

Sono sulla stessa riga?
Se sì, usa il comando agrep
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania/agrep$ echo -e "miao bau" > file1.txt
l3on4rdo@l3on4rdo-laptop:~/Scrivania/agrep$ echo -e "foobar" > file2.txt
l3on4rdo@l3on4rdo-laptop:~/Scrivania/agrep$ echo -e "foo bar" > file2.txt
l3on4rdo@l3on4rdo-laptop:~/Scrivania/agrep$ agrep "miao;bau" *
file1.txt: miao bau
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 andrew_taylor » martedì 7 febbraio 2012, 2:23

no, non sono sulla stessa riga. sono .. o meglio .. devono essere nello stesso documento, ma possono anche essere su righe diverse.
andrew_taylor
Prode Principiante
 
Messaggi: 29
Iscrizione: settembre 2010

Re: cercare più termini con grep

Messaggioda l3on4rdo » martedì 7 febbraio 2012, 2:23

Ah, no. Dici che non sono sulla stessa riga, scusa.

Spiega un po' la struttura di queste directory.
Hai una directory con dentro altre directory?
Sono directory sparse?

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

Re: cercare più termini con grep

Messaggioda andrew_taylor » martedì 7 febbraio 2012, 2:28

ho una directory principale in home/Scrivania/Nuova
dentro ci sono altre directory recuperate con ntfsundelete. quindi è
Codice: Seleziona tutto
home/Scrivania/Nuova/recup.dir1
home/Scrivania/Nuova/recup.dir2


ecc ..

con questo
Codice: Seleziona tutto
grep -i -r -H "X" /home/Scrivania/Nuova


cerco tutti i file che abbiano X come keyword all'interno.
ma mi servirebbe cercare tutti i file che abbiamo contemporaneamente X e Y all'interno, anche non sulla stessa riga.
andrew_taylor
Prode Principiante
 
Messaggi: 29
Iscrizione: settembre 2010

Re: cercare più termini con grep

Messaggioda l3on4rdo » martedì 7 febbraio 2012, 2:37

Codice: Seleziona tutto
find DIRECTORY -type f | while read fileName; do if grep X $fileName > /dev/null; then grep Y $fileName > /dev/null && echo $fileName; fi ; done


Puoi dare il comando da dove ti pare (nel file system)
DIRECTORY, nel tuo caso è il path (relativo, rispetto a dove lanci il comando) della directory
X e Y sono le parole da cercare.

Funziona?

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

Re: cercare più termini con grep

Messaggioda andrew_taylor » martedì 7 febbraio 2012, 2:42

il penultimo termine è 'fi' non 'if' ?
andrew_taylor
Prode Principiante
 
Messaggi: 29
Iscrizione: settembre 2010

Re: cercare più termini con grep

Messaggioda l3on4rdo » martedì 7 febbraio 2012, 2:45

Sì, il token fi chiude il blocco if in bash.
Esempio, con i file:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania$ cat agrep/file1.txt
miao bau
miao pippo
foo miao
barabarabao miao
miao
bau
l3on4rdo@l3on4rdo-laptop:~/Scrivania$ cat agrep/file2.txt
foo bar
miao

pippo


avrai:
Codice: Seleziona tutto
l3on4rdo@l3on4rdo-laptop:~/Scrivania$ find agrep -type f | while read fileName; do if grep miao $fileName > /dev/null; then grep bau $fileName > /dev/null && echo $fileName; fi ; done
agrep/file1.txt
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 andrew_taylor » martedì 7 febbraio 2012, 2:56

ho lanciato i comandi spostandomi nella cartella di livello superiore alle altre che hanno i dati recuperati.
ora mi sta dando dei risultati, ne ho controllato uno e sembra essere quello che mi serviva.
però data l'ora tarda, controllerò domani mattina i risultati.

comunque ti ringrazio già da adesso  :)
andrew_taylor
Prode Principiante
 
Messaggi: 29
Iscrizione: settembre 2010

Re: cercare più termini con grep

Messaggioda l3on4rdo » martedì 7 febbraio 2012, 2:59

Ci sono in realtà alcune cose da controllare.

Ti interessa, per esempio, che le minuscole e le maiuscole siano trattate ugualmente?
(ho visto che mettevi l'opzione -i)

Ti interessa cercare solo parole vere e proprie?
Nel senso che se cerchi "bar" ti trova solo "bar" e non anche "dskgshbarcshj"

Più o meno dovrebbe andare.
Ma serve qualche limatura :)

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

Re: cercare più termini con grep

Messaggioda iononsbaLGiomai » martedì 7 febbraio 2012, 12:22

andrew_taylor ha scritto:hmm .. non sembra andare .. le considera due operazioni diverse con due keyword diverse. in pratica mi recupera tutti i documenti con la keyword X e tutti quelli con la Y; a me servono i documenti con X e Y insieme.


Ah, non avevo ben capito allora.
Avatar utente
iononsbaLGiomai
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 2617
Iscrizione: novembre 2011

Re: cercare più termini con grep

Messaggioda l3on4rdo » martedì 7 febbraio 2012, 12:35

Riscrivo in modo più leggibile il codice postato ieri sera.

Codice: Seleziona tutto
find dirPath -type f | while read fileName
do
    if grep -iw PAROLA1 $fileName > /dev/null; then
        grep -iw PAROLA2 $fileName > /dev/null && echo $fileName
    fi
done


In pratica la logica è questa:
1) trovami tutti i file contenuti in dirPath (tutti! anche quelli nelle subdirectory)
2) leggi l'output del precedente comando riga per riga (ovvero i path dei file trovati) e controlla che il file contenga PAROLA1
3) se trovi PAROLA1, controlla che il file contenga PAROLA2, e solo se la trovi stampami il path del file

Si può limitare la ricerca di find ad una profondità desiderata (con le opzioni mindepth e maxdepth)
La ricerca tramite grep, in questo codice ma non in quello di ieri, è "vincolata" con le opzioni -i e -w
-i per considerare allo stesso modo minuscole e maiuscole
-w per cercare solo i match della parola vera e propria (ossia, se cerco bar non troverò dsfljbardalkj)

Ciao
Ultima modifica di l3on4rdo il martedì 7 febbraio 2012, 12:37, 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 toro2k » martedì 7 febbraio 2012, 12:47

Se ho capito il problema
Codice: Seleziona tutto
grep -lRE 'keyword_uno|keyword_due' la_directory_dove_vuoi_cercare
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, 12:51

Non deve cercare i file che contengano MATCH1 e/o MATCH2, ma quelli che contengono sia MATCH1 sia MATCH2 (sulla stessa riga o meno).

Sto cercando di capire se esiste modo di farlo solamente con un comando grep, ma non credo.

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

Re: cercare più termini con grep

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

@ toro2k

In effetti però, invece di fare il ciclo sull'output di find, conviene usare l'opzione -l come hai fatto tu.
Non so se può dare problemi, ma, se non li dà, di sicuro è più veloce fare così:

Codice: Seleziona tutto
grep -liw MATCH2 `grep -liwR MATCH1 dirPath`


edit: pare che non dia problemi e funzioni  (good)
Ultima modifica di l3on4rdo il martedì 7 febbraio 2012, 13:08, 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 toro2k » martedì 7 febbraio 2012, 13:11

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
Ultima modifica di toro2k il martedì 7 febbraio 2012, 13:16, modificato 1 volta in totale.
Software is meant to be soft!
Avatar utente
toro2k
Prode Principiante
 
Messaggi: 24
Iscrizione: gennaio 2012

Re: cercare più termini con grep

Messaggioda iononsbaLGiomai » martedì 7 febbraio 2012, 13:18

l3on4rdo ha scritto:@ toro2k

In effetti però, invece di fare il ciclo sull'output di find, conviene usare l'opzione -l come hai fatto tu.
Non so se può dare problemi, ma, se non li dà, di sicuro è più veloce fare così:

Codice: Seleziona tutto
grep -liw MATCH2 `grep -liwR MATCH1 dirPath`


edit: pare che non dia problemi e funzioni  (good)


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.
Avatar utente
iononsbaLGiomai
Imperturbabile Insigne
Imperturbabile Insigne
 
Messaggi: 2617
Iscrizione: novembre 2011

Re: cercare più termini con grep

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

E se si usasse awk?

Codice: Seleziona tutto
awk '/parola1/&&/parola2/&&/..../' nomefile
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

Successiva

Torna a Programmazione

Chi c’è in linea

Visualizzano questa pagina: crap0101, SuperStep e 6 ospiti