Hai lệnh tìm so sánh


12

Gần đây tôi đã nhận được findmột lớp lót này, nhưng tôi không thể giải thích sự khác biệt của hai cái dưới đây đến từ đâu:

ví dụ 1

[root@centos share]# find . -exec grep -i "madis" {} /dev/null \;

./names:Madison Randy:300:Product Development

Ví dụ 2

[root@centos share]# find . -exec grep -i "madis" {} \;

Madison Randy:300:Product Development

Như bạn có thể thấy, trong tập đầu tiên có tệp cụ thể mà chuỗi này xuất phát từ đó và cho đến nay tôi thực sự không thể tìm hiểu tại sao điều này lại xảy ra.

Câu trả lời:


17

Bạn đang nói với grep để tìm kiếm 2 địa điểm. grep chỉ hiển thị toàn bộ vị trí nếu nhiều vị trí được tìm kiếm.

Ví dụ

touch /tmp/herp /tmp/derp
cd /tmp
echo "foo" > herp
echo "foo" > derp

Lưu ý rằng nếu tôi chỉ tìm kiếm 1 tệp, grep bỏ qua tên tệp

grep -i "foo" /tmp/herp
foo

Nhưng nếu tôi chỉ định nhiều vị trí tìm kiếm, grep sẽ nói nơi tìm thấy mỗi trận đấu

grep -i "foo" herp derp
/tmp/derp:foo
/tmp/herp:foo

Thêm vào /dev/nullđó là lừa grep để in ra đường dẫn đầy đủ, bằng cách cung cấp 2 đối số.


1
+1 nhưng bạn đã quên đề cập đến "hiển nhiên": "Lý do tệp được thêm vào /dev/nulllà để đảm bảo rằng bất cứ thứ gì grep-ed sẽ không được tìm thấy trong /dev/nulltệp (trống) , vì vậy chỉ có các vị trí chính xác được xuất ra"
Olivier Dulac

Nhưng ngoài ra, bằng cách tìm kiếm, /dev/nullbạn không lãng phí bất kỳ thời gian nào để tìm kiếm thông qua một tệp giả không trống. Và cuối cùng, ý định tìm kiếm /dev/nulllà hiển nhiên đối với những người quen thuộc với thành ngữ này.
alexis

5

man grep:

-H, - với tên tệp

In tên tập tin cho mỗi trận đấu. Đây là mặc định khi có nhiều hơn một tệp để tìm kiếm.

Các kết quả khác nhau từ grep được gọi với một hoặc hai đối số tệp trong hai trường hợp. Thay vì thêm /dev/nullbạn có thể gọi grepvới đối số -H. Có thể /dev/nullhành vi được hỗ trợ rộng rãi hơn.


3
grep -Hkhông khả dụng - /dev/nullthủ thuật hoạt động mà không có GNU grep.
Chris Xuống

4

Ví dụ đầu tiên tương đương với việc chạy grep trên hai tệp cho mỗi tệp được tìm thấy do kết quả của findbiểu thức. Ví dụ: nếu findtìm thấy ba tệp a.txt, b.txtc.txtsau đó grepsẽ chạy dưới dạng

grep -i "madis" a.txt /dev/null
grep -i "madis" b.txt /dev/null 
grep -i "madis" c.txt /dev/null

Để grephiển thị tên tệp mà đầu ra khớp với. Vì không có gì khớp với / dev / null, nên đảm bảo rằng tên tệp của tệp đầu tiên sẽ được in nếu khớp.

Trong khi đó, ví dụ thứ hai tương đương với

grep -i "madis" a.txt
grep -i "madis" b.txt 
grep -i "madis" c.txt 

Trong trường hợp đó, tên tệp sẽ không được in cho phù hợp vì chỉ có một đối số.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.