Utilizzo di grep con pipe e e commerciale per filtrare gli errori da find


22

Sto usando Cygwin per trovare un file su Cygdrive.

Tuttavia, devo eliminare i messaggi di autorizzazione negata (altrimenti i risultati vengono nascosti nei messaggi di errore). Il seguente comando funziona:

find -name 'myfile.*' |& grep -v "Permission denied"

Non capisco perché la e commerciale debba essere inserita in questo comando, si sarebbe aspettato che funzionasse, ma non funziona.

find -name 'myfile.*' | grep -v "Permission denied"

Spiegare il significato della e commerciale.

Risposte:


24

Nei sistemi simili a Unix, esistono due percorsi di output che, se non modificati, invieranno output sullo schermo. L'errore standard (o stderr) è quello che cattura la maggior parte degli errori e delle condizioni di errore.

Per passare il messaggio di autorizzazione negata nello stderr allo stesso flusso di output di "output normale" è necessario combinare i due. Nel tuo esempio, affinché tu grep -vpossa operare correttamente su di esso, combini stdout (output standard) e stderr con la sintassi arcana che vedi.

Dal manuale GNU Bash sezione 3.2.2 Pipeline :

Se ' |&' è utilizzato, command1 ‘s errore standard, oltre al suo standard output, è collegato al command2 ‘s input standard attraverso il tubo; è una scorciatoia per 2>&1 |. Questo reindirizzamento implicito dell'errore standard sull'output standard viene eseguito dopo qualsiasi reindirizzamento specificato dal comando.

Inoltre, come sottolinea Geirha, se vuoi semplicemente sbarazzarti dell'output stderr, vorresti fare qualcosa di simile

find -name 'myfile.*' 2> /dev/null

o forse

find -name 'myfile.*' 2> /tmp/errorlog

E nota che se hai stringhe di comandi, come findpassare un output a xargste, dovresti mettere l'intera pipeline di comandi tra parentesi per catturare l'output da tutti i componenti del comando. Per esempio,

(find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 )  2> /dev/null

Se hai lasciato fuori le parentesi e hai fatto questo invece -

find | egrep ^[RS].[0-9]+/.svg] | xargs head -1 2> /dev/null

vedresti comunque errori di autorizzazione negati da find o egrep, ma stderr verrebbe reindirizzato per xargs.

Come hai visto, probabilmente eliminerai lo stderr solo dopo averne visto il contenuto durante una prova.

Si noti che con GNU finde, per quanto ne so, qualsiasi opzione compatibile con POSIX find, l' -printopzione è implicita. Se lo desideri, puoi comunque fornirlo esplicitamente.



1
@LukeExton Sì. In altre shell, 2>&1 |può essere usato al posto di |&(cioè, si può reindirizzare esplicitamente stderr a stdout e quindi reindirizzarlo al comando successivo nella pipeline).
Eliah Kagan,

2> >( grep filter )è anche utile
user1133275


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.