find . -type f -print -exec cat {} \; | grep some string
คำสั่งด้านบนไม่พิมพ์เส้นทางของไฟล์
ฉันกำลังใช้: Ubuntu, bash 4
.
ack
เพื่อ grep ผ่านไฟล์ทั้งหมดภายใต้ไดเรกทอรีปัจจุบันอาจกรองในไฟล์บางประเภทเท่านั้น
find . -type f -print -exec cat {} \; | grep some string
คำสั่งด้านบนไม่พิมพ์เส้นทางของไฟล์
ฉันกำลังใช้: Ubuntu, bash 4
.
ack
เพื่อ grep ผ่านไฟล์ทั้งหมดภายใต้ไดเรกทอรีปัจจุบันอาจกรองในไฟล์บางประเภทเท่านั้น
คำตอบ:
นั่นเป็นเพราะคุณกำลังป้อนgrep
ข้อความที่เพิ่งจะมีชื่อไฟล์ เนื่องจากคุณไม่ได้ระบุชื่อไฟล์เป็นอาร์กิวเมนต์สำหรับ grep จึงไม่สามารถคาดเดาได้ว่าไฟล์ใดที่มาจากบรรทัดที่ตรงกัน การใช้xargs
:
find . -type f -print | xargs grep "some string"
เนื่องจากคุณมี GNU find / xargs นี่เป็นวิธีที่ปลอดภัยกว่าสำหรับ xargs ในการอ่านชื่อไฟล์:
find . -type f -print0 | xargs -0 grep "some string"
หากคุณต้องการชื่อไฟล์ที่มีบรรทัดที่ตรงกันเท่านั้นโดยไม่แสดงบรรทัดที่ตรงกัน:
find . -type f -print0 | xargs -0 grep -l "some string"
sed '...' $(find ... | xargs grep -l ...)
ฉันใช้
grep "some string" . -R
และทำงานได้เร็วขึ้น
PS
กรณีการใช้งานที่ซับซ้อนมากขึ้น
grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex
อ่านคำอธิบายพารามิเตอร์
grep --help | grep -- -i
-n
ถ้าคุณต้องการหมายเลขบรรทัด +1 สำหรับคำตอบที่ง่ายขึ้น
ฉันมักจะค้นหาซอร์สโค้ดในโครงสร้างโฟลเดอร์ที่ซับซ้อนและฉันพบว่ามีประโยชน์โดยใช้:
cd /your/folder/
grep -rHino "your string"
กับพารามิเตอร์เหล่านั้นโดยไม่ต้องใช้หาผมขอรับแฟ้มเส้นทางแบบเต็มและหมายเลขบรรทัดที่มีสตริงที่ระบุ
นอกจากนี้ยังง่ายต่อการจำเพราะมันทุบตีผ่านการค้นหาของคุณเช่นrHino :)
ฉันจะแสดงวิธีการทำงานกับตัวอย่างด่วน
มาแสดงเนื้อหาของไฟล์โดยใช้ cat:
jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
และลองค้นหาไฟล์ทั้งหมดที่มีสตริง "iptables -P" แบบวนซ้ำ:
jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P
ดังที่คุณเห็นในผลลัพธ์เรามีชื่อไฟล์: hit row: สืบค้นสตริง
นี่คือคำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับพารามิเตอร์ที่ใช้:
-rสำหรับแต่ละตัวถูกดำเนินการไดเรกทอรีอ่านและประมวลผลไฟล์ทั้งหมดในไดเรกทอรีนั้นซ้ำ ติดตามลิงก์สัญลักษณ์ในบรรทัดคำสั่ง แต่ข้าม symlink ที่พบซ้ำ โปรดทราบว่าหากไม่มีการให้ไฟล์ถูกดำเนินการ grep จะค้นหาไดเรกทอรีทำงาน นี่เป็นเช่นเดียวกับตัวเลือก '--directories = recurse'
-iพิมพ์ชื่อไฟล์สำหรับการแข่งขันแต่ละครั้ง นี่คือค่าเริ่มต้นเมื่อมีมากกว่าหนึ่งไฟล์ที่จะค้นหา
-nคำนำหน้าแต่ละบรรทัดของเอาต์พุตด้วยหมายเลขบรรทัด 1-based ภายในไฟล์อินพุต (-n ถูกระบุโดย POSIX)
-Hพิมพ์ชื่อไฟล์สำหรับการแข่งขันแต่ละครั้ง นี่คือค่าเริ่มต้นเมื่อมีมากกว่าหนึ่งไฟล์ที่จะค้นหา
-oพิมพ์เฉพาะส่วนที่จับคู่ (ไม่ว่างเปล่า) ของบรรทัดที่ตรงกันโดยแต่ละส่วนดังกล่าวจะอยู่ในบรรทัดเอาต์พุตแยกต่างหาก บรรทัดเอาต์พุตใช้ตัวคั่นเดียวกับอินพุตและตัวคั่นเป็นไบต์ว่างถ้าใช้ -z (--null-data) (ดูตัวเลือกอื่น ๆ )
ฉันชอบ
| ค้นหาไฟล์ | ทำ grep ont หาไฟล์ | แสดงเส้นทางแบบเต็มของไฟล์
ค้นหา / -type f -exec grep 'บางสตริง' {} \; -exec echo {} \;
Silver Searcherเป็นเครื่องมือที่รวดเร็วและสะดวกในการค้นหาไฟล์และเนื้อหา
เพื่อแก้ปัญหาของคุณคำสั่ง silver searcher จะมีลักษณะเช่นนี้ ...
ag 'some string' -l
-l
พิมพ์ชื่อไฟล์ที่มีการจับคู่เท่านั้น (อย่าพิมพ์บรรทัดที่ตรงกัน)
find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string