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

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

+3061
12 авг. '08 в 17:55
источник поделиться
11 ответов

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

+4084
12 авг. '08 в 17:57
источник

Связанные вопросы


Похожие вопросы

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

+568
12 авг. '08 в 17:59
источник

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

+73
07 сент. '08 в 11:13
источник
grep astring myfile -A 5 -B 5

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

+35
12 авг. '08 в 17:58
источник

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

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

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

man grep

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

info grep
+16
12 авг. '08 в 18:42
источник

Найдите "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;
+8
08 окт. '13 в 0:21
источник

Использовать 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
+7
12 янв. '18 в 11:25
источник

ripgrep

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

rg -C5 "pattern" .

-C, --Context NUM - Показывать NUM строк до и после каждого совпадения.

Существуют также такие параметры, как -A/--After-Context и -B/--Before-Context.

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

+3
11 апр. '18 в 10:28
источник
$grep thestring thefile -5

-5 возвращает вас на 5 строк выше и ниже совпадения "thestring" эквивалентно -C 5 ИЛИ -A 5 -B 5

+1
05 янв. '19 в 18:39
источник

В Grep есть опция, называемая Context Line Control, вы можете использовать --contect, просто

| grep -C 5

или же

| grep -5

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

0
11 мар. '19 в 7:11
источник

Вот решение @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.

0
11 апр. '18 в 10:24
источник

Посмотрите другие вопросы по меткам или Задайте вопрос