ค้นหาไฟล์ที่มีข้อความที่กำหนด


153

ใน bash ฉันต้องการส่งคืนชื่อไฟล์ (และพา ธ ไปยังไฟล์) สำหรับไฟล์ทุกประเภท.php|.html|.jsที่มีสตริงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่"document.cookie" | "setcookie"

ฉันจะทำอย่างไร


4
คุณเคยลองใช้ grep ไหม? cyberciti.biz/faq/grep-in-bash
Terrance

ชื่อนี้ทำให้เข้าใจผิดค่อนข้าง "ค้นหาไฟล์ที่มีข้อความที่กำหนด"
Josh C

คำตอบ:


212
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .

การrตั้งค่าสถานะหมายถึงการค้นหาซ้ำ (ไดเรกทอรีย่อยการค้นหา) iธงหมายถึงกรณีตาย

หากคุณต้องการให้ชื่อไฟล์เพิ่มแฟlล็ก (ตัวพิมพ์เล็กL):

egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .

ที่ดูเหมือนจะไม่ทำงานสำหรับฉัน (อย่างน้อยไม่ได้อยู่บน mac) .... เพียงแค่แขวน ... egrep -lir --include = * "repo" egrep: คำเตือน: การค้นหาซ้ำของ stdin
Dean Hiller

13
คุณลืมเพิ่มเส้นทางเพื่อค้นหา เส้นทางคือ '.' ในตัวอย่างด้านบน ในกรณีของคุณสคริปต์กำลังรออินพุตเพื่อค้นหาบน stdin ลอง: egrep -lir --include = * "repo" / (หรือเส้นทางอื่น ๆ )
LodeRunner

1
grep -E ... >egrep ...
Aman

ฉันพบข้อผิดพลาดgrep: (error|fail): No such file or directoryบน Ubuntu Desktop 16; คำใบ้ใด ๆ
Nam G VU

สำหรับฉันที่จะทำให้การทำงานนี้ฉันต้องข้าม * กับ \ ดังนั้นฉันจึงมี--include=\*.{php,html,js}
Mehrad Mahmoudian

53

ลองสิ่งที่ชอบ grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

-iทำให้กรณี insensitlve

.ที่หมายถึงการสิ้นสุดที่คุณต้องการที่จะเริ่มต้นจากไดเรกทอรีปัจจุบันของคุณนี้อาจจะแทนที่ด้วยไดเรกทอรีใด ๆ

-rวิธีการทำเช่นนี้ซ้ำขวาลงต้นไม้ไดเรกทอรี

-nพิมพ์หมายเลขบรรทัดสำหรับการแข่งขัน

--includeช่วยให้คุณเพิ่มชื่อไฟล์นามสกุล ยอมรับสัญลักษณ์แทน

สำหรับข้อมูลเพิ่มเติมดู: http://www.gnu.org/software/grep/


4
หรืออาจใช้-lตัวเลือก (เพียงพิมพ์ชื่อไฟล์ที่ตรงกัน) แทน-n
เกล็นแจ็

15

findพวกเขาและgrepสำหรับสตริง:

นี้จะได้พบกับไฟล์ทั้งหมด 3 ประเภทใน / เริ่มต้น / เส้นทางและ grep '(document\.cookie|setcookie)'สำหรับการแสดงออกปกติ แยก 2 บรรทัดด้วยแบ็กสแลชเพื่อความสะดวกในการอ่าน ...

find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
 xargs egrep -i '(document\.cookie|setcookie)'

1
เช่นเดียวกับการใช้งานทั่วไปของการค้นหา แต่เพื่อความคิดของฉันดีกว่าที่จะใช้-exec grep -l 'sth' {} \;
NGix

ขอบคุณ @Michael Berkowski วิธีนี้เร็วที่สุดมากกว่า 5 หรือ 8 เท่า# egrep -ir --include=file.foo "(foo|bar)" /dirในไดเรกทอรี weigth ~ 500Gb
Qh0stM4N

9

เสียงเหมือนงานที่สมบูรณ์แบบสำหรับgrepหรือบางทีอาจจะแอ๊กชั่น

หรือการก่อสร้างที่ยอดเยี่ยมนี้:

find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;

+1 การใช้-exec grep...ดีกว่าxargsวิธีการของฉันเพราะจะไม่ทำให้หายใจไม่ออกในช่องว่างในชื่อไฟล์
Michael Berkowski

@MichaelBerkowski: find . -type f -print0 | xargs -0 -I {} grep "search_string" {}คุณสามารถใช้มันเช่นนี้จะจัดการกับช่องว่างในชื่อไฟล์: แน่นอนตัวเลือกอื่น ๆ สามารถเพิ่มได้เช่นกัน
Pascal


3

เพียงเพื่อรวมอีกหนึ่งทางเลือกคุณสามารถใช้สิ่งนี้:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;

ที่ไหน:

  • -regextype posix-extendedบอกfindชนิดของ regex ที่คาดหวัง
  • -regex "^.*\.(php|html|js)$"บอกว่าfindชื่อไฟล์ของ regex ต้องตรงกัน
  • -exec grep -EH '(document\.cookie|setcookie)' {} \;บอกfindให้รันคำสั่ง (พร้อมตัวเลือกและอาร์กิวเมนต์) ที่ระบุระหว่าง-execตัวเลือกและ\;สำหรับแต่ละไฟล์ที่ค้นหาโดยที่{}แสดงถึงตำแหน่งของพา ธ ไฟล์ในคำสั่งนี้

    ในขณะที่

    • Eตัวเลือกบอกgrepให้ใช้ Extended Regex (เพื่อสนับสนุนวงเล็บ) และ ...
    • Hตัวเลือกบอกgrepให้พิมพ์เส้นทางไฟล์ก่อนการแข่งขัน

และด้วยเหตุนี้หากคุณต้องการเส้นทางของไฟล์คุณสามารถใช้:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u

ที่ไหน

  • |[ท่อ] ส่งผลลัพธ์ของfindคำสั่งต่อไปหลังจากนี้ (ซึ่งเป็นsedแล้วsort)
  • rตัวเลือกบอกsedให้ใช้เสริม regex
  • s/HI/BYE/บอกsedให้แทนที่ทุกการเกิดขึ้นครั้งแรก (ต่อบรรทัด) ของ "HI" ด้วย "BYE" และ ...
  • s/(^.*):.*$/\1/บอกให้แทนที่ regex (^.*):.*$(หมายถึงกลุ่ม [สิ่งที่ล้อมรอบด้วย()] รวมถึงทุกอย่าง [ .*= หนึ่งตัวอักษรหรือมากกว่า] จากจุดเริ่มต้นของบรรทัด [ ^] จนถึง 'แรก': 'ตามด้วยอะไรจนถึง' จุดสิ้นสุดของ บรรทัด [ $]) โดยกลุ่มแรก[ \1] ของ regex ที่แทนที่
  • uบอก sort เพื่อลบรายการที่ซ้ำกัน (ใช้sort -uเป็นทางเลือก)

... ไกลจากการเป็นวิธีที่สง่างามที่สุด ดังที่ฉันพูดความตั้งใจของฉันคือการเพิ่มช่วงของความเป็นไปได้ (และเพื่อให้คำอธิบายที่สมบูรณ์ยิ่งขึ้นเกี่ยวกับเครื่องมือบางอย่างที่คุณสามารถใช้ได้)

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