Uzyskaj numer linii podczas korzystania z grep

360

Korzystam z rekurencyjnego grep do wyszukiwania plików w poszukiwaniu ciągu, a wszystkie dopasowane pliki i wiersze zawierające ten ciąg są drukowane na terminalu. Ale czy można również uzyskać numery tych linii?

Np .: obecnie otrzymuję /var/www/file.php: $options = "this.target", ale staram się uzyskać /var/www/file.php: 1142 $options = "this.target";, no cóż, gdzie 1142byłby numer wiersza zawierającego ten ciąg.

Składnia, której używam do rekurencyjnego grep, to sudo grep -r 'pattern' '/var/www/file.php'

Kolejne pytanie dotyczy tego, w jaki sposób otrzymujemy wyniki, które nie są równe wzorowi. Jak wszystkie pliki, ale nie te, które mają określony ciąg?

Sai
źródło
Flaga -v pokaże linie, które nie pasują (grep -v myText
MyFile.txt

Odpowiedzi:

546
grep -n SEARCHTERM file1 file2 ...
Miro A.
źródło
Miałem kolejne szybkie pytanie, w jaki sposób otrzymujemy wyniki, które nie są równe wzorowi. Jak wszystkie pliki, ale nie te, które mają określony ciąg?
sai
5
byłby to przełącznik wiersza poleceń -v. Jeśli uruchomisz „grep --help”, wyświetli wszystkie opcje
Miro A.,
56
Nie potrzebujesz, -rjeśli określisz wiele plików. Potrzebujesz tylko, -rjeśli określisz katalogi.
Sparhawk
@JeanPaul - Widzę ten sam wynik zarówno dla -nr, jak i -n -r. Jakiej wersji grep używasz? $ grep -n -r nazwa * | wc -l 1984 $ grep -nr nazwa * | wc -l 1984 $ grep -V grep (BSD grep) 2.5.1-FreeBSD
Miro A.
Tylko odpowiedź na kod, bez wyjaśnienia. : S
Florian Castelain
148

Numery linii są drukowane za pomocą grep -n:

grep -n pattern file.txt

Aby uzyskać tylko numer linii (bez pasującej linii), można użyć cut:

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

Linie nie zawierające wzoru są drukowane za pomocą grep -v:

grep -v pattern file.txt
Carlito
źródło
3
I ostatni pasujący numer linii: grep -n pattern file.txt | cut -d : -f 1 | tail -1(możesz zapisać to do zmiennej i użyć go np. Z pliku tail)
Nux
Aby usunąć liczbę / dwukropek na początku każdego ciągu, możesz użyć czegoś takiego:grep -n pattern file.txt | sed 's/^[0-9][0-9]*://'
leetbacoon
24

Jeśli chcesz tylko numer linii, zrób to:

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

Przykład:

$ grep -nr 9780545460262 EXT20130410.txt | gawk '{print $1}' FS=":" 
48793
52285
54023
Cloud Falls
źródło
1
awk -F: '{print $1}'również działa i nie trzeba -rw grepprzypadku stosowania na plikach (tylko katalogi mogą być przeszukiwane rekursywnie)
Stuart Cardall
7
grep -A20 -B20 pattern file.txt

Wyszukaj wzór i pokaż 20 linii po i przed wzorem

emilio
źródło
11
Nie o to w ogóle proszono.
Jonathon Reinhart
3
Ponadto, -C20jest krótsza wersja, czy to, co chciał
Marty Neal
0

grep -nr katalog „szukaj ciągu”

To daje ci linię z numerem linii.

losowa osoba
źródło
0

Aby wyświetlić wyniki z numerami linii, możesz spróbować

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

Wynik powinien być mniej więcej taki:

linenumber: other data "word to search for" other data
Fouad Djebbar
źródło