2012-10-05 35 views
5

Tôi cần trợ giúp với Unix. Tôi đang cố gắng xem liệu một trong hai câu lệnh (printf và fprintf) có nằm trong một tệp hay không. Tôi đã sử dụng lệnh:Grep OR Operator Not Working

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

Vì lý do nào đó, nó không tìm thấy trong tệp mà một trong hai tệp đó tồn tại. Tại sao?

+0

Tại sao bạn không thả các regexp cờ chữ, '-w'? – Steve

+2

[UUOC] (http://catb.org/jargon/html/U/UUOC.html) - Xin lưu ý rằng bạn nên sử dụng tệp 'search = $ (grep -w -E -e" f? Printf "$) 'hoặc một cái gì đó tương tự hơn là lãng phí thời gian với' cat' và một đường ống. –

Trả lời

7

Bạn có hai vấn đề.

Đầu tiên, standard grep không hỗ trợ toán tử |. Bạn cần sử dụng egrep hoặc cờ -E.

Thứ hai, bên trong dấu ngoặc kép, \| có nghĩa là \|. Dấu gạch chéo ngược được chuyển đến lệnh grep, vì vậy ngay cả khi grep hiểu toán tử |, dấu gạch chéo ngược sẽ biến thành ký tự thông thường.

Hãy thử điều này:

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

Hoặc bạn có thể cung cấp cho mỗi lựa chọn như một đối số riêng biệt để grep:

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

GNU grep hỗ trợ nó tốt. – paxdiablo

+0

Cảm ơn! Tôi vẫn còn thực sự mới với Unix. –

+0

Nếu anh ta đang sử dụng GNU grep, lệnh của anh ta sẽ khớp với nhau. Chuẩn 'grep' không xử lý' \ | 'cách' egrep' xử lý '|'. –

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

Làm việc tốt trong vỏ của tôi. Tuy nhiên, dưới đây là một số lựa chọn thay thế:

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