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.