อะไรคือเหตุผลที่แน่นอนที่ `grep 'บน / proc และดิสก์ดิบเป็นความคิดที่ไม่ดี?


9

ฉันวิ่งgrep -r "searchphrase" /วันนี้และไม่ได้ผล ฉันทำวิจัยและพบว่าfind / -xdev -type f -print0 | xargs -0 grep -H "searchphrase"เป็นแนวทางที่ถูกต้อง

ฉันรวบรวม/procและดิสก์เช่น/dev/sda1เป็นผู้ร้ายสำหรับ grep ไม่ประสบความสำเร็จ

ฉันจะรักพื้นหลังทางเทคนิคบางอย่างที่ "ทำไม" ฉันคิดว่าลิงก์บางอันภายใน/procสร้างลูปแบบไม่ จำกัด เมื่อสำรวจและฉันอ่านมีเหตุผลมากกว่า แต่ไม่มีอะไรเจาะจง

นอกจากนี้จะเกิดอะไรขึ้นเมื่อดิสก์ดิบมีการจาระบี? ข้อมูลไบนารี (ที่สามารถเข้าถึงได้บน/dev/sda1เท่าที่ฉันรู้หรือไม่) ไม่สามารถตีความได้เช่นเดียวmountกับชนิดของระบบแฟ้มที่ทำให้ข้อมูลจากดิสก์เข้าใจได้หรือไม่ ดังนั้นจึงเป็นไปได้ที่จะ grep สำหรับสตริงไบนารีหรือไม่?

คำตอบ:


11

ใช่คุณสามารถgrep /dev/sda1และ/procแต่คุณอาจไม่ต้องการ รายละเอียดเพิ่มเติม:

  1. ใช่คุณสามารถเรียกใช้ grep /dev/sda1เนื้อหาไบนารีของ แต่ด้วยฮาร์ดดิสก์ขนาดใหญ่ที่ทันสมัยจะใช้เวลานานมากและผลลัพธ์ไม่น่าจะมีประโยชน์

  2. ใช่คุณสามารถ grep เนื้อหาของ/procแต่ระวังว่าหน่วยความจำของคอมพิวเตอร์ของคุณถูกแมปในนั้นเป็นไฟล์ บนคอมพิวเตอร์สมัยใหม่ที่มี RAM ขนาดกิกะไบต์จะใช้เวลานานในการ grep และอีกครั้งผลลัพธ์ไม่น่าจะมีประโยชน์

เป็นข้อยกเว้นถ้าคุณกำลังค้นหาข้อมูลบนฮาร์ดดิสก์ที่มีระบบไฟล์ที่เสียหายคุณอาจเรียกใช้grep something /dev/sda1เป็นส่วนหนึ่งของความพยายามในการกู้คืนข้อมูลของไฟล์

ไฟล์ที่มีปัญหาอื่น ๆ ใน /dev

ฮาร์ดดิสก์และพาร์ติชั่นฮาร์ดดิสก์ที่อยู่ด้านล่าง/devนั้นสามารถทำได้หากมีความอดทนมากพอ อย่างไรก็ตามไฟล์อื่น ๆ (หมวก: user2313067 ) อาจทำให้เกิดปัญหา:

  1. /dev/zeroเป็นไฟล์ที่มีความยาวไม่ จำกัด โชคดีที่grep(อย่างน้อยรุ่น GNU) ฉลาดพอที่จะข้ามได้:

    $ grep something /dev/zero
    grep: input is too large to count
    
  2. /dev/randomและ/dev/urandomยังไม่มีที่สิ้นสุด คำสั่งgrep something /dev/randomจะทำงานตลอดไปจนกว่าgrepจะมีสัญญาณให้หยุด

    มันจะมีประโยชน์ในการ grep /dev/urandomเมื่อสร้างรหัสผ่าน ในการรับตัวอย่างเช่นตัวอักษรและตัวเลขห้าตัว:

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

    สิ่งนี้ไม่สิ้นสุดเนื่องจากหลังจากได้รับอักขระเพียงพอheadปิดไปป์ที่ทำให้ grep สิ้นสุดลง

ลูปไม่มีที่สิ้นสุด

"... ลิงก์ ... สร้างลูปแบบไม่มีที่สิ้นสุดเมื่อสำรวจ ... "

Grep (อย่างน้อยรุ่น GNU) นั้นฉลาดพอที่จะไม่ทำเช่นนั้น ลองพิจารณาสองกรณี:

  1. ด้วย-rตัวเลือก grep จะไม่ติดตามลิงก์สัญลักษณ์ยกเว้นว่าระบุไว้อย่างชัดเจนในบรรทัดคำสั่ง ดังนั้นจึงเป็นไปไม่ได้ที่จะวนซ้ำ

  2. ด้วย-Rตัวเลือก grep จะติดตามลิงก์สัญลักษณ์ แต่จะตรวจสอบและปฏิเสธที่จะติดเป็นวง เพื่อแสดง:

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

ไม่รวมไดเรกทอรีที่มีปัญหาจาก grep -r

โปรดgrepเตรียมสิ่งอำนวยความสะดวกที่ จำกัด เพื่อหยุดการ grep จากการค้นหาไฟล์หรือไดเรกทอรีบางอย่าง ตัวอย่างเช่นคุณสามารถยกเว้นไดเรกทอรีทั้งหมดชื่อproc, sysและdevจากการค้นหา recursive grep กับ:

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

หรืออีกวิธีหนึ่งที่เราสามารถแยกproc, sysและdevใช้ globs ขยายทุบตีของ:

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

ขอบคุณ! นั่นเป็นคำตอบที่ยอดเยี่ยม ถ้าหากไม่มีฮีโร่อีกตัวโผล่ออกมาจากคืนนี้ฉันจะยอมรับพรุ่งนี้! ฉันสงสัยเกี่ยวกับอีกสิ่งหนึ่งและฉันหวังว่ามันจะไม่ไกลเกินไป: หากgrepค้นหาไฟล์/procที่นำไปสู่หน่วยความจำที่ถูกแมปมันอาจเกิดขึ้นที่grepกระทบ EOF ในหน่วยความจำ (สุ่ม) และตีความข้อมูลต่อไปนี้เป็น ชื่อไฟล์ใหม่ที่จะค้นหา? ฉันเริ่มอ่านgrepซอร์สโค้ด แต่ฉันเดาว่าฉันจะไม่เห็นมันมากเกินไป
curious_weather

1
@krork ในระบบปฏิบัติการเก่าบางระบบเช่น CP / M จุดสิ้นสุดของไฟล์ถูกส่งสัญญาณโดยอักขระ EOF เนื่องจากระบบไฟล์ที่ทันสมัยติดตามขนาดของไฟล์อักขระดังกล่าวจึงขาดการใช้งาน
John1024

2
Grepping /devอาจไม่สิ้นสุดเนื่องจาก grep เริ่มสแกน/dev/zeroหรือคล้ายกัน ไม่แน่ใจว่าไฟล์ดังกล่าวอยู่ในหรือ/proc /sys
user2313067

1
@ user2313067 ดีมาก! ในขณะที่ grep GNU จะปฏิเสธที่จะค้นหา/dev/zeroมันจะค้นหา/dev/randomตลอดไปจนกว่าจะหยุด อัปเดตคำตอบแล้ว
John1024

ฉันไม่ได้ทำอะไรมากกับ / proc หรือ / sys แต่เนื่องจากไดเรกทอรีเสมือนซึ่งอาจมีการปรับปรุงได้ตลอดเวลาคุณอาจได้รับผลลัพธ์ที่ไม่คาดคิด / ไม่สามารถทำซ้ำได้จากการทำงานหลายครั้ง แน่นอนว่าสิ่งนี้สามารถเกิดขึ้นได้กับระบบไฟล์ปกติเช่นกัน แต่มันอาจจะแปลกใจมากกว่านี้
โจ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.