2012-10-05 14 views
5

Ho bisogno di aiuto con Unix. Sto cercando di vedere se una delle due istruzioni (printf e fprintf) sono in un file. Ho usato il comando:Grep OPPURE Operatore non funzionante

search=`cat $file | grep -w "fprintf\|printf"` 

Per qualche ragione, non trova né in file in cui esiste uno di quei due. Perché?

+0

Perché non si lascia cadere la bandiera regexp parola, '-w'? – Steve

+2

[UUOC] (http://catb.org/jargon/html/U/UUOC.html) - Si noti che si dovrebbe usare 'search = $ (grep -w -E -e" f? Printf "$ file) 'o qualcosa di simile piuttosto che perdere tempo con' cat' e pipe. –

risposta

7

Hai due problemi.

In primo luogo, standard grep non supporta l'operatore |. È necessario utilizzare egrep o il flag -E.

In secondo luogo, tra virgolette doppie, \| significa \|. Il backslash viene passato al comando grep, quindi anche se grep ha compreso l'operatore |, il backslash lo trasformerebbe in un carattere normale.

Prova questo:

search=`cat $file | egrep -w "fprintf|printf"` 

Oppure si può fornire ogni alternativa come argomento separato per grep:

search=`cat $file | grep -w -e fprintf -e printf 
+2

GNU grep lo supporta perfettamente. – paxdiablo

+0

Grazie! Sono ancora veramente nuovo per Unix. –

+0

Se stesse usando GNU grep, il suo comando sarebbe stato abbinato. Lo standard 'grep' non considera' \ | 'il modo in cui' egrep' tratta '|'. –

0
grep -w "fprintf\|printf" $file 

Questo funziona bene nella mia shell. Ancora, ecco alcune alternative:

egrep -w 'fprintf|printf' $file 
grep -wE 'fprintf|printf' $file 
grep -we 'fprintf\|printf' $file