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.