Grep файл, но показывать несколько окружающих линий?
Я хотел бы grep
для строки, но также показать предыдущие пять строк и следующие пять строк, а также совпадающую строку. Как я смогу это сделать?
Ответы
Ответ 1
Для 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 строки после.
Ответ 2
-A
и -B
будут работать, как и -C n
(для n
строк контекста), или просто -n
(для n
строк контекста... до тех пор, пока n равно от 1 до 9).
Ответ 3
ack работает с аналогичными аргументами как grep и принимает -C
. Но обычно это лучше для поиска кода.
Ответ 4
grep astring myfile -A 5 -B 5
Это будет grep "myfile" для "astring" и покажет 5 строк до и после каждого матча
Ответ 5
Обычно я использую
grep searchstring file -C n # n for number of lines of context up and down
Многие из таких инструментов, как grep, также имеют действительно отличные файлы. Я часто упоминаю grep man page, потому что вы можете с ним справиться.
man grep
Многие инструменты GNU также имеют информационную страницу, которая может содержать более полезную информацию в дополнение к странице руководства.
info grep
Ответ 6
Найдите "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;
Ответ 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
Ответ 8
Если вы заботитесь о производительности, используйте ripgrep
, синтаксис которого похож на grep
, например
rg -C5 "pattern" .
-C
, --Context NUM
- Показывать NUM строк до и после каждого совпадения.
Существуют также такие параметры, как -A
/--After-Context
и -B
/--Before-Context
.
Инструмент построен на основе движка Rust Regex, что делает его очень эффективным для больших данных.
Ответ 9
$grep thestring thefile -5
-5 возвращает вас на 5 строк выше и ниже совпадения "thestring" эквивалентно -C 5 ИЛИ -A 5 -B 5
Ответ 10
Вот решение @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
.
Ответ 11
В Grep есть опция, называемая Context Line Control
, вы можете использовать --contect
, просто
| grep -C 5
или же
| grep -5
Должен сделать трюк