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

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

2947 голосов | спросил Mark Harrison 12 PM00000090000003231 2008, 21:55:32

7 ответов


0

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

ответил Pat Notz 12 PM00000090000004331 2008, 21:57:43
0

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

ответил Stu 12 PM00000090000005631 2008, 21:59:56
0

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

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

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

man grep

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

info grep
ответил Sam Merrell 12 PM000000100000004931 2008, 22:42:49
0

Ищите «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;
ответил Malcolm Boekhoff 8 +04002013-10-08T04:21:17+04:00312013bEurope/MoscowTue, 08 Oct 2013 04:21:17 +0400 2013, 04:21:17
0

Используйте 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
ответил Chiel ten Brinke 12 Jpm1000000pmFri, 12 Jan 2018 14:25:38 +030018 2018, 14:25:38
0

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

ответил kenorb 11 PMpWed, 11 Apr 2018 13:24:12 +030024Wednesday 2018, 13:24:12
0
$grep thestring thefile -5

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

ответил JBone 5 Jpm1000000pmSat, 05 Jan 2019 21:39:36 +030019, 21:39:36

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132