Я хотів би grep
зробити рядок, але також показати попередні п’ять рядків і наступні п’ять рядків, а також відповідну лінію. Як я міг би це зробити?
man grep | grep -C 1 context
:)
man grep | grep -C 1 "\-C"
;)
Я хотів би grep
зробити рядок, але також показати попередні п’ять рядків і наступні п’ять рядків, а також відповідну лінію. Як я міг би це зробити?
man grep | grep -C 1 context
:)
man grep | grep -C 1 "\-C"
;)
Відповіді:
Для 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).
-n
формат і виявив, що він працює тільки до 9
. Бо 15
повертається 5 рядків
-A
, -B
або -C
). Зазвичай специфікатору опцій супроводжується значення ( -o a.out
вказати вихідний файл у GCC), але він також може функціонувати як простий перемикач / прапор ( -g
для включення інформації про налагодження в GCC). Однак пробіли між параметрами необов’язкові, тому для параметрів без значення можна об'єднати їх ( -ABC
), що означає, що -15
інтерпретується -1 -5
(два окремих варіанти) та -5
переосмислює значення -1
.
ack працює з аналогічними аргументами, як grep, і приймає -C
. Але зазвичай краще шукати код.
grep
, чи не впевнений, що його використання для "реклами" ack
(це справді чудовий інструмент) - гарна ідея ...
grep astring myfile -A 5 -B 5
Це призведе до "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
Використовуйте греп
$ 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
Шукати "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;
ripgrep
Якщо ви дбаєте про продуктивність, використовуйте ripgrep
синтаксис, подібний до grep
, наприклад,
rg -C5 "pattern" .
-C
,--context NUM
- Показати NUM рядків до та після кожного матчу.
Також є такі параметри, як -A
/ --after-context
і -B
/ --before-context
.
Інструмент побудований на основі регекс-двигуна Руста, що робить його дуже ефективним у великих даних.
Ось рішення @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
параметри.
Якщо ви часто шукаєте код, AG пошук срібла набагато ефективніший (тобто швидший) ніж grep.
Ви показуєте рядки контексту за допомогою параметра -C.
Наприклад:
ag -C 3 "foo" myFile
line 1
line 2
line 3
line that has "foo"
line 5
line 6
line 7