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?


Flaga -v pokaże linie, które nie pasują (grep -v myText
MyFile.txt

Odpowiedzi:


546
grep -n SEARCHTERM file1 file2 ...

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

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

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



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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.