grep come sopprimere la visualizzazione di file non corrispondenti?


11

Sto cercando di trovare file contenenti una parola specifica utilizzando grep. Ci sono molti file nella directory (> 500)

Comando corro

$ grep 'delete' *

Produzione

validate_data_stage1:0
validate_data_stage2:0
validate_data_stage3:0
validate_data_stage4:0
validate_data_stage5:0
validate_input_stage1:0
validate_input_stage2:0
validate_input_stage3:0
validate_input_stage4:0
.... and hundred of such lines

Questi sono i file che non contengono la corrispondenza specificata. Voglio sopprimere quelle righe dalla visualizzazione allo stdout. Conosco -qswitch, ma questo sopprimerebbe l'output completo, che non voglio.

Come lo faccio?


2
Normalmente, grepnon stampare i nomi dei file non corrispondenti. In realtà, sembra che grepuna linea con il contenuto 0corrisponda. Puoi pubblicare l'esatto modello di ricerca che stai utilizzando?
— Adrian Heine,

Il cmd grep completo che ho usato era grep 'delete' * -R, ma non credo che -Rstia causando alcun problema. E sì, normalmente non stampa quelli non corrispondenti, ma non sono sicuro di cosa sia il caso qui ...
— mtk

@step @everyone .. Strano ... Dopo aver visto il post modificato sopra. Ho provato grep -- 'delete' *(aggiunto --) e ha funzionato come previsto. La rimozione di --sta portando al display sopra.
— mtk

1
@Stephane In effetti hai ragione. Ho cercato il dir ... e c'era un file con il nome -ci. Grazie per aver risolto il problema. Puoi pubblicare questo scenario come risposta.
— mtk

Risposte:


9

Questo è il comportamento esibito da grep -c.

Probabilmente hai un file il cui nome inizia con -e contiene un ccarattere e stai usando GNU grep senza impostare la POSIXLY_CORRECTvariabile d'ambiente.

Uso:

grep -- delete *

o meglio:

grep delete ./*

--segna la fine delle opzioni in modo tale che quel nome file non venga considerato come un'opzione (con un grex POSIX, non lo sarebbe poiché l' deleteargomento non-opzione avrebbe segnato la fine delle opzioni), ma non affronterebbe il problema di un file chiamato -. Il grep delete ./*è più robusto, ma ha l'inconveniente di emettere il più ./per i file corrispondenti (anche se questo può essere considerato un bonus dal momento che consente di identificare i nomi di file che contengono caratteri di nuova riga).


12

Inserisci

| grep -v ':0$'

Non molto elegante ma penso che farà il lavoro.

L'aggiunta -lal tuo comando ti darà solo corrispondenze ma eliminerà anche la stampa del numero di corrispondenze per ciascun file.


1
-llavorato. anche la soluzione è buona. Grazie
— mtk

4
la linea grep dovrebbe essere in grep -v ':0$'modo tale che siano abbinati solo quelli alla fine di una linea (tuttavia, l' grep -lapproccio è di gran lunga migliore fintanto che non è necessario il conteggio delle linee)
— mreithub

9

Usando grep -lotterrai solo i file che contengono almeno una corrispondenza.

Hai bisogno di informazioni su quante partite ci sono in un file? Perché potresti saltare usando -cquale è usato per contare il numero di corrispondenze in un file.

modifica: E come ha detto lo stregone, usare anche -Iper sopprimere le corrispondenze nei file binari potrebbe essere una buona idea.


0

Come grep conteggi diversi da zero:

grep -rIcH 'string' . | grep -v ':0$'

  • -r Registra le sottodirectory.
  • -IIgnora i file binari (grazie @tongpu , warlock) .
  • -cMostra il conteggio delle partite. Stranamente, include file conteggio 0.
  • -H Mostra il nome del file, anche se solo un file.
  • 'string' la tua stringa va qui.
  • . Inizia dalla directory corrente.
  • | -v ':0$'Rimuovi i file conteggio 0. (grazie @LaurentiuRoescu )

(Mi rendo conto che il PO stava contando involontariamente -c, ma google (conteggio diverso da zero) atterra qui.)


0

Simile alla risposta di Laurentiu, puoi anche utilizzare l'elenco di -lcome input di file per grep:
grep -r "pattern" -c $(grep -rl "pattern")
consente di mantenere la colorazione di grep, ma fa la stessa cosa in background


notare che i nomi di file e le directory che contengono spazi bianchi o caratteri jolly verranno erroneamente divisi e abbinati di conseguenza.
— Jeff Schaller
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.