grep???

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
zosty
Linux 0.x
Linux 0.x
Messaggi: 11
Iscritto il: gio 8 nov 2007, 12:03
Slackware: 64 - current

grep???

Messaggio da zosty »

Devo cercare una stringa all'interno di tutti i files con estensione *.c contenuti in una directory e sottodirectory. Qual e' il comando da usare?
Pensavo che grep -R "stringa" /dir/*c funzionasse....

Grazie!
Z

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Messaggio da anycolouryoulike »

Non so se è il metodo migliore ma funziona di sicuro:

Codice: Seleziona tutto

ls -R <directory>/*.c | xargs grep <stringa>

Avatar utente
albatros
Iper Master
Iper Master
Messaggi: 2098
Iscritto il: sab 4 feb 2006, 13:59
Kernel: 6.18.0
Desktop: gnome and lxqt
Distribuzione: Ubuntu 24.04 & FC 41
Località: Darmstadt - Germania

Messaggio da albatros »

Codice: Seleziona tutto

 find . -depth -name "*.c" -exec grep -H "scanf" {} \;
Questo esempio cerca nella directory corrente e nella sottodirectory i file con estensione .c nei quali cerca la stringa scanf e stampa poi il rigo con tale stringa preceduto dal nome del file (opzione -H).
Ultima modifica di albatros il lun 10 dic 2007, 14:53, modificato 2 volte in totale.

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Re: grep???

Messaggio da Paoletta »

zosty ha scritto:Devo cercare una stringa all'interno di tutti i files con estensione *.c contenuti in una directory e sottodirectory. Qual e' il comando da usare?
Pensavo che grep -R "stringa" /dir/*c funzionasse....

Grazie!
Z

Codice: Seleziona tutto

 find /home/zosty/ltib-imx21ads-20070609/ -iname "*c"
Ultima modifica di Paoletta il lun 10 dic 2007, 14:45, modificato 1 volta in totale.

zosty
Linux 0.x
Linux 0.x
Messaggi: 11
Iscritto il: gio 8 nov 2007, 12:03
Slackware: 64 - current

Messaggio da zosty »

anycolouryoulike ha scritto:Non so se è il metodo migliore ma funziona di sicuro:

Codice: Seleziona tutto

ls -R <directory>/*.c | xargs grep <stringa>
Ho provato....ma il risultato e' stato alquanto sconcertante...

Codice: Seleziona tutto

bash-3.1# ls -R /home/zosty/ltib-imx21ads-20070609/*.c | xargs grep lcd
ls: cannot access /home/zosty/ltib-imx21ads-20070609/*.c: No such file or directory
Garantisco che all'interno della dir ci sono una marea di files con estensione c....
Ed ho eseguito il comando come root :(

Avatar utente
Paoletta
Staff
Staff
Messaggi: 3975
Iscritto il: lun 25 apr 2005, 0:00
Slackware: 14.2 - 64 bit
Desktop: fluxbox
Località: Varese

Messaggio da Paoletta »

guarda sopra

p.s. il motivo per cui grep non fa quel che vuoi è che grep cerca all'interno dei files

zosty
Linux 0.x
Linux 0.x
Messaggi: 11
Iscritto il: gio 8 nov 2007, 12:03
Slackware: 64 - current

Messaggio da zosty »

albatros ha scritto:

Codice: Seleziona tutto

 find . -depth -name "*.c" -exec grep -H "scanf" {} \;
Questo esempio cerca nella directory corrente e nella sottodirectory i file con estensione .c nei quali cerca la stringa scanf e stampa poi il rigo con tale stringa preceduto dal nome del file (opzione -H).
GRAZIE MILLE!!!
Funziona benissimo....come speravo! ;)

Avatar utente
albatros
Iper Master
Iper Master
Messaggi: 2098
Iscritto il: sab 4 feb 2006, 13:59
Kernel: 6.18.0
Desktop: gnome and lxqt
Distribuzione: Ubuntu 24.04 & FC 41
Località: Darmstadt - Germania

Messaggio da albatros »

Prego... ;)

Avevo aggiunto pochi minuti fa al post precedente la spiegazione del perché il tuo tentativo non funzionava, poi ho visto che ci sono stati altri interventi e ho rieditato tagliando e incollando qui di seguito:
Pensavo che grep -R "stringa" /dir/*c funzionasse....
In questo caso bash espande /dir/*c nei file che finiscono per c sotto la directory dir e li passa a grep, praticamente se hai in dir:
uno (file)
due (directory)
tre.c (directory)
quattro.c (file)

è come se avessi dato: grep -R "stringa" tre.c quattro.c , per cui grep cercherà stringa in quattro.c e in *tutti* i files contenuti in tre.c, saltando però la directory due.
Ultima modifica di albatros il lun 10 dic 2007, 15:09, modificato 3 volte in totale.

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Messaggio da anycolouryoulike »

È vero. :oops: Con l'opzione -R non ha senso specificare i file di una directory...
Mi correggo:

Codice: Seleziona tutto

ls -R <directory> | grep .c | xargs grep <stringa>
Certo è molto meglio usare find come ti è stato indicato da gente molto più competente di me!

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Messaggio da Mario Vanoni »

zosty ha scritto:
anycolouryoulike ha scritto:Non so se è il metodo migliore ma funziona di sicuro:

Codice: Seleziona tutto

ls -R <directory>/*.c | xargs grep <stringa>
Ho provato....ma il risultato e' stato alquanto sconcertante...

Codice: Seleziona tutto

bash-3.1# ls -R /home/zosty/ltib-imx21ads-20070609/*.c | xargs grep lcd
ls: cannot access /home/zosty/ltib-imx21ads-20070609/*.c: No such file or directory
Garantisco che all'interno della dir ci sono una marea di files con estensione c....
Ed ho eseguito il comando come root :(
Quale Super-User (root):

cd directory_di_ricerca

find -name '*.c' -print | xargs -n 100 grep -n 'stringa_ricercata' | less

ti da la anche la riga dove si trova stringa_ricercata nel file trovato.

Mario Vanoni

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Messaggio da anycolouryoulike »

anycolouryoulike ha scritto:È vero. :oops: Con l'opzione -R non ha senso specificare i file di una directory...
Mi correggo:

Codice: Seleziona tutto

ls -R <directory> | grep .c | xargs grep <stringa>
Certo è molto meglio usare find come ti è stato indicato da gente molto più competente di me!
Non è vero, manco così funziona perché ls non specifica il percorso completo dei file. :lol:

Avatar utente
albatros
Iper Master
Iper Master
Messaggi: 2098
Iscritto il: sab 4 feb 2006, 13:59
Kernel: 6.18.0
Desktop: gnome and lxqt
Distribuzione: Ubuntu 24.04 & FC 41
Località: Darmstadt - Germania

Messaggio da albatros »

@anycolouryoulike:
Penso sia un discorso di regex...
Ora non ho tempo per pensarci bene (la prima cosa che avevo scritto pochi minuti fa al posto di questa non era corretta), per curiosità ci ripenserò stasera...

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Messaggio da anycolouryoulike »

Ma infatti ls seleziona i file, poi xargs li passa ad uno ad uno a grep... solo che l'output di ls non include il path completo dei file, quindi grep non li trova nel caso i file non siano nella directory corrente!
Insomma, è inutile discutere, la soluzione migliore è la tua, anche se non so nemmeno cosa servano le opzioni -depth e -H :lol:
Sarebbe interessante aprire una sezione del forum sulla Bash...

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Messaggio da anycolouryoulike »

albatros ha scritto:@anycolouryoulike:
Penso sia un discorso di regex...
Ora non ho tempo per pensarci bene (la prima cosa che avevo scritto pochi minuti fa al posto di questa non era corretta), per curiosità ci ripenserò stasera...
Il mio precedente post era riferito alla tua precedente risposta... :lol:

Avatar utente
conraid
Staff
Staff
Messaggi: 13631
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Messaggio da conraid »

anycolouryoulike ha scritto: Insomma, è inutile discutere, la soluzione migliore è la tua, anche se non so nemmeno cosa servano le opzioni -depth e -H :lol:
Sarebbe interessante aprire una sezione del forum sulla Bash...
Non per fare il pignolo, ma find è un comando indipendente dalla Bash.
Per le opzioni man find ;-)

Rispondi