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

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

Ответов (14)

Решение

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

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

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

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

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

man grep

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

info grep

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

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

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

ripgrep

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

rg -C5 "pattern" .

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

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

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

$ grep thestring thefile -5

-5 дает вам 5 строки выше и ниже совпадения 'thestring' эквивалентно -C 5 или -A 5 -B 5 .

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

| grep -C 5

или

| grep -5

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

Если вы ищите код часто, серебряный поисковик AG намного эффективнее (т. Е. Быстрее), чем grep.

Вы показываете контекстные строки, используя параметр -C.

Например:

ag -C 3 "foo" myFile

line 1
line 2
line 3
line that has "foo"
line 5
line 6
line 7

Используйте 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

Я делаю компактный способ

grep -5 string file

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

grep -A 5 -B 5 string file

Вы можете использовать опцию -A (после) и -B (перед) в своей команде grep, попробуйте grep -nri -A 5 -B 5.

grep astring myfile -A 5 -B 5

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