Grep, ignora gli avvisi


50

Sto cercando di trovare la directory di installazione di un determinato pacchetto. Ho una determinata parola chiave usando la quale sto cercando di trovare un determinato file.

Durante grep, voglio solo includere il tipo di file cpp o h . Non voglio che il grep mostri avvisi come Autorizzazione negata o Impossibile trovare la directory . Voglio solo che mostri i file corrispondenti, nient'altro. Si prega di suggerire come posso fare questo?

Attualmente sto usando

grep "My term" -ir --exclude-dir="\.svn" --include=*.{cpp,h} ./

Risposte:


56

Tali avvisi sono diretti allo stderrstream, al contrario del descrittore di file standard. È possibile silenziare l'output stderr aggiungendo 2>/dev/nullalla fine del comando.


find . 2>/dev/null | grep 404.html
Sii

30

Più direttamente che filtrare gli avvisi è possibile disabilitarli aggiungendo -s:

grep "My term" -sir --exclude-dir="\.svn" --include=*.{cpp,h} ./

Ci sono alcuni problemi di compatibilità con questa opzione. Tuttavia, questo non dovrebbe essere un problema per uso personale.

-s, --no-message: elimina i messaggi di errore relativi a file inesistenti o illeggibili. Nota sulla portabilità: a differenza di GNU grep, 7th Edition Unix grep non era conforme a POSIX, perché mancava -q e la sua opzione -s si comportava come l'opzione -q di GNU grep. Anche grep in stile USG mancava di -q ma la sua opzione -s si comportava come grep GNU. Gli script di shell portatili dovrebbero evitare sia -q che -s e dovrebbero invece reindirizzare l'output standard e di errore su / dev / null. (-s è specificato da POSIX.)


Ho appena installato 13.04 e sto ricevendo gli errori che non ho riscontrato con 12.04. Potrebbe essere che qualcosa sia cambiato? Ho pensato che sarebbe stato bello che grep smettesse di avvertire che i file erano directory poiché nella maggior parte dei casi non me ne importava!
Alexis Wilke,

Siamo spiacenti, sono ancora il 12.10, quindi non posso confermarlo.
Sebastian vom Meer,

5

Ero solito ricevere un sacco di messaggi fastidiosi come questo:

grep: commands: Is a directory
grep: events: Is a directory
grep: views: Is a directory

Il motivo è che il --directoriesflag è predefinito read. L'ho cambiato in recurse; se non si desidera che esegua automaticamente una ricerca ricorsiva, è possibile utilizzare skipinvece.

Il modo più semplice per gestirlo continuamente è impostarlo in una variabile di ambiente. In ~/.bash_profileo in ~/.bashrcbase alla distribuzione:

export GREP_OPTIONS='--directories=recurse'

Ora sopprime automaticamente quei messaggi ogni volta che uso grep.

Un'altra opzione è la --no-messagesbandiera, stenografia -s. Questo eliminerà anche i Is a directorymessaggi, ma sopprime anche altri messaggi che potrebbero essere più utili. Ad esempio, se stai effettuando una ricerca nidificata */*/*e non esiste un file simile di quel modello, non te lo dirà.


buona spiegazione
aldr

1

Un approccio alternativo invece di grepricorsivamente -ir sarebbe quello di consentire al findcomando (che è ricorsivo per impostazione predefinita) di gestire le autorizzazioni con -readableflag e percorso da escludere con -not -path "*.svn*"flag, quindi passare il file a grep. L'esclusione delle directory viene eseguita tramite -type fper trovare solo i file regolari.

$ find . -not -path "*.svn*" -type f -name "*.cpp" -or -name "*.h"  -readable -exec grep "my terms" "{}" \; 

0

Quando si eseguono ricerche ricorsive in file specifici, è molto meglio usare ack-grep. La sintassi qui sarebbe:

ack-grep -i "My term" --cpp --h

Per rimuovere i messaggi di errore di autorizzazione, potresti voler eseguire lo stesso comando con sudo:

ack-grep -i "My term" --cpp --h

Ma alla fine, se vuoi cercare pacchetti installati, guarda queste varie opzioni: https://www.google.com/search?q=ubuntu%20search%20inside%20installed%20packages

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.