รับหมายเลขบรรทัดขณะใช้ grep


360

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

เช่นในปัจจุบันสิ่งที่ผมได้รับคือ/var/www/file.php: $options = "this.target"แต่สิ่งที่ฉันพยายามที่จะได้รับเป็น/var/www/file.php: 1142 $options = "this.target";อย่างดีที่1142จะเป็นจำนวนบรรทัดที่มีสตริงที่

ไวยากรณ์ที่ฉันใช้เพื่อ grep ซ้ำคือ sudo grep -r 'pattern' '/var/www/file.php'

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


แฟล็ก -v จะแสดงบรรทัดที่ไม่ตรงกัน (grep -v myText MyFile.txt)
bcarroll

คำตอบ:


546
grep -n SEARCHTERM file1 file2 ...

ฉันมีคำถามสั้น ๆ อีกข้อหนึ่งเราจะได้ผลลัพธ์ที่ไม่เท่ากับรูปแบบได้อย่างไร ชอบไฟล์ทั้งหมด แต่ไม่ใช่ไฟล์ที่มีสตริงที่แน่นอนใช่ไหม
สายไหม

5
นั่นคือสวิตช์บรรทัดคำสั่ง -v หากคุณเรียกใช้ 'grep --help' มันจะแสดงตัวเลือกทั้งหมด
Miro A.

56
คุณไม่จำเป็น-rถ้าคุณระบุหลายไฟล์ คุณต้องการเฉพาะ-rเมื่อคุณระบุไดเรกทอรี
Sparhawk

@JeanPaul - ฉันเห็นผลลัพธ์เดียวกันทั้ง -nr และ -n -r คุณใช้ grep รุ่นใดอยู่ $ grep -n -r name * | wc -l 1984 $ grep -nr name * | wc -l 1984 $ grep -V grep (grep BSD) 2.5.1-FreeBSD
Miro A.

รหัสคำตอบเท่านั้นไม่มีคำอธิบาย : S
Florian Castelain

148

พิมพ์หมายเลขบรรทัดด้วยgrep -n:

grep -n pattern file.txt

เพื่อรับเฉพาะหมายเลขบรรทัด (ไม่มีบรรทัดที่ตรงกัน) หนึ่งอาจใช้cut:

grep -n pattern file.txt | cut -d : -f 1

เส้นที่ไม่มีลวดลายพิมพ์ด้วยgrep -v:

grep -v pattern file.txt

3
และจำนวนการจับคู่สายล่าสุด: grep -n pattern file.txt | cut -d : -f 1 | tail -1(คุณสามารถบันทึกนี้ให้กับตัวแปรและใช้มันเพื่อไฟล์หางเช่นจากมัน)
Nux

และเพื่อลบหมายเลข / โคลอนที่จุดเริ่มต้นของแต่ละสายคุณสามารถใช้สิ่งที่ชอบ:grep -n pattern file.txt | sed 's/^[0-9][0-9]*://'
5192

24

ถ้าคุณต้องการเพียงหมายเลขบรรทัดทำสิ่งนี้:

grep -nr Pattern file.ext | gawk '{print $1}' FS=":"

ตัวอย่าง:

$ grep -nr 9780545460262 EXT20130410.txt | gawk '{print $1}' FS=":" 
48793
52285
54023

1
awk -F: '{print $1}'ยังใช้งานได้และคุณไม่จำเป็นต้อง-rในgrepเมื่อใช้กับไฟล์ (ไดเรกทอรีเพียงสามารถค้นหาซ้ำ)
สจ๊วร์ Cardall

7
grep -A20 -B20 pattern file.txt

รูปแบบการค้นหาและแสดง 20 บรรทัดหลังและก่อนรูปแบบ


11
นี่ไม่ใช่สิ่งที่ถูกขอมา
Jonathon Reinhart

3
นอกจากนี้ยัง-C20เป็นรุ่นที่สั้นกว่าหากนั่นคือสิ่งที่ต้องการ
Marty Neal


0

ในการแสดงผลลัพธ์ด้วยหมายเลขบรรทัดคุณอาจลองทำสิ่งนี้

grep -nr "word to search for" /path/to/file/file 

ผลลัพธ์ควรเป็นดังนี้:

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