grep файл, но показать несколько окружающих строк?

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

12.08.2008 17:55:32
Для этой цели я держу копию perl-скрипта Брендана Грегга . Работает хорошо.
Ethan Post 4.09.2008 19:16:22
Для решения, которое работает на Solaris, проверьте эту ссылку .
jahroy 30.05.2013 22:55:37
man grep | grep -C 1 context:)
StvnW 3.11.2015 03:57:38
man grep | grep -C 1 "\-C";)
Anders B 7.07.2016 10:56:21
@StvnW ... Я не знаю, следует ли называть эту мету (в более общем, а не SO-контексте) или как ее назвать. Вы ответили на вопрос, показав, как использовать ответ, чтобы найти ответ.
bballdave025 14.09.2018 20:50:43
12 ОТВЕТОВ
РЕШЕНИЕ

Для 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 строки после.

4496
21.09.2017 08:33:54
Это хорошо, но, к сожалению, grep Solaris не поддерживает это. Смотрите эту ссылку для Соляриса: unix.com/solaris/33533-grep-display-few-lines-before-after.html
рüффп 21.03.2011 12:55:22
Хорошо, но что если вы хотите показать все строки вывода после матча? grep -A0 и grep -A-1 не режут ...
g33kz0r 22.07.2011 02:18:13
по какой-то причине у меня не работает, хотя упоминается в моих справочных страницах.
Hayri Uğur Koltuk 1.08.2012 09:43:46
Если вы HP-UX env, ни одна из версий grep не будет работать так же, как в Solaris. Был в состоянии использовать ссылку Solaris, но в этой ссылке заменил nawk на awk.
zkarthik 23.01.2013 21:45:43
-n для номеров строк, но для некоторых версий grep -n # будет показывать # окружающие строки (например, -c) с номерами строк. Это полезный ярлык, который мне нужен, когда мне нужен контекст.
Anthony DiSanti 7.05.2013 16:24:37
grep astring myfile -A 5 -B 5

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

39
12.08.2008 17:58:00
"grep astring myfile -C 5" будет делать то же самое
Syed Siraj Uddin 15.07.2015 14:06:28

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

605
3.04.2019 18:46:27
Я попробовал -nформат и обнаружил, что он работает только до 9. Ибо 15возвращает 5 строк
Deepak Mahakale 27.03.2019 07:49:14
@DeepakMahakale Это, вероятно, связано с тем, как аргументы / параметры командной строки обычно анализируются программами POSIX. Спецификатор опции - это один символ (например -A, -Bили -C). Обычно за параметром опции следует значение ( -o a.outдля указания выходного файла в GCC), но он также может функционировать как простой переключатель / флаг ( -gдля включения информации отладки в GCC). Однако пробелы между опциями являются необязательными, поэтому для опций без значения можно объединить их ( -ABC), что означает, что -15интерпретируется -1 -5(две отдельные опции) и -5переопределяется -1.
natiiix 19.04.2019 12:17:15
-5 быстрее, чем оба -A 5 -B 5. Они не предназначены для совместного использования. Другим читателям скрипта будет чище, если вы выберете -A или -B или -C вместо -9.
Eric Aldinger 7.06.2019 17:01:21

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

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

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

man grep

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

info grep
20
12.08.2008 19:11:40

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

76
6.01.2017 19:36:39
ack также поддерживает -A -B.
Shuo 4.11.2016 07:49:36
Ack лучше чем grep во многих отношениях. Это быстрее с более простым синтаксисом.
chim 7.02.2017 10:30:43
Преимущество grep заключается в том, что он устанавливается по умолчанию во многих системах.
Marc Z 16.10.2018 10:49:35
@MarcZ: Да, по умолчанию grep устанавливается чаще, чем ack, но ack - это портативный, автономный скрипт. Нет необходимости компилировать его или устанавливать в системный каталог, такой как / usr / bin /. Как только он загружен и помещен в каталог, указанный в $ PATH (и установлен бит разрешения eXecute), он должен работать сразу же. (Для доступа к работе не требуются привилегии sudo или root.)
J-L 12.11.2018 17:41:52
Этот вопрос о том grep, не стоит ли использовать его для «рекламы» ack(что действительно является отличным инструментом) - хорошая идея…
MonsieurDart 10.12.2019 14:24:30

Ищите «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;
10
26.12.2013 15:31:46

Использовать 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
13
12.01.2018 11:25:38
Вы не читали принятый ответ? Вы просто повторяете то, что уже было сказано по вопросу почти 10 лет ...
Yokai 13.01.2018 09:22:11
Ой, прости, Йокай. Но я ничего не читаю о поиске ответа в разделе справки grep.
Chiel ten Brinke 13.01.2018 10:30:04
@Yokai Кроме того, что сказал Чил тен Бринке, в принятом ответе не упоминаются длинные варианты
user3738870 13.09.2019 19:57:06

Вот решение @Ygor вawk

awk 'c-->0;$0~s{if(b)for(c=b+1;c>1;c--)print r[(NR-c+1)%b];print;c=a}b{r[NR%b]=$0}' b=3 a=3 s="pattern" myfile

Примечание. Замените aи bпеременные числом строк до и после.

Это особенно полезно для системы , которая не поддерживает Grep - х -A, -Bи -Cпараметры.

5
11.04.2018 10:24:12

ripgrep

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

rg -C5 "pattern" .

-C, --context NUM- Показать ЧИСЛО строк до и после каждого матча.

Есть также такие параметры, как -A/ --after-contextи -B/ --before-context.

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

7
11.04.2018 10:28:35
$ grep thestring thefile -5

-5получает вас 5строку выше и ниже матч «thestring» эквивалентен -C 5или -A 5 -B 5.

4
6.12.2019 23:22:06

Grep имеет опцию под названием Context Line Control, вы можете использовать --contextв этом, просто,

| grep -C 5

или

| grep -5

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

4
16.12.2019 04:06:25

Я использую, чтобы сделать компактный способ

grep -5 string file

Это эквивалент

grep -A 5 -B 5 string file
0
11.12.2019 17:24:10