Yalnızca satır numaralarını geri bildirmek için grep kullanın


106

Muhtemelen hatalı biçimlendirme içeren bir dosyam var (bu durumda, kalıbın oluşumu \\backslash). grepSadece bunun meydana geldiği satır numaralarını döndürmek için kullanmak istiyorum (maç burada olduğu gibi, x satırına gidin ve düzeltin).

Ancak, grep -neşleşmenin veya satırın kendisini değil, satır numarasını ( ) yazdırmanın bir yolu yok gibi görünüyor .

Satır numaralarını çıkarmak için başka bir normal ifade kullanabilirim, ancak grep'in bunu tek başına yapamayacağından emin olmak istiyorum. grep -noSanırım en yakına gelir ama yine de maçı gösterir.


1
Benim için en faydalı cevap şu soruydu grep -no:! Bu, denemek ve yapmak için buraya geldiğim şeyi yaptı! (yani bazen çok uzun olan satırı yazdırmayın, örneğin, küçültülmüş javascript kaynak dosyalarında.)
LondonRob

Yanıtlar:


156

Deneyin:

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

1
Makinemde, bu yalnızca eşleşen dosyaları satır numaraları olmadan yazdırmaktır (yani bir dosyada 3 eşleşmem varsa, yalnızca bir kez yazdırılır) ki bu hala çok yararlıdır ...
Mario Awad

3
@MarioAwad, param'ı değiştirmelisiniz -f. Benim için öyleydi -f2. (Bunun eski şeyler olduğunu bilin, ancak bazı zavallılara yardımcı olabileceğini düşünüyorum)
Emil Sierżęga

güzel eski unix adhoc kabuk komut dosyası için teşekkürler. Bu, esnek araçların karmaşıklıklarına ve öğrenme eğrisine değdiğini gösterir!
Alex

12
grep -n "text to find" file.ext | cut -f1,2 -d:dosya adını ve satır numarasını gösterir.
Jondlm

2
@jondim, aranan birden fazla dosya varsa yalnızca dosya adını gösterir; -Hyalnızca bir dosya olduğunda dosya adını göstermeye zorlamak için eklemeniz gerekir . Tersine, -hne kadar dosya açarsanız yazın, dosya adını vermemesini söylemek için her zaman kullanabilirsiniz .
Mark Reed

45

AWK kullanmaya açıksanız:

awk '/textstring/ {print FNR}' textfile

Bu durumda, FNR satır numarasıdır. AWK, grep | cut'a bakarken veya grep çıktısını alıp işlemek istediğiniz herhangi bir zamanda harika bir araçtır.


2
Tek bir süreç kullanır (geçmişte daha önemli olan ama yine de) ve yeni başlayanlar için anlaşılması kolay!
bgStack15

NRbu durumda olduğu gibi incelenmekte olan yalnızca bir dosya olduğunda da işe yarar.
Mark Reed

Tek kelimeyle mükemmel! Çok hızlı!
GTodorov

34

Tüm bu cevaplar grep'in tüm eşleşen satırları oluşturmasını ve ardından başka bir programa yönlendirmesini gerektirir. Satırlarınız çok uzunsa, satır numaralarının çıktısını almak için sadece sed kullanmak daha verimli olabilir:

sed -n '/pattern/=' filename

2

Bash sürümü

    lineno=$(grep -n "pattern" filename)
    lineno=${lineno%%:*}

1
Birden fazla çizgi bu modelle eşleşirse ne olur?
izabera

@izabera ekle | kuyruk -1
Diego

1

Birlikte cevapları tavsiye sedve awksadece satır numarasını almak yerine kullanmak için greptüm eşleştirme hat almak için ve daha sonra çıkışından bu çıkarmadan cutveya başka bir aracı. Tamlık için Perl'i de kullanabilirsiniz:

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

veya Ruby:

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

0

Kolondan sonraki ikinci alanı isteyeceksiniz, birinciyi değil.

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


Bu, metni eşleştirmek istiyorsanız işe yarar, ancak bu durumda OP'nin istediği satır numarasıdır.
AJP

0

Desenle eşleşen satır sayısını saymak için:

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

Eşleşen deseni çıkarmak için

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

Desenin eşleştiği satır numaralarını görüntülemek için

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

2
1. sadece "grep -c 'Pattern' in_file.ext" olmalıdır. 2. "grep -o 'Kalıp' in_file.ext" olmalıdır. Sed veya wc kullanmanıza gerek yok.
thelogix

0

sadece grep kullanarak :

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.