grep файл, но показать несколько окружающих строк?
-
08-06-2019 - |
Вопрос
Я хотел бы 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
параметры.