Отримайте номер рядка під час використання grep


360

Я використовую рекурсивний греп для пошуку файлів для рядка, а всі відповідні файли та рядки, що містять цей рядок, друкуються на терміналі. Але чи можна отримати і рядки цих рядків?

Наприклад: зараз я отримую те /var/www/file.php: $options = "this.target", що я намагаюсь отримати, - /var/www/file.php: 1142 $options = "this.target";а де 1142був би рядок, що містить цей рядок.

Синтаксис, який я використовую для рекурсивного грепування, є sudo grep -r 'pattern' '/var/www/file.php'

Ще одне питання полягає в тому, як ми отримуємо результати за рівним шаблоном. Як і всі файли, але не ті, що мають певний рядок?


Прапор -v покаже рядки, які не збігаються (grep -v myText MyFile.txt)
bcarroll

Відповіді:


546
grep -n SEARCHTERM file1 file2 ...

У мене було ще одне швидке запитання, як ми можемо отримати результати за рівним шаблоном. Як і всі файли, але не ті, що мають певний рядок?
sai

5
це буде перемикач командного рядка -v. Якщо ви запустите "grep --help", він відобразить всі параметри
Miro A.

56
Вам не потрібно, -rякщо ви вказали кілька файлів. Вам потрібно лише -rякщо ви вкажете каталоги.
Sparhawk

@JeanPaul - Я бачу однаковий результат і для -nr, і для -n -r. Яку версію grep ви використовуєте? $ grep -n -r ім'я * | wc -l 1984 $ grep -nr ім'я * | wc -l 1984 $ grep -V grep (BSD grep) 2.5.1-FreeBSD
Miro A.

Відповідь лише на код, без пояснень. : S
Флоріан Каштелан

148

Номери рядків друкуються за допомогою grep -n:

grep -n pattern file.txt

Щоб отримати лише номер рядка (без відповідного рядка), ви можете використовувати cut:

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

Рядки, що не містять візерунок, друкуються за допомогою grep -v:

grep -v pattern file.txt

3
І останній номер відповідного рядка: grep -n pattern file.txt | cut -d : -f 1 | tail -1(ви можете зберегти це до змінної та використати її, наприклад, із хвостового файлу з неї)
Nux

А щоб видалити число / двокрапку на початку кожного рядка, ви можете використовувати щось на зразок:grep -n pattern file.txt | sed 's/^[0-9][0-9]*://'
leetbacoon

24

Якщо ви хочете лише номер рядка, зробіть це:

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

Приклад:

$ grep -nr 9780545460262 EXT20130410.txt | gawk '{print $1}' FS=":" 
48793
52285
54023

1
awk -F: '{print $1}'також працює і вам не потрібно -rв grepпри використанні на файли (тільки каталоги можуть бути знайдені рекурсивно)
Стюарт Cardall



0

Щоб відобразити результати з номерами рядків, ви можете спробувати це

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

Результат повинен бути приблизно таким:

linenumber: other data "word to search for" other data
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.