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 1142
był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?
Odpowiedzi:
źródło
-r
jeśli określisz wiele plików. Potrzebujesz tylko,-r
jeśli określisz katalogi.Numery linii są drukowane za pomocą
grep -n
:Aby uzyskać tylko numer linii (bez pasującej linii), można użyć
cut
:Linie nie zawierające wzoru są drukowane za pomocą
grep -v
:źródło
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)grep -n pattern file.txt | sed 's/^[0-9][0-9]*://'
Jeśli chcesz tylko numer linii, zrób to:
Przykład:
źródło
awk -F: '{print $1}'
również działa i nie trzeba-r
wgrep
przypadku stosowania na plikach (tylko katalogi mogą być przeszukiwane rekursywnie)Wyszukaj wzór i pokaż 20 linii po i przed wzorem
źródło
-C20
jest krótsza wersja, czy to, co chciałgrep -nr katalog „szukaj ciągu”
To daje ci linię z numerem linii.
źródło
Aby wyświetlić wyniki z numerami linii, możesz spróbować
Wynik powinien być mniej więcej taki:
źródło