grep для цветных строк

#linux #bash #grep

#linux #bash #grep

Вопрос:

Я написал простой скрипт PHP-оболочки, который анализирует файлы и выводит определенный элемент.
Он генерирует много выходных данных. В разных цветах (bash), зеленый для OK, желтый для предупреждений, красный для ошибок и т.д.

Во время разработки я хочу отфильтровать некоторые строки. Например, все строки, содержащие текст красного цвета.

Могу ли я использовать grep (или другую) команду для этого?

Комментарии:

1. Пример ввода / вывода был бы хорош здесь.

Ответ №1:

Я понятия не имею, как выглядит ваш ввод, но в качестве доказательства концепции вы можете отфильтровать любые строки в ls выводе, которые используют зеленый цвет:

 ls --color=always | grep '^[[01;32m'
  

Таблицу поиска для других цветов можно найти здесь: http://en.wikipedia.org/wiki/ANSI_escape_code#Colors

Подсказка: На случай, если вы не знали, ^[ часть выше должна быть введена как Ctrl-VEsc (или действительно Ctrl-VCtrl-[ на большинстве терминалов). Я уверен, что в grep будет какая-то опция, чтобы сделать это понятным x1B вместо этого, но я ее не нашел

Комментарии:

1. На ум приходит эта превосходная статья. Почему вы никогда не должны анализировать выходные данные ls mywiki. wooledge.org/ParsingLs Никаких возражений против вашего ответа, который является хорошим!

2. Я так и знал 🙂 Кто-то собирался сказать что-то о моей неудачной попытке принудительно выполнить цветной вывод. В этом случае это вполне нормально, потому что цель состоит в том, чтобы показывать строки, содержащие escape-код ANSI для зеленого цвета. Никаких бы то ни было предположений относительно источника указанных строк, не говоря уже о каком-либо значении. Определение строки довольно широко принято в контексте фильтра UNIX 🙂

3. Вот несколько альтернатив вместо использования ctrl V, ESC : grep $'^e[31m' , grep $'^33[31m' , grep -P '^e[31m' , grep -P '^33[31m'

Ответ №2:

Насколько я понимаю, вы анализируете входные данные один раз, чтобы раскрасить их в любом случае, верно? Почему бы не «вырезать» предупреждения / ошибки в той же функции? Заставьте свой скрипт использовать параметры командной строки, такие как myscript --nowarnings

getopt Здесь есть руководство по PHP

Я не знаю никакого php, но что-то вроде (псевдокод):

 paintred(string, show){
    match(string);
    if(show){
        print(string) in red;
    }
    else return 0;
}
  

Где show будет зависеть от параметра командной строки.

Таким образом, вы анализируете файл только один раз и даете будущим пользователям возможность пропускать строки OK или предупреждения.