Jak uzyskać numer linii z grep?

19

Następujący grep

grep -r -e -n coll *

wyświetli się

fullpath/filename:  <tag-name>coll</tag-name>

Chciałbym wiedzieć, który wiersz ma następujący tekst, próbowałem dodać -n, ale to nie działało. Próbowałem dodać | grep -n *, ale zrobiło to coś dziwnego.

To, co chciałbym zobaczyć (nie dbam o format) to

fullpath/filename:10:  <tag-name>coll</tag-name>
UAdapter
źródło
1
Podczas korzystania z -nopcji widzę numery linii . Czy możesz opublikować wynik tego, co dostajesz?
Kris Harper,

Odpowiedzi:

18

Powinieneś umieścić -ena końcu listy opcji:grep -rne coll *

lgarzo
źródło
16

nie ma potrzeby -r & -e!

uzyskaj numer linii wzoru!

grep -n "pattern" file.txt

jeśli chcesz uzyskać tylko numer wiersza jako wynik, dodaj do niego kolejne polecenie grep!

grep -n "pattern" file.txt | grep -Eo '^[^:]+'
Jonasz
źródło
1
Aby uzyskać tylko numer linii, łatwiej jest go użyć cut, np.cut -f1 -d:
wjandrea
1

Aby grepować wzór w określonym pliku i uzyskać pasujące linie:

grep -n <Pattern> <File> | awk -F: '{ print $1 }' | sort -u

lub używając cutzgodnie z sugestią @wjandrea:

grep -n <Pattern> <File> | cut -f1 -d: | sort -u

gdzie

  • <Pattern>jest cytowanym globalnym wzorcem (użyj opcji -Edla wyrażenia regularnego);
  • <File> to plik, który Cię interesuje;
  • pierwsza rura awk ...filtruje numery linii na wyjściu grep (przed :każdą linią);
  • druga rura zapewnia, że ​​numery linii pojawiają się tylko raz.
Sheljohn
źródło
Aby uzyskać tylko numer linii, jest łatwiejszy w użyciu cutniż Awk, np.cut -f1 -d:
wjandrea
@wjandrea Łatwiejszy w jaki sposób?
Sheljohn
Mam na myśli, że składnia jest prostsza
wjandrea
@wjandrea To brzmi bardzo obiektywnie.
Sheljohn
@wjandrea Przepraszam za sarkazm, zredagowałem, aby dołączyć twoją sugestię :)
Sheljohn