#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 или предупреждения.