grep-подобный инструмент, который окрашивает / окрашивает, но не фильтрует? - PullRequest
12 голосов
/ 22 февраля 2012

В течение многих лет я замечал, что grep GNU в Unixes (не только в Linux-версиях) обнаружил, что я использовал интерактивный TERM с поддержкой цвета, например, xterm / gnome-terminal / kconsole, и красиво раскрасил мои поисковые выражения в контексте.

Что может быть простым инструментом cli, который только подчеркивает или выделяет ваш regex или простую строку поиска, но, в отличие от 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 ]

27 голосов
/ 22 февраля 2012

Вы можете использовать egrep и сопоставлять как искомый шаблон, так и начало строки. Поскольку последний всегда совпадает, но не может быть окрашен, он подражает тому, что вы ищете.

egrep 'pattern|^' file

Редактировать: Изначально я узнал об этом из ответа на этот вопрос .

10 голосов
/ 22 февраля 2012

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

grep -C 9999 'pattern' file
6 голосов
/ 22 февраля 2012

Трюк sed, который вы ищете, должен быть примерно таким:

sed 's/pattern/\x1b[01;31m&\x1b[0m/g' file

где:

  • pattern - то же самое, что вы использовали бы в grep
  • & в шаблоне замены означает использование того же текста, что и *
  • окружающие символы & используются для установки красного цвета переднего плана и его сброса

Подробнее о том, как избежать цветовых последовательностей в sed, можно найти в ответах на этот вопрос .

1 голос
/ 22 февраля 2012

Чтобы расширить опцию less, упомянутую в shellter (которая работает хорошо, если вы просто хотите визуально изучить раскрашенный вывод и не передавать его другой программе), выполните следующие шаги:

  1. Передайте вывод в less (или запустите less filename.txt).
  2. Нажмите / для поиска вперед (или ? для поиска назад).
  3. Введите поисковый запрос (по умолчанию регулярное выражение или сначала нажмите Ctrl-r, чтобы переключиться на простую строку). Нажмите Enter.
  4. Поисковый термин будет выделен. Нажмите n, чтобы перейти к следующему вхождению, или N, чтобы перейти к предыдущему.
  5. Нажмите q, чтобы выйти.
...