Вопрос

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

Это было полезно?

Решение

Для БСД или ГНУ grep вы можете использовать -B num установить количество строк перед матчем и -A num для количества строк после совпадения.

grep -B 3 -A 2 foo README.txt

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

grep -C 3 foo README.txt

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

Другие советы

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

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

grep astring myfile -A 5 -B 5

Это позволит использовать grep «myfile» для «astring» и отображать 5 строк до и после каждого совпадения.

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

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

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

man grep

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

info grep

Найдите «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;

Используйте команду 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

ripgrep

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

rg -C5 "pattern" .

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

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

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

$grep thestring thefile -5

-5 получает 5 строк выше и под матчем «Тестрезирование» эквивалентно -c 5 или -a 5 -b 5

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

| grep -C 5

или

| grep -5

Должен сделать свое дело

Здесь @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 параметры.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top