grep файл, но показать несколько окружающих строк? - PullRequest
3122 голосов
/ 12 августа 2008

Я бы хотел grep для строки, но также показать предыдущие пять строк и следующие пять строк, а также совпадающую строку. Как я смогу сделать это?

Ответы [ 11 ]

4172 голосов
/ 12 августа 2008

Для BSD или GNU grep вы можете использовать -B num, чтобы установить, сколько строк до матча и -A num для количества строк после матча.

grep -B 3 -A 2 foo README.txt

Если вам нужно одинаковое количество строк до и после, вы можете использовать -C num.

grep -C 3 foo README.txt

Это покажет 3 строки до и 3 строки после.

573 голосов
/ 12 августа 2008

-A и -B будут работать, как и -C n (для n строк контекста) или просто -n (для n строк контекста ... до тех пор, пока n равно 1 до 9).

72 голосов
/ 07 сентября 2008

ack работает с аргументами, аналогичными grep, и принимает -C. Но обычно это лучше для поиска по коду.

35 голосов
/ 12 августа 2008
grep astring myfile -A 5 -B 5

Это будет grep "myfile" для "astring", и покажет 5 строк до и после каждого матча

17 голосов
/ 12 августа 2008

Я обычно использую

grep searchstring file -C n # n for number of lines of context up and down

Многие инструменты, такие как grep, также имеют действительно отличные файлы man. Я часто обращаюсь к справочной странице grep , потому что с ней можно многое сделать.

man grep

Многие инструменты GNU также имеют информационную страницу , которая может содержать более полезную информацию в дополнение к справочной странице.

info grep
8 голосов
/ 08 октября 2013

Поиск «17655» в «/some/file.txt», показывающий контекст 10 строк до и после (с помощью Awk), выводу предшествует номер строки, за которым следует двоеточие Используйте это в Solaris, когда grep не поддерживает опции «- [ACB]».

awk '

/17655/ {
        for (i = (b + 1) % 10; i != b; i = (i + 1) % 10) {
                print before[i]
        }
        print (NR ":" ($0))
        a = 10
}

a-- > 0 {
        print (NR ":" ($0))
}

{
        before[b] = (NR ":" ($0))
        b = (b + 1) % 10
}' /some/file.txt;
7 голосов
/ 12 января 2018

Используйте grep

$ grep --help | grep -i context
Context control:
  -B, --before-context=NUM  print NUM lines of leading context
  -A, --after-context=NUM   print NUM lines of trailing context
  -C, --context=NUM         print NUM lines of output context
  -NUM                      same as --context=NUM
3 голосов
/ 11 апреля 2018

ripgrep

Если вы заботитесь о производительности, используйте ripgrep, синтаксис которого аналогичен grep, например

rg -C5 "pattern" .

-C, --context NUM - Показывать NUM строк до и после каждого матча.

Существуют также такие параметры, как -A / --after-context и -B / --before-context.

Инструмент построен на механизме регулярного выражения Rust , что делает его очень эффективным для больших данных.

1 голос
/ 11 марта 2019

Grep имеет опцию Context Line Control, в которой вы можете использовать --contect, просто

| grep -C 5

или

| grep -5

Должен сделать трюк

1 голос
/ 05 января 2019
$grep thestring thefile -5

-5 возвращает вас на 5 строк выше и ниже совпадения «thestring» эквивалентно -C 5 ИЛИ -А 5 -В 5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...