Gunakan grep untuk melaporkan kembali nomor baris saja

106

Saya memiliki file yang mungkin berisi format yang buruk (dalam hal ini, terjadinya pola \\backslash). Saya ingin menggunakan grepuntuk mengembalikan hanya nomor baris di mana ini terjadi (seperti, pertandingan ada di sini, pergi ke baris # x dan memperbaikinya).

Namun, tampaknya tidak ada cara untuk mencetak nomor baris ( grep -n) dan bukan pertandingan atau baris itu sendiri.

Saya dapat menggunakan regex lain untuk mengekstrak nomor baris, tetapi saya ingin memastikan grep tidak dapat melakukannya sendiri. grep -nopaling dekat, saya pikir, tapi masih menampilkan pertandingan.

Neil
sumber
1
Jawaban yang paling berguna bagi saya ada di pertanyaan grep -no:! Ini melakukan apa yang ingin saya coba dan lakukan di sini! (yaitu tidak mencetak baris yang terkadang sangat panjang, misalnya, file sumber javascript yang diperkecil.)
LondonRob

Jawaban:

156

mencoba:

grep -n "text to find" file.ext | cut -f1 -d:
love_me_some_linux
sumber
1
Di mesin saya, ini hanya mencetak file yang cocok tanpa nomor baris (jadi jika saya memiliki 3 kecocokan di dalam file, itu hanya dicetak sekali) yang masih sangat berguna ...
Mario Awad
3
@ MarioAwad, Anda harus memanipulasi -fparam. Bagi saya itu -f2. (Ketahuilah ini adalah barang lama, tapi saya pikir itu bisa membantu beberapa jiwa yang malang)
Emil Sierżęga
terima kasih untuk skrip shell adhoc unix lama yang indah. ini menunjukkan bahwa alat yang fleksibel sebanding dengan kerumitan dan kurva pembelajarannya!
Alex
12
grep -n "text to find" file.ext | cut -f1,2 -d:menunjukkan nama file dan nomor baris.
Jondlm
2
@jondim itu hanya menampilkan nama file jika ada lebih dari satu file yang sedang dicari; Anda perlu menambahkan -Huntuk memaksanya menampilkan nama file ketika hanya ada satu file. Sebaliknya, Anda selalu dapat menggunakan -huntuk memberitahukannya agar tidak mengeluarkan nama file tidak peduli berapa banyak file yang Anda grep.
Mark Reed
45

Jika Anda terbuka untuk menggunakan AWK:

awk '/textstring/ {print FNR}' textfile

Dalam hal ini, FNR adalah nomor baris. AWK adalah alat yang hebat saat Anda melihat grep | cut, atau kapan pun Anda ingin mengambil keluaran grep dan memanipulasinya.

brightlancer
sumber
2
Menggunakan satu proses (yang lebih penting di masa lalu, tetapi tetap saja), dan cukup mudah dipahami untuk pemula yang awk!
bgStack15
NRberfungsi dengan baik bila hanya ada satu file yang sedang diperiksa, seperti dalam kasus ini.
Mark Reed
Cukup Brilliant! Ini sangat cepat!
GTodorov
34

Semua jawaban ini membutuhkan grep untuk menghasilkan seluruh baris yang cocok, lalu menyalurkannya ke program lain. Jika baris Anda sangat panjang, akan lebih efisien jika menggunakan sed untuk mengeluarkan nomor baris:

sed -n '/pattern/=' filename
maverick
sumber
2

Versi Bash

    lineno=$(grep -n "pattern" filename)
    lineno=${lineno%%:*}
maverick
sumber
1
Dan apa yang terjadi jika lebih dari satu garis cocok dengan pola itu?
izabera
@izabera tambahkan | ekor -1
Diego
1

Saya merekomendasikan jawaban dengan seddan awkuntuk hanya mendapatkan nomor baris, daripada menggunakan grepuntuk mendapatkan seluruh baris yang cocok dan kemudian menghapusnya dari output dengan cutatau alat lain. Untuk kelengkapan, Anda juga bisa menggunakan Perl:

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

atau Ruby:

ruby -ne 'puts $. if /pattern/' filename
Mark Reed
sumber
0

Anda akan menginginkan kolom kedua setelah titik dua, bukan yang pertama.

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

Chris
sumber
Ini berfungsi jika Anda ingin mencocokkan teks, tetapi dalam kasus nomor baris adalah apa yang diminta OP.
AJP
0

Untuk menghitung jumlah garis yang cocok dengan pola:

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

Untuk mengekstrak pola yang cocok

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

Untuk menampilkan nomor baris yang polanya cocok

grep -n "pattern" file.ext | cut -f1 -d:
JstRoRR
sumber
2
Pertama seharusnya "grep -c 'Pattern' in_file.ext". Kedua harus "grep -o 'Pattern' in_file.ext". Tidak perlu melibatkan sed atau wc.
thelogix
0

hanya menggunakan grep :

grep -n "text to find" file.ext | grep -Po '^[^:]+'

Micael Levi
sumber