แสดงชื่อไฟล์และหมายเลขบรรทัดในเอาต์พุต grep


87

ฉันพยายามค้นหาไดเร็กทอรีรางของฉันโดยใช้ grep ฉันกำลังมองหาคำที่ต้องการและต้องการ grep เพื่อพิมพ์ชื่อไฟล์และหมายเลขบรรทัด

มีแฟล็ก grep ที่จะทำเพื่อฉันหรือไม่? ฉันพยายามใช้ชุดค่าผสม-nและ-lแต่สิ่งเหล่านี้เป็นการพิมพ์ชื่อไฟล์โดยไม่มีตัวเลขหรือเพียงแค่ทิ้งข้อความจำนวนมากไปยังเทอร์มินัลซึ่งไม่สามารถอ่านได้ง่าย

เช่น:

  grep -ln "search" *

ฉันต้องต่อท่อเพื่อ awk หรือไม่?


ที่เกี่ยวข้อง: การแสดงชื่อไฟล์ก่อนที่จะจับคู่สาย
codeforester

คำตอบ:


141

ฉันคิดว่า-lมีข้อ จำกัด เกินไปเพราะมันยับยั้งผลลัพธ์ของ-n. ฉันขอแนะนำ-H( --with-filename): พิมพ์ชื่อไฟล์สำหรับการแข่งขันแต่ละครั้ง

grep -Hn "search" *

หากให้ผลลัพธ์มากเกินไปให้ลอง-oพิมพ์เฉพาะส่วนที่ตรงกัน

grep -nHo "search" * 

คำตอบนี้ได้ผลเช่นกันสำหรับฉัน ฉันต้องการค้นหาซ้ำและใช้คำสั่งตัวอย่างนี้: grep -Hnor "localhost" รายการนี้จับคู่ทั้งหมดด้วยชื่อไฟล์และหมายเลขบรรทัดสั้นและกระชับ
Tore Aurstad

นอกจากนี้ยังแสดงผลลัพธ์ไม่ใช่แค่ชื่อไฟล์และหมายเลขบรรทัดเท่านั้น
ผล

30
grep -rin searchstring * | cut -d: -f1-2

ซึ่งจะบอกว่าค้นหาซ้ำ (สำหรับสตริงsearchstringในตัวอย่างนี้) โดยไม่สนใจตัวพิมพ์เล็กและใหญ่และแสดงหมายเลขบรรทัด ผลลัพธ์จาก grep นั้นจะมีลักษณะดังนี้:

/path/to/result/file.name:100: Line in file where 'searchstring' is found.

จากนั้นเราไปป์ผลลัพธ์นั้นไปยังคำสั่ง cut โดยใช้โคลอน:เป็นตัวคั่นฟิลด์ของเราและแสดงฟิลด์ 1 ถึง 2

เมื่อฉันไม่ต้องการหมายเลขบรรทัดที่ฉันมักจะใช้-f1(แค่ชื่อไฟล์และเส้นทาง) จากนั้นไพพ์เอาต์พุตไปuniqเพื่อที่ฉันจะเห็นชื่อไฟล์แต่ละไฟล์เพียงครั้งเดียว:

grep -ir searchstring * | cut -d: -f1 | uniq

1
ฉันรู้สึกว่านี่ตอบคำถามเดิมได้ดีที่สุด ชื่อไฟล์และหมายเลขบรรทัดเท่านั้น
mastaBlasta

1
โปรดทราบว่าวิธีนี้ใช้ไม่ได้หากคุณมีชื่อพา ธ สัมบูรณ์ของ Windows เช่น "C: \ Users \ me \ git` เนื่องจากมีเครื่องหมายจุดคู่อยู่แล้ว
hirse

19

ฉันชอบใช้:

grep -niro 'searchstring' <path>

แต่นั่นเป็นเพียงเพราะฉันลืมวิธีอื่น ๆ อยู่เสมอและฉันไม่สามารถลืมRobert de grep -niro ได้ด้วยเหตุผลบางประการ :)


ไม่เคยคิดว่าจะได้รับคะแนนโหวตจากข้างต้น เพียงแค่แบ่งปันความสนุกสนาน ขอบคุณ! (แต่ใช้งานได้จริง - อย่างน้อยก็ใน MacOS)
Bas van Ommen

รักวิธีการจดจำสิ่งนี้!
Greg Hilston

1

ความคิดเห็นจาก @ToreAurstad สามารถสะกดgrep -Horn 'search' ./ได้ซึ่งง่ายต่อการจดจำ

grep -HEroine 'search' ./ ยังสามารถทำงานได้;)

สำหรับคนที่อยากรู้อยากเห็น:

$ grep --help | grep -Ee '-[HEroine],'
  -E, --extended-regexp     PATTERNS are extended regular expressions
  -e, --regexp=PATTERNS     use PATTERNS for matching
  -i, --ignore-case         ignore case distinctions
  -n, --line-number         print line number with output lines
  -H, --with-filename       print file name with output lines
  -o, --only-matching       show only nonempty parts of lines that match
  -r, --recursive           like --directories=recurse

0

นี่คือวิธีที่ฉันใช้คำตอบที่ได้รับการโหวตเพื่อค้นหาต้นไม้เพื่อค้นหาไฟล์ Fortran ที่มีสตริง:

find . -name "*.f" -exec grep -nHo the_string {} \;

หากไม่มี nHo คุณจะได้เรียนรู้เฉพาะไฟล์บางไฟล์ที่ตรงกับสตริง

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