grep - elenca il nome del file in cui viene trovata la corrispondenza


31

Ho un sacco di file .html in una directory. Voglio esaminare ogni file e abbinare un modello (MD5). Tutto ciò è abbastanza facile. Il problema è che devo sapere in quale file è stata trovata la corrispondenza.

cat *.html | grep 75447A831E943724DD2DE9959E72EE31

Restituisce solo il contenuto della pagina HTML dove si trova la corrispondenza, ma non mi dice il file in cui è stata trovata. Come posso ottenere grep per mostrarmi il nome del file in cui si trova la mia corrispondenza?


Il suggerimento fornito non funziona davvero .... Tutto quello che ottengo è cat '. Input standard' * .html | grep -i -H 1ee024007823cc0bfbefba98ba1e1f4c (input standard): <html> <head> <title>
BeMy Friend

4
ti manca il punto. Non è necessario utilizzare cat. Il gatto impedisce a grep di distinguere i singoli file.
Muru,

Potrebbe esserti utile questo post Stack Overflow .
Pablo A

Risposte:


32
grep -H 75447A831E943724DD2DE9959E72EE31 *.html

-H, --with-filename
              Print the file name for each match. This is
              the default when there is more than one file
              to search.

3
Come si dice, questo è il valore predefinito per più file, quindi fino a quando c'è più di un file html, -Hnon è necessario.
Muru,

1
Mi dispiace che la mia domanda sia stata offensiva. Avrei dovuto dire che ci stavo lavorando da un po 'e ho usato una serie di switch E ho letto la pagina MAN dove dice che elenca il nome del file per impostazione predefinita .... Ma quello che ottengo è (input standard ) dove dovrebbe elencare il nome file.
BeMy Friend,

e questo è solo se do l'interruttore -H. Se faccio solo ciò che ho elencato nell'OP, allora non fornisce alcun nome file.
BeMy Friend,

3
@BeMyFriend, il problema è cat. catsignifica concatenare. Se concatenate tutti i file insieme prima di passarli a grep, grepvedete solo un grande file di input standard e non potete (a parte fare divinazioni) restituirvi qualsiasi informazione sui singoli file. Vedere?. Ciro, che ne dici di spiegarlo nella risposta?
Rmano,

OK, il problema è il comando cat, ma quale può essere una soluzione?
Josef Klimuk,

21

Lo uso sempre per cercare file contenenti una stringa, RICURSIVAMENTE in una directory (ciò significa che attraversa qualsiasi sottocartella secondaria) grep -Ril "yoursearchtermhere"

  • R è cercare ricorsivamente (seguendo i symlink)
  • i è di non distinguere tra maiuscole e minuscole
  • l è solo per elencare il nome dei file.

quindi rispondere alla tua domanda grep -l '75447A831E943724DD2DE9959E72EE31' *.htmlfarà ma puoi semplicemente grep -Ril '75447A831E943724DD2DE9959E72EE31'cercare quella stringa, senza distinzione tra maiuscole e minuscole, in qualsiasi file in qualsiasi sottocartella


macOS richiede sempre un file def, sia esso un jolly. Altrimenti, presuppone input da stdin( grep: warning: ricerca ricorsiva di stdin , qualunque input ricorsivo di stdin significherebbe :-). In altre parole:grep -Ril 'texttofind' *
Ville,

grep -RiH 'pattern'mostra il nome del file e la riga corrispondente
Ikrom,

7

Puoi provare questo

grep -rl '75447A831E943724DD2DE9959E72EE31' * > found.txt

2
grep -r -H 75447A831E943724DD2DE9959E72EE31 *.html | awk -F : ' { print $1 } '

In alternativa a

grep -r -l 75447A831E943724DD2DE9959E72EE31 *.html

Fare quanto sopra cercherà ricorsivamente nella cartella e nelle sottocartelle e stamperà il percorso del file ...


grep -r -l è l'unica cosa che ha funzionato per me.
Josef Klimuk,

0

La risposta pubblicata da Cyrus è assolutamente corretta ed è The Right Way TM per farlo grepse dobbiamo solo trovare i file . Quando i nomi dei file necessitano di ulteriori analisi o operazioni sui nomi dei file corrispondenti, possiamo ricorrere all'uso di whileloop con ifistruzione. Ecco un esempio in cui l'elenco di nomi di file proviene da una struttura find+ molto usata whileper l'analisi sicura dei nomi di file.

find -type f -name "*.html" -print0 | while IFS= read -r -d '' filename
do
    if grep -q 'PATTERN' "$filename"
    then
        printf "%s found in %s\n" 'PATTERN' "$filename"
        # Here we can insert another command or function
        # to perform other operations on the filename
    fi
done

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.