Выделите результаты поиска в консоли, отображая весь вывод команды

19

Когда я использую, например, cat file.txt | grep --color=tty "pattern"я получаю выделенный шаблон поиска. Когда я хочу немного больше контекста вокруг каждого удара, Grep имеет -A, -Bи -Cпараметры.

Однако я хочу отобразить весь файл (или любой вывод команды) и выделить определенный шаблон. Существует ли такая команда или инструмент выделения?

DerMike
источник
Чем то, что вы хотите сделать сейчас, отличается от того, что вы уже делаете?
Бенджамин Банье

Ответы:

22

На unix.stackexchange.com был ответ, в котором был такой хитрый трюк:

grep -E --color 'pattern|$' file.txt

или

grep --color 'pattern\|$' file.txt

который соответствует вашему шаблону или концу строки в каждой строке. Только шаблон выделен.

Приостановлено до дальнейшего уведомления.
источник
+1 Простой и легко адаптируемый к zgrep, bzgrep и т. Д. Отлично!
Стефан Ласевский,
Есть ли какой-нибудь способ не печатать постоянно --color? Я думаю, что довольно просто встроить опцию цвета в grep, но не уверен, почему мы каждый раз явно вводим цвет. Я пытался создать сценарии, в которых у файлов grepd есть bash с выражением grep --color $ 1 $ 2, но он не работает. Любая подсказка, чтобы исправить это, пожалуйста
Srujan Kumar Gulla
1
@lordlupine: добавьте GREP_OPTIONS='--color'в свой ~/.bashrc(или измените настройку, чтобы включить --color). Вам нужно будет запустить новый терминал или выполнить это назначение в командной строке текущего терминала, чтобы оно вступило в силу.
Приостановлено до дальнейшего уведомления.
9

Мне нравится Ack .

ack --passthru somepattern filename

Это как grep, но лучше. По умолчанию он подсвечивается, а с помощью --passthruопции он показывает весь файл (или стандартный ввод) вместо только совпадающих строк.

Адам Баткин
источник
1
Если вы пытаетесь перенаправить вывод в ack, например, из tail, то вам также нужно использовать эту --filterопцию. Например:tail -f myLogFile | ack --filter --passthru pattern
Воробей
5

Я также рекомендую использовать less(или такое), но я хочу показать вам более дидактическое решение. Как только вы определили эту функцию:

функция подсветки ()
{
    sed "s / $ 1 /` tput smso` & `tput rmso` / g" "$ {2: -}"
}

Вы можете использовать это так:

command | highlight pattern
highlight pattern file.txt

Примечание: Эта версия является чувствительным к регистру, чтобы изменить это просто добавить iпосле того, как gв sedвыражении.

Кир
источник
1
Я бы вызвал tputвместо жесткого кодирования значений. Таким образом, вы также избегаете использования echo -e, которое может иметь другие эффекты.
Игнасио Васкес-Абрамс
Вы абсолютно правы, я искал это без удачи. Благодарю.
cYrus 13.10.10
Эта версия не нуждается в захвате скобок и может быть запущена с помощью prog | highlight "pattern"или highlight "pattern" file:highlight () { local file=${2:--}; sed "s/$1/$(tput smso)&$(tput rmso)/gi" "$file"; }
приостановлена ​​до дальнейшего уведомления.
Мои sedнавыки в основном не существуют. Как бы мне пришлось изменить это, чтобы соответствовать шаблону с учетом регистра. В любом случае, я добавлю это в мои функции bash_functions. Большое спасибо.
DerMike
@DerMike: Теперь он чувствителен к регистру.
cyrus
3

Переход -Cк grepдостаточно высокому значению сделает это.

Игнасио Васкес-Абрамс
источник
Я мог бы поклясться, что получил что-то еще в прошлый раз, когда попробовал это. (Каждый соответствует контексту с разделителями «-----» между ними.) Теперь, когда вы сказали мне, он работает нормально :-) Спасибо.
DerMike
Он будет отделять каждый матч, если не хватает контекста.
Игнасио Васкес-Абрамс
3

less выделяет рисунок, так

less -p 'mypattern' file.txt

или

ridiculously | long | pipe | less

а затем меньше /искать шаблон, который будет выделен.

Примечание:

Вы можете улучшить свою команду, например,
установить псевдоним alias grep="grep --color=tty"и использовать ее так:

grep 'mypattern' file.txt;
Случайный кодер
источник
1
Вы должны воздерживаться от использования GREP_OPTIONS, вместо этого использовать псевдоним. см .: bugs.launchpad.net/ubuntu/+bug/67141
lesmana 13.10.10
Primum non nocere. удален.
Казуальный кодер
GREP_OPTIONS используется многими формами grep(zgrep, bzgrep, bzfgrep и т. Д.). Таким образом, если вы хотите, чтобы все формы grep вели себя согласованно, вам необходимо установить псевдоним для каждой формы grep. Новый ответ @ Casual выше не bzgrep pattern /var/log/messages.?.gzподходит для чего-то подобного , это пример, где цветовая подсветка ОЧЕНЬ полезна.
Стефан Ласевский
1

Есть хороший инструмент SuperCat , который служит именно для этой цели. Он может как раскрасить вывод вашей консоли, так и создать «выделенный» HTML из вашего ввода.

Иван Тарасов
источник
Спасибо, это выглядит многообещающе. Тем не менее, я не могу заставить его работать в данный момент.
DerMike
1
Взгляните на его конфигурационные файлы (в /etc/supercatUbuntu), которые устанавливают правила раскраски, в основном это пары color / regexp (с некоторыми дополнительными правилами); Страница man также короткая и приятная.
Иван Тарасов
Я нашел spcrcфайл синтаксиса vim по адресу vim.org/scripts/script.php?script_id=2676
DerMike,