ใช้ grep เพื่อรายงานกลับเฉพาะหมายเลขบรรทัด


106

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

อย่างไรก็ตามดูเหมือนจะไม่มีวิธีการพิมพ์หมายเลขบรรทัด ( grep -n) และไม่ใช่วิธีที่ตรงกันหรือบรรทัด

ฉันสามารถใช้ regex อื่นเพื่อแยกหมายเลขบรรทัด แต่ฉันต้องการให้แน่ใจว่า grep ไม่สามารถทำได้ด้วยตัวเอง grep -noฉันคิดว่าใกล้เคียงที่สุด แต่ยังคงแสดงการแข่งขัน


1
คำตอบที่มีประโยชน์ที่สุดสำหรับฉันคือคำถาม: grep -no! นี่คือสิ่งที่ฉันมาที่นี่เพื่อลองทำ! (เช่นไม่พิมพ์บรรทัดซึ่งบางครั้งก็ยาวมากเช่นไฟล์ต้นฉบับ javascript ที่
ย่อขนาด

คำตอบ:


156

ลอง:

grep -n "text to find" file.ext | cut -f1 -d:

1
ในเครื่องของฉันนี่เป็นการพิมพ์เฉพาะไฟล์ที่ตรงกันโดยไม่มีหมายเลขบรรทัด (ดังนั้นหากฉันมี 3 รายการที่ตรงกันในไฟล์มันจะถูกพิมพ์เพียงครั้งเดียว) ซึ่งยังมีประโยชน์มาก ...
Mario Awad

3
@MarioAwad คุณควรจัดการ-fพารามิเตอร์ -f2สำหรับฉันมันเป็น (รู้ว่านี่เป็นของเก่า แต่ฉันคิดว่ามันสามารถช่วยวิญญาณที่น่าสงสารได้)
Emil Sierżęga

ขอบคุณสำหรับการเขียนสคริปต์เชลล์ adhoc unix เก่าที่น่ารัก สิ่งนี้แสดงให้เห็นว่าเครื่องมือที่ยืดหยุ่นนั้นคุ้มค่ากับความซับซ้อนและช่วงการเรียนรู้!
Alex

12
grep -n "text to find" file.ext | cut -f1,2 -d:แสดงชื่อไฟล์และหมายเลขบรรทัด
Jondlm

2
@jondim จะแสดงชื่อไฟล์ก็ต่อเมื่อมีการค้นหามากกว่าหนึ่งไฟล์ คุณต้องเพิ่ม-Hเพื่อบังคับให้แสดงชื่อไฟล์เมื่อมีเพียงไฟล์เดียว ในทางกลับกันคุณสามารถใช้-hเพื่อบอกไม่ให้ส่งออกชื่อไฟล์ได้เสมอไม่ว่าคุณจะ grepping กี่ไฟล์ก็ตาม
Mark Reed

46

หากคุณเปิดให้ใช้ AWK:

awk '/textstring/ {print FNR}' textfile

ในกรณีนี้ FNR คือหมายเลขบรรทัด AWK เป็นเครื่องมือที่ยอดเยี่ยมเมื่อคุณมองไปที่ grep | cut หรือเมื่อใดก็ตามที่คุณต้องการรับเอาต์พุต grep และจัดการกับมัน


2
ใช้กระบวนการเดียว (ซึ่งสำคัญกว่าในอดีต แต่ก็ยัง) และเข้าใจง่ายสำหรับผู้เริ่มต้น awk!
bgStack15

NRทำงานได้ดีเมื่อมีการตรวจสอบไฟล์เพียงไฟล์เดียวเช่นในกรณีนี้
Mark Reed

ยอดเยี่ยมเพียง! เร็วมาก!
GTodorov

34

คำตอบทั้งหมดนี้ต้องใช้ grep เพื่อสร้างบรรทัดที่ตรงกันทั้งหมดจากนั้นจึงไพพ์ไปยังโปรแกรมอื่น หากบรรทัดของคุณยาวมากการใช้เพียง sed เพื่อแสดงหมายเลขบรรทัดอาจมีประสิทธิภาพมากกว่า:

sed -n '/pattern/=' filename


1

ฉันขอแนะนำคำตอบที่มีsedและawkเพียงแค่รับหมายเลขบรรทัดแทนที่จะใช้grepเพื่อรับบรรทัดที่ตรงกันทั้งหมดแล้วลบคำตอบนั้นออกจากผลลัพธ์ด้วยcutหรือเครื่องมืออื่น เพื่อความสมบูรณ์คุณยังสามารถใช้ Perl:

perl -nE '/pattern/ && say $.' filename

หรือทับทิม:

ruby -ne 'puts $. if /pattern/' filename

0

คุณจะต้องการฟิลด์ที่สองหลังจากโคลอนไม่ใช่ฟิลด์แรก

grep -n "text to find" file.txt | cut -f2 -d:


วิธีนี้ใช้ได้ผลหากคุณต้องการจับคู่ข้อความ แต่ในกรณีที่หมายเลขบรรทัดคือสิ่งที่ OP ขอ
AJP

0

ในการนับจำนวนบรรทัดที่ตรงกับรูปแบบ:

grep -n "Pattern" in_file.ext | wc -l 

เพื่อแยกรูปแบบที่ตรงกัน

sed -n '/pattern/p' file.est

เพื่อแสดงหมายเลขบรรทัดที่ตรงกับรูปแบบ

grep -n "pattern" file.ext | cut -f1 -d:

2
อันดับแรกควรเป็น "grep -c" Pattern "in_file.ext" อันดับที่ 2 ควรเป็น "grep -o" Pattern "in_file.ext" ไม่จำเป็นต้องเกี่ยวข้องกับ sed หรือ wc
thelogix

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