grep-подобный инструмент, который окрашивает / окрашивает, но не фильтрует?
В течение многих лет я замечал, что GNU grep в Unixes (не только в разновидностях Linux) обнаружил, что я использовал интерактивный TERM с поддержкой цвета, например, xterm/gnome-terminal/kconsole, и красиво раскрасил мои поисковые выражения в контексте.
Что может быть простым инструментом cli, который только подчеркивает или выделяет ваше регулярное выражение или простую строку поиска, но, в отличие от grep, иначе не фильтрует строки? Может быть, уловка Sed может сделать это, что я могу псевдоним и более поздние команды канала?
ПРИМЕР
Поэтому я написал программу pricehist.sh, которая обычно создает CSV-подобные данные для другой программы, но я часто визуально проверяю ее так:
./pricehist.sh mostalexp-GPW 28 |sort -r -g -k 3 -t ' ' |column -t -s", "
MOSTALEXP,20120222,0.78,0.79,0.76,0.77,63900,0.77 0.04000 5.00000 -0.01000 -1.25000 49203
MOSTALEXP,20120203,0.82,0.82,0.78,0.78,446089,0.78 0.04000 4.87805 0 0 347949
MOSTALEXP,20120124,0.71,0.71,0.69,0.71,61478,0.71 0.03000 4.16667 -0.01000 -1.38889 43649
MOSTALEXP,20120130,0.73,0.73,0.70,0.73,59488,0.73 0.03000 4.10959 0 0 43426
MOSTALEXP,20120210,0.79,0.81,0.77,0.81,104120,0.81 0.03000 3.75000 0.01000 1.25000 84337
MOSTALEXP,20120213,0.80,0.80,0.78,0.80,86606,0.80 0.03000 3.70370 -0.01000 -1.23457 69284
MOSTALEXP,20120126,0.69,0.75,0.69,0.72,146353,0.72 0.02000 2.81690 0.04000 5.63380 105374
MOSTALEXP,20120131,0.72,0.73,0.71,0.72,72734,0.72 0.02000 2.73973 0 0 52368
MOSTALEXP,20120123,0.72,0.73,0.71,0.72,24133,0.72 0.02000 2.73973 0 0 17375
MOSTALEXP,20120214,0.78,0.81,0.78,0.79,56990,0.79 0.02000 2.50000 0.01000 1.25000 45022
MOSTALEXP,20120209,0.79,0.82,0.79,0.80,65243,0.80 0.02000 2.46914 0.01000 1.23457 52194
MOSTALEXP,20120118,0.69,0.70,0.68,0.69,62520,0.69 0.01000 1.44928 0.01000 1.44928 43138
MOSTALEXP,20120125,0.70,0.71,0.70,0.71,92317,0.71 0.01000 1.40845 0 0 65545
MOSTALEXP,20120201,0.71,0.74,0.71,0.74,199791,0.74 0.01000 1.38889 0.02000 2.77778 147845
MOSTALEXP,20120127,0.73,0.73,0.71,0.73,38157,0.73 0.01000 1.38889 0.01000 1.38889 27854
MOSTALEXP,20120207,0.78,0.79,0.77,0.79,56243,0.79 0.01000 1.28205 0.01000 1.28205 44431
MOSTALEXP,20120206,0.78,0.80,0.77,0.78,133597,0.78 0.01000 1.28205 0.02000 2.56410 104205
MOSTALEXP,20120221,0.81,0.81,0.79,0.80,112738,0.80 0.01000 1.25000 0.01000 1.25000 90190
MOSTALEXP,20120217,0.80,0.85,0.79,0.80,272245,0.80 0.01000 1.25000 0.05000 6.25000 217796
MOSTALEXP,20120216,0.81,0.81,0.79,0.80,30814,0.80 0.01000 1.25000 0.01000 1.25000 24651
MOSTALEXP,20120113,0.66,0.66,0.65,0.65,90267,0.65 0.00500 0.76336 0.00500 0.76336 58673
MOSTALEXP,20120220,0.80,0.82,0.80,0.80,83881,0.80 0 0 0.02000 2.50000 67104
MOSTALEXP,20120215,0.80,0.82,0.79,0.80,128714,0.80 0 0 0.03000 3.79747 102971
MOSTALEXP,20120208,0.79,0.84,0.79,0.81,280446,0.81 0 0 0.05000 6.32911 227161
MOSTALEXP,20120120,0.74,0.74,0.72,0.73,128831,0.73 0 0 0.02000 2.77778 94046
MOSTALEXP,20120117,0.67,0.71,0.67,0.69,284886,0.69 0 0 0.04000 5.97015 196571
MOSTALEXP,20120116,0.65,0.67,0.65,0.67,9548,0.67 0 0 0.02000 3.07692 6397
MOSTALEXP,20120202,0.75,0.87,0.75,0.82,1270955,0.82 -0.01000 -1.35135 0.13000 17.56757 1042183
MOSTALEXP,20120119,0.70,0.74,0.70,0.72,320471,0.72 -0.01000 -1.44928 0.05000 7.24638 230739
В конце трубы (после |column -t
) было бы неплохо добавить что-то, что выделяет хотя бы строку $(date +%Y%m%d)
, который на данный момент оценивается в 20120222
Другой пример tail -F /tmp/*.log | grep -C 9999 YouJustGotHacked
за исключением того, что я не хотел бы, чтобы grep фактически отфильтровывал любые строки, просто сделайте YouJustGotHacked намного проще, чтобы обнаружить шум.
4 ответа
Ты можешь использовать egrep
и сопоставьте как шаблон, который вы ищете, так и начало линии. Поскольку последний всегда совпадает, но не может быть окрашен, он подражает тому, что вы ищете.
egrep 'pattern|^' file
Изменить: я первоначально узнал об этом из ответа на этот вопрос.
grep
имеет -C
опция, которая может отображать контексты вокруг совпадающих строк. Вы можете воспользоваться этим.
grep -C 9999 'pattern' file
sed
уловка, которую вы ищете, должна быть примерно такой:
sed 's/pattern/\x1b[01;31m&\x1b[0m/g' file
где:
pattern
это то же самое, что вы использовали бы вgrep
&
в шаблоне замены означает использовать тот же текст, что и соответствующий- персонажи окружающие
&
используются для установки красного цвета переднего плана и сброса его впоследствии
Больше информации о том, как избежать цветовых последовательностей в sed
в ответах на этот вопрос.
Чтобы расширить на less
Опция, упомянутая shellter (которая работает хорошо, если вы просто хотите визуально изучить раскрашенный вывод и не передавать его в другую программу), вот шаги:
- Передайте ваш вывод
less
(или запуститьless filename.txt
). - Нажмите
/
искать вперед (или?
искать в обратном направлении). - Введите условие поиска (регулярное выражение по умолчанию или нажмите
Ctrl-r
сначала переключиться на использование простой строки). НажмитеEnter
, - Поисковый термин будет выделен. Нажмите
n
перейти к следующему вхождению илиN
перейти к предыдущему. - Нажмите
q
выйти