Проблемы с Perl-скриптом, который должен удалять строки в строках одного файла из другого файла

Мы могли бы организовать sed для удаления цветовых кодов из вывода, который поступает в файл журнала. Хотя для этого требуется получить вывод из tee в стандартный вывод и в конвейер, так что это не совсем просто. Там могут быть лучшие способы, чем трюк с перенаправлением подоболочки. Кажется, это работает с Bash и GNU sed, стандартный вывод получает красную ошибку , файл журнала не получает цветовых кодов:

#!/bin/bash
exec > >( (tee -a /dev/fd/7 | sed -Ee $'s/\033''\[[0-9][0-9]?m//g ' > logfile) 7>&1 )
N=$'\033[0m'
R=$'\033[31m'
echo "${R}error${N}: foo"

Еще одна опция в оболочке, позволяющая избежать эффектов повторного открытия /dev/fd/ N в Linux:

#!/bin/bash
exec > >(
        exec 7>logfile
        while IFS= read -r x ; do 
                echo "$x"
                x=${x//$'\033'\[[0-9]m}
                x=${x//$'\033'\[[0-9][0-9]m}
                echo "$x" >&7
        done    
)
N=$'\033[0m'
R=$'\033[31m'
echo "${R}error${N}: foo"

Хотя это, конечно, имеет проблемы с байтами NUL, но вывод журнала, вероятно, не содержит многих из них. Возможно, здесь лучше всего подойдет Perl-скрипт.

Если бы вы заботились только о сообщениях, распечатываемых из скрипта, вы могли бы создать функцию для вывода сообщения как в стандартный вывод, так и в лог-файл, и убрать из последнего цветовые коды. Однако это не помогло бы получить вывод команд в тот же файл журнала.

0
20.09.2015, 08:48
0 ответов

Теги

Похожие вопросы