Những lý do chính xác `grep` trên / Proc và đĩa thô là một ý tưởng tồi?


9

Tôi đã chạy grep -r "searchphrase" /ngày hôm nay và điều đó đã không làm việc. Tôi đã làm một số nghiên cứu và thấy find / -xdev -type f -print0 | xargs -0 grep -H "searchphrase"là cách tiếp cận đúng.

Tôi thu thập /procvà đĩa như /dev/sda1là thủ phạm cho một grep không thành công.

Tôi rất thích một số nền tảng kỹ thuật sâu sắc về "tại sao". Tôi nghĩ rằng một số liên kết bên trong /proctạo ra các vòng lặp vô hạn khi đi qua và tôi đọc có nhiều lý do hơn, nhưng không có gì cụ thể.

Ngoài ra, điều gì xảy ra khi một đĩa thô được grepping? Dữ liệu nhị phân (có thể truy cập được /dev/sda1, theo như tôi biết không?) Có thể không được hiểu, vì chỉ mountvới một kiểu hệ thống tập tin làm cho dữ liệu từ đĩa trở nên dễ hiểu? Do đó, nó vẫn có thể grep cho một chuỗi nhị phân?

Câu trả lời:


11

Có, bạn có thể grep /dev/sda1/proccó lẽ bạn không muốn. Chi tiết hơn:

  1. Có, bạn có thể chạy grep nội dung nhị phân của /dev/sda1. Nhưng, với các đĩa cứng lớn hiện đại, việc này sẽ mất một thời gian rất dài và kết quả có thể không hữu ích.

  2. Có, bạn có thể grep nội dung của /procnhưng lưu ý rằng bộ nhớ máy tính của bạn được ánh xạ trong đó dưới dạng tệp. Trên một máy tính hiện đại có RAM gigabyte, điều này sẽ mất nhiều thời gian để grep và, một lần nữa, kết quả có thể không hữu ích.

Như một ngoại lệ, nếu bạn đang tìm kiếm dữ liệu trên đĩa cứng có hệ thống tệp bị hỏng, bạn có thể chạy grep something /dev/sda1như một phần của nỗ lực khôi phục dữ liệu của tệp.

Các tập tin có vấn đề khác trong /dev

Các đĩa cứng và phân vùng đĩa cứng bên dưới /devcó thể, nếu một người có đủ kiên nhẫn, được đưa vào. Tuy nhiên, các tệp khác (mẹo mũ: user2313067 ) có thể gây ra sự cố:

  1. /dev/zerolà một tập tin có độ dài vô hạn. May mắn thay, grep(ít nhất là phiên bản GNU) đủ thông minh để bỏ qua nó:

    $ grep something /dev/zero
    grep: input is too large to count
    
  2. /dev/random/dev/urandomcũng là vô hạn. Lệnh grep something /dev/randomsẽ chạy mãi mãi trừ khi grepđược báo hiệu dừng lại.

    Nó có thể hữu ích để grep /dev/urandomkhi tạo mật khẩu. Ví dụ, để lấy năm ký tự chữ và số ngẫu nhiên:

    $ grep --text -o '[[:alnum:]]' /dev/urandom | head -c 10
    G
    4
    n
    X
    2
    

    Điều này không phải là vô hạn bởi vì, sau khi nó đã nhận đủ ký tự, headđóng đường ống khiến grep chấm dứt.

Vòng lặp vô hạn

"... liên kết ... tạo các vòng lặp vô hạn khi đi qua ..."

Grep (ít nhất là phiên bản GNU) đủ thông minh để không làm điều đó. Hãy xem xét hai trường hợp:

  1. Với -rtùy chọn, grep không tuân theo các liên kết tượng trưng trừ khi chúng được chỉ định rõ ràng trên dòng lệnh. Do đó, các vòng lặp vô hạn là không thể.

  2. Với -Rtùy chọn, grep thực hiện theo các liên kết tượng trưng nhưng nó kiểm tra chúng và từ chối bị cuốn vào một vòng lặp. Để minh họa:

    $ mkdir a
    $ ln -s ../ a/b
    $ grep -R something .
    grep: warning: ./a/b: recursive directory loop
    

Không bao gồm các thư mục có vấn đề từ grep -r

Bên cạnh đó, grepcung cấp một cơ sở hạn chế để ngăn grep tìm kiếm các tệp hoặc thư mục nhất định. Ví dụ, bạn có thể loại trừ tất cả các thư mục được đặt tên proc, sysdevtừ tìm kiếm đệ quy grep với:

grep --exclude-dir proc --exclude-dir sys --exclude-dir dev -r something /

Ngoài ra, chúng ta có thể loại trừ proc, sysdevsử dụng những đống mở rộng của bash:

shopt -s extglob
grep -r something /!(proc|sys|dev)

Cảm ơn! Đó là một câu trả lời tuyệt vời. Trừ khi một anh hùng khác xuất hiện trong bóng tối tối nay tôi sẽ chấp nhận nó vào ngày mai! Tôi đang tự hỏi về một điều nữa và tôi hy vọng nó không quá xa: Nếu greptìm kiếm một tệp trong /procđó dẫn đến bộ nhớ được ánh xạ, có thể xảy ra việc grepchạm vào EOF bên trong bộ nhớ (ngẫu nhiên) và diễn giải dữ liệu sau dưới dạng Tên tệp mới để tìm kiếm? Tôi đã bắt đầu đọc grepmã nguồn, nhưng tôi đoán tôi sẽ không thấy quá nhiều trong đó.
tò mò_weather

1
@krork Trong một số hệ điều hành cũ, như CP / M, phần cuối của tệp được báo hiệu bằng ký tự EOF. Bởi vì các hệ thống tệp hiện đại theo dõi kích thước của tệp, các ký tự như vậy đã không sử dụng.
John1024

2
Grepping /devcó thể không bao giờ kết thúc khi grep bắt đầu quét /dev/zerohoặc tương tự. Không chắc chắn nếu các tập tin như vậy tồn tại trong /prochoặc /sys.
dùng2313067

1
@ user2313067 Điểm tốt! Trong khi GNU grep sẽ từ chối tìm kiếm /dev/zero, nó sẽ tìm kiếm /dev/randommãi mãi trừ khi dừng lại. Trả lời cập nhật.
John1024

Tôi không làm gì nhiều với / Proc hoặc / sys, nhưng vì đây là những thư mục ảo có thể được cập nhật bất cứ lúc nào, bạn có thể nhận được kết quả bất ngờ / không thể lặp lại từ nhiều lần chạy. Tất nhiên, điều này cũng có thể xảy ra với các hệ thống tệp thông thường, nhưng nó có thể gây ngạc nhiên hơn một chút ở đây.
Joe
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.