Если Вы используете bash
, можно использовать PIPESTATUS
переменная типа массив для получения статуса выхода каждого элемента конвейера.
$ false | true
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
1 0
Если Вы используете zsh
, они выстраивают, назван pipestatus
(вопросы случая!) и индексы массива запускаются в одном:
$ false | true
$ echo "${pipestatus[1]} ${pipestatus[2]}"
1 0
Для объединения их в функции способом, который не теряет значения:
$ false | true
$ retval_bash="${PIPESTATUS[0]}" retval_zsh="${pipestatus[1]}" retval_final=$?
$ echo $retval_bash $retval_zsh $retval_final
1 0
Выполненное вышеупомянутое в bash
или zsh
и Вы получите те же результаты; только один из retval_bash
и retval_zsh
будет установлен. Другой будет пробел. Это позволило бы функции заканчиваться return $retval_bash $retval_zsh
(отметьте отсутствие кавычек!).
Испытайте мультихвост. Это - übergeneralization tail -f
. Можно наблюдать несколько файлов в отдельных окнах, выделить строки на основе их содержания, и т.д.
multitail -c /path/to/log
Цвета настраиваются. Если схема цвета по умолчанию не работает на Вас, запишите свое собственное в файле конфигурации. Например, звонить multitail -cS amir_log /path/to/log
со следующим ~/.multitailrc
:
colorscheme:amir_log
cs_re:green:INFO
cs_re:red:SEVERE
Другое решение, если Вы находитесь на сервере, где это неудобно для установки нестандартных инструментов, состоит в том, чтобы объединиться tail -f
с sed или awk для добавления управляющих последовательностей выбора цвета. Это требует tail -f
для сбрасывания его стандартного вывода незамедлительно, даже когда его стандартный вывод является каналом я не знаю, делают ли все реализации это.
tail -f /path/to/log | awk '
/INFO/ {print "\033[32m" $0 "\033[39m"}
/SEVERE/ {print "\033[31m" $0 "\033[39m"}
'
или с sed
tail -f /path/to/log | sed --unbuffered \
-e 's/\(.*INFO.*\)/\o033[32m\1\o033[39m/' \
-e 's/\(.*SEVERE.*\)/\o033[31m\1\o033[39m/'
Если Вашим sed не является GNU sed, замена \o033
литеральным символом ESC и удаляют --unbuffered
.
Еще одна возможность состоит в том, чтобы работать tail -f
в Emacs окружают буфер и способности к окраске синтаксиса Emacs использования.
source-highlight
не широко установленная команда, таким образом, необходимо, по крайней мере, дать ссылку на стройплощадку.
– Gilles 'SO- stop being evil'
17.03.2011, 00:45
Также обратите внимание на это, если Вы просто хотите искать тот, соответствующий regex, GNU grep с --color
будет работать — просто передают Ваш по каналу tail
вывод через это.
grep -A9999 -B9999
regex
, это покажет все строки, если у Вас не будет 10 000 несогласующих отрезков длинной линии подряд. Использование что-то как GREP_COLORS="ms=31:sl=33:cx=32" grep -A9999 -B9999 SEVERE
показать слово SEVERE
в красном, остальная часть Сверхжестких позиций желтого цвета и всех других (НЕСЕРЬЕЗНЫХ) строк (до 9 999) в зеленом.
– G-Man Says 'Reinstate Monica'
07.08.2015, 05:45
Можно использовать радугу, который colorizes строки на основе регулярных выражений:
rainbow --red='SEVERE.*' --green='INFO.*' tail -f my-file.log
Это также прибывает связанное предопределенными конфигурациями, например, для журналов Tomcat:
rainbow --config=tomcat tail -f my-file.log
(правовая оговорка: Я - автор),
Вы взглянули на ccze? У Вас есть возможность настроить цвета по умолчанию некоторых ключевых слов с помощью опции -c
или непосредственно в Вашем конфигурационном файле. Если Ваш экран очищается после колоризации необходимо использовать опцию -A
.
Править:
Если действительно требуется раскрасить полную строку, красную, у Вас могла бы также быть попытка в следующем:
$ tail -f myfile.log | perl -pe 's/.*SEVERE.*/\e[1;31m$&\e[0m/g'
\e[1;31m
даст Вам красный цвет. Если Вы хотели бы некоторый желтый, использовать \e[1;33m
, и для зеленого использования \e[1;32m
. \e[0m
восстанавливает цвет обычного текста.
\007
в конец regex, как так: perl -pe 's/(ERROR)/\033[31m$1\033[0m\007/g;'
. Это работает потрясающее при использовании tmux с set -g bell-action any
, в этом случае, если у Вас будет свой конец журнала в другом окне, то то имя окна предупредит каждый раз, когда regex находит соответствие.
– J.C. Yamokoski
13.11.2012, 06:15
grc, универсальный colourizer довольно прохладен.
apt-get install grc
Просто сделайте
grc tail -f /var/log/apache2/error.log
и наслаждайтесь!
Вы также найдете его на GitHub.
Стать окрашенным выводом от стандартных команд как grep
, необходимо установить это alias
в Вашем .bashrc
# User specific aliases and functions
alias grep='grep --color=auto'
когда Вы grep что-то в Вашем файле Вы видите что-то вроде этого, (но вероятно в красном):
[root@linuxbox mydir]# grep "\(INFO\|SEVERE\)" /var/log/logname this entry is an INFO SEVERE this entry is a warn! this entry is an INFO this entry is an INFO SEVERE this entry is a warn!
если хотят использовать tail
или awk
и хочу это, цвет выживает к каналу, затем псевдоним недостаточно, и необходимо использовать --color=always
параметр, например:
[root@linubox mydir]# grep --color=always "\(INFO\|SEVERE\)" /var/log/logname | tail -f | awk '{ print $1 }' this SEVERE this this SEVERE
Если Вы хотите цветной текст с awk
история немного сложна, но более мощна, например:
[root@linubox mydir]# tail -f /var/log/messages | awk '{if ($5 ~ /INFO/) print "\033[1;32m"$0"\033[0m"; else if ($1 ~ /SEVERE/) print "\033[1;31m"$0"\033[0m"; else print $0}' this entry is an INFO SEVERE this entry is a warn! this is another ENTRY this entry is an INFO this is another ENTRY this entry is an INFO SEVERE this entry is a warn!
с каждой строкой в ее собственном цвете.
Существуют многие другой способ получить цветной текст от оболочки с другими инструментами, и они хорошо descripted другими участниками.
Бесстыдный разъем: Я записал инструмент под названием TxtStyle, который делает что-то подобное как опции, упомянутые ранее. Можно выполнить его следующим образом:
tail -f /var/log/syslog | txts --regex '\d+'
Можно также определить названные стили в файле конфигурации (~/.txts.conf
) и используйте его как так:
ifconfig | txts --name ifconfig
(ifconfig
стиль определяется из поля),
уверенный!
Я писал долго движению функцию, вызванную "egrepi", на основе 8 цветных определений переменных. Это работает ТОЛЬКО переданное по каналу как "хвост-f" окрашенный функцией.
1. setColors
во-первых, цветные переменные функционируют, чтобы быть названными сначала:
setColors ()
{
set -a
which printf >/dev/null 2>&1 && print=printf || print=print # Mandriva doesn't know about printf
hide='eval tput civis'
show='eval tput cnorm'
CLS=$(tput clear)
bel=$(tput bel)
case ${UNAME} in
AIX)
# text / foreground
N=$(${print} '\033[1;30m')
n=$(${print} '\033[0;30m')
R=$(${print} '\033[1;31m')
r=$(${print} '\033[0;31m')
G=$(${print} '\033[1;32m')
g=$(${print} '\033[0;32m')
Y=$(${print} '\033[1;33m')
y=$(${print} '\033[0;33m')
B=$(${print} '\033[1;34m')
b=$(${print} '\033[0;34m')
M=$(${print} '\033[1;35m')
m=$(${print} '\033[0;35m')
C=$(${print} '\033[1;36m')
c=$(${print} '\033[0;36m')
W=$(${print} '\033[1;37m')
w=$(${print} '\033[0;37m')
END=$(${print} '\033[0m')
# background
RN=$(${print} '\033[6;40m')
Rn=$(${print} '\033[40m')
RR=$(${print} '\033[6;41m')
Rr=$(${print} '\033[41m')
RG=$(${print} '\033[6;42m')
Rg=$(${print} '\033[42m')
RY=$(${print} '\033[6;43m')
Ry=$(${print} '\033[43m')
RB=$(${print} '\033[6;44m')
Rb=$(${print} '\033[44m')
RM=$(${print} '\033[6;45m')
Rm=$(${print} '\033[45m')
RC=$(${print} '\033[6;46m')
Rc=$(${print} '\033[46m')
RW=$(${print} '\033[6;47m')
Rw=$(${print} '\033[47m')
HIGH=$(tput bold)
SMUL=$(tput smul)
RMUL=$(tput rmul)
BLINK=$(tput blink)
REVERSE=$(tput smso)
REVERSO=$(tput rmso)
;;
*)
# text / foreground
n=$(tput setaf 0)
r=$(tput setaf 1)
g=$(tput setaf 2)
y=$(tput setaf 3)
b=$(tput setaf 4)
m=$(tput setaf 5)
c=$(tput setaf 6)
w=$(tput setaf 7)
N=$(tput setaf 8)
R=$(tput setaf 9)
G=$(tput setaf 10)
Y=$(tput setaf 11)
B=$(tput setaf 12)
M=$(tput setaf 13)
C=$(tput setaf 14)
W=$(tput setaf 15)
END=$(tput sgr0)
HIGH=$(tput bold)
SMUL=$(tput smul)
RMUL=$(tput rmul)
BLINK=$(tput blink)
REVERSE=$(tput smso)
REVERSO=$(tput rmso)
# background
Rn=$(tput setab 0)
Rr=$(tput setab 1)
Rg=$(tput setab 2)
Ry=$(tput setab 3)
Rb=$(tput setab 4)
Rm=$(tput setab 5)
Rc=$(tput setab 6)
Rw=$(tput setab 7)
RN=$(tput setab 8)
RR=$(tput setab 9)
RG=$(tput setab 10)
RY=$(tput setab 11)
RB=$(tput setab 12)
RM=$(tput setab 13)
RC=$(tput setab 14)
RW=$(tput setab 15)
;;
esac
BLUEf=${B}
BLUE=${b}
REDf=${R}
RED=${r}
GREENf=${G}
GREEN=${g}
YELLOWf=${Y}
YELLOW=${y}
MANGENTAf=${M}
MANGENTA=${m}
WHITEf=${W}
WHITE=${w}
CYANf=${C}
CYAN=${c}
OK="${RG}${n}OK${END}"
KO="${RR}${n}KO${END}"
NA="${N}NA${END}"
COLORIZE='eval sed -e "s/{END}/${END}/g" -e "s/{HIGH}/${HIGH}/g" -e "s/{SMUL}/${SMUL}/g" -e "s/{RMUL}/${RMUL}/g" -e "s/{BLINK}/${BLINK}/g" -e "s/{REVERSE}/${REVERSE}/g" -e "s/{REVERSO}/${REVERSO}/g"'
LOWS=' -e "s/{n}/${n}/g" -e "s/{r}/${r}/g" -e "s/{g}/${g}/g" -e "s/{y}/${y}/g" -e "s/{b}/${b}/g" -e "s/{m}/${m}/g" -e "s/{c}/${c}/g" -e "s/{w}/${w}/g"'
HIGHS=' -e "s/{N}/${N}/g" -e "s/{R}/${R}/g" -e "s/{G}/${G}/g" -e "s/{Y}/${Y}/g" -e "s/{B}/${B}/g" -e "s/{M}/${M}/g" -e "s/{C}/${C}/g" -e "s/{W}/${W}/g"'
REVLOWS=' -e "s/{Rn}/${Rn}/g" -e "s/{Rr}/${Rr}/g" -e "s/{Rg}/${Rg}/g" -e "s/{Ry}/${Ry}/g" -e "s/{Rb}/${Rb}/g" -e "s/{Rm}/${Rm}/g" -e "s/{Rc}/${Rc}/g" -e "s/{Rw}/${Rw}/g"'
REVHIGHS=' -e "s/{RN}/${RN}/g" -e "s/{RR}/${RR}/g" -e "s/{RG}/${RG}/g" -e "s/{RY}/${RY}/g" -e "s/{RB}/${RB}/g" -e "s/{RM}/${RM}/g" -e "s/{RC}/${RC}/g" -e "s/{RW}/${RW}/g"'
# COLORIZE Usage:
# command |${COLORIZE} ${LOWS} ${HIGHS} ${REVLOWS} ${REVHIGHS}
set +a
}
2. egrepi
и функция egrepi, эффективная и изящная: цвет, циклически повторяющийся между 8 или больше цветами (Ваши потребности) И протестированный под 3 другими Unix ОС, с комментариями:
# egrepi() egrep with 8 REVERSE cyclic colorations on regexps almost like egrep
# egrepi
# current script will work for KSH88, KSH93, bash 2+, zsh, under AIX / Linux / SunOS
egrepi ()
{
args=$*
# colorList=wBcgymrN # KSH93 or bash 3+, not for AIX
# set -A color # needed with older sh
color[0]=$Rw; color[1]=$RB; color[2]=$Rc; color[3]=$Rg; color[4]=$Ry; color[5]=$Rm; color[6]=$Rr; color[7]=$RN; # this is the only one AIX solution
i=0
unset argsToGrep argsSedColor argsPerlColor
for arg in ${args}
do
[ "${arg}" == "." ] && arg=\\. # if you wanna grep "."
# color=R${colorList:((${RANDOM: -1:1})):1} # bash RANDOMized colors
# color=R${colorList:$i:1} && let i++ && ((i==8)) && i=0 # KSH93 or bash 3+, not for AIX
argsToGrep="${argsToGrep}${argsToGrep:+|}${arg}"
# argsSedColor="${argsSedColor} -e s#${arg}#$n${!color}&${w}#gI" # AIX KSH88 do not recognise this fucking variable double expansion
# argsSedColor="${argsSedColor} -e s#${arg}#$n${color[$i]}&${w}#gI" # AIX neither do include sed with Ignore case
argsPerlColor="${argsPerlColor}${argsPerlColor:+,}s#${arg}#$n${color[$i]}$&${END}#gi" # So: gotta use perl
let i+=1 && ((i==8)) && i=0 # AIX KSH88 do not recognise "let i++"
done
# egrep -i "${argsToGrep}" | sed ${argsSedColor} | egrep -v "grep|sed" # AIX sed incompatibility with Ignore case
# (($# > 0)) && (egrep -i "${argsToGrep}" | perl -p -e ${argsPerlColor}) || cat # this line colors & grep the words, will NOT act as "tail -f"
(($# > 0)) && (perl -p -e ${argsPerlColor}) || cat # this line just colors the words
}
3. Использование
управляйте | egrepi word1.. wordN
Я записал функцию удара, которая принимает до трех параметров и делает подобный grep фильтр на текстовом файле и выводит текст на экран в цвете.
Я также хотел бы видеть, что хвост функционирует, который сделает это, но еще не нашел то.
Эта функция может также быть улучшена - я ценил бы любую справку о том, как сделать ее лучше.
function multigrep(){
#THIS WORKS - Recreate this, using input parameters
#sed -En '/(App)|(Spe)/p' ./flashlog.txt;
filename="/Users/stevewarren/Library/Preferences/Macromedia/Flash\ Player/Logs/flashlog.txt";
paramString="";
for element in "$@"
do
#echo $element;
paramString="$paramString($element)|";
done
#TRIM FINAL | OFF PARAMSTRING
paramString=${paramString:0:${#paramString}-1};
#CREATE SED EXPRESSION - '/($1)|($2)|(...)/p'
paramString="'/$paramString/p'";
#CREATE SED FUNCTION, CALL ON FILE
paramString="sed -En $paramString ./flashlog.txt"
echo $paramString;
echo "${txtbld}$(tput setaf 7)" > ./flashlog_output.txt;
eval $paramString >> ./flashlog_output.txt;
echo >> ./flashlog_output.txt;
#cat ./flashlog_output.txt;
cat ./flashlog_output.txt | while read LINE
do
[[ $1 && ${1-x} ]] &&
if grep -q $1 <<<$LINE; then
echo "$(tput setaf 3)$LINE"
fi
[[ $2 && ${2-x} ]] &&
if grep -q $2 <<<$LINE; then
echo "$(tput setaf 7)$LINE"
fi
[[ $3 && ${3-x} ]] &&
if grep -q $3 <<<$LINE; then
echo "$(tput setaf 6)$LINE"
fi
done
}
Можно использовать colortail:
colortail -f /var/log/messages
На основании ответа @uloBasEI я попытался использовать ... | перл ... | perl ...
, но конвейер Linux становится немного сумасшедшим и слишком медленным. Если я помещу все правила только в одну команду perl
, она будет работать нормально.
Например, создайте perl
файл colorTail.pl , как показано ниже:
#!/usr/bin/perl -w
while(<STDIN>) {
my $line = $_;
chomp($line);
for($line){
s/==>.*<==/\e[1;44m$&\e[0m/gi; #tail multiples files name in blue background
s/.*exception.*|at .*/\e[0;31m$&\e[0m/gi; #java errors & stacktraces in red
s/info.*/\e[1;32m$&\e[0m/gi; #info replacement in green
s/warning.*/\e[1;33m$&\e[0m/gi; #warning replacement in yellow
}
print $line, "\n";
}
Используйте его как:
tail -f *.log | perl colorTail.pl
tail -f *.log -f **/*.log | perl colorTail.pl
ПРИМЕЧАНИЕ: вы можете использовать его в MobaXTerm тоже! Просто скачайте плагин perl
с сайта MobaXTerm .
Публикует некоторое время назад утилиту Node Js - log-color-highlight
tail -f file | lch -red error warn -green success
lch -f file -red.bold error warn -underline.bgGreen success
Одно из решений, которое работает для раскрашивания любого текста, а не только файлов журнала, - это инструмент Python ' colout '.
pip install colout
myprocess | colout REGEX_WITH_GROUPS color1,color2... [attr1,attr2...]
Если любой текст в выводе 'myprocess', который соответствует группе 1 регулярного выражения, будет окрашен в цвет color1, группа 2 - в цвет2 и т. Д.
Например:
tail -f /var/log/mylogfile | colout '^(\w+ \d+ [\d:]+)|(\w+\.py:\d+ .+\(\)): (.+)$' white,black,cyan bold,bold,normal
т.е. первая группа регулярных выражений (скобки) соответствует начальной дате в файле журнала, вторая группа соответствует имени файла Python, номеру строки и имени функции, а третья группа соответствует сообщению журнала, которое приходит после этого.Это выглядит так:
Обратите внимание, что строки или части строк, которые не соответствуют ни одному из моих регулярных выражений, по-прежнему отображаются эхом, так что это не похоже на 'grep --color' - из вывода ничего не фильтруется.
Очевидно, это достаточно гибко, чтобы вы могли использовать его с любым процессом, а не только с последующими лог-файлами. Обычно я просто создаю новое регулярное выражение на лету каждый раз, когда хочу что-то раскрасить. По этой причине я предпочитаю colout любому настраиваемому инструменту раскраски файлов журнала, потому что мне нужно изучить только один инструмент, независимо от того, что я раскрашиваю: ведение журнала, тестовый вывод, выделение синтаксиса фрагментов кода в терминале и т. Д.
Что касается цветовые коды, я бы использовал tput:
red=$( tput -Txterm setaf 1 )
norm=$( tput -Txterm sgr0 )
bold=$( tput -Txterm bold )
См. для справки: man tput
Затем:
tail -F myfile.log | sed "s/\(.ERROR.*\)/$red$bold\1$norm/g"
grc точно!
настройте параметры цвета с помощью регулярного выражения в файле: ~ .grc / conf.tail (или любое другое имя по вашему желанию)
regexp=.*(select .*)$
colours=unchanged,cyan
=====
regexp=.*(update .*)$
colours=unchanged,bold yellow
=====
regexp=.*(insert .*)$
colours=unchanged,bold yellow
=====
regexp=.*(emp=\d+).*
colours=unchanged,reverse green
=====
regexp=.*http.*/rest/contahub.cmds.(.*?)/(\w*).*$
colours=unchanged,green,magenta
=====
regexp=.*http.*/M/.*\.(.*?Facade)/(\w*).*$
colours=unchanged,underline green,underline magenta
командная строка:
grc -c conf.tail tail -f log/tomcat/catalina.out
информация для настройки grc: https://github.com/manjuraj/config/blob/master/.grc/sample.conf
для Centos
yum install -y ccze
tail -f /var/log/file.log | ccze -A
Основываясь на @ этом сообщении , я создал решение, которое показывает динамический хвостовой вывод из нескольких файлов журналов и возвращает цветные предупреждения и сообщения об ошибках, как показано ниже:
tail -f -n 5 application.log debug.log| perl -pe 's#WARNING#\x1b[33m$&#; s#ERROR#\x1b[31m$&#; s#foo#\x1b[32m$&#'
Установка не требуется. Надеюсь, это поможет кому-то.
Рабочее решение для Mac
Перепробовал множество вещей, которые просто не работали из-за какой-то проблемы с экранированием.
Наконец-то найдено рабочее решение:
tail -f example.log | sed \
-e "s/FATAL/"$'\e[31m'"&"$'\e[m'"/" \
-e "s/ERROR/"$'\e[31m'"&"$'\e[m'"/" \
-e "s/WARNING/"$'\e[33m'"&"$'\e[m'"/" \
-e "s/INFO/"$'\e[32m'"&"$'\e[m'"/" \
-e "s/DEBUG/"$'\e[34m'"&"$'\e[m'"/"
Быстрый способ показать, как это работает:
echo " [timestamp] production.FATAL Some Message\n" \
"[timestamp] production.ERROR Some Message\n" \
"[timestamp] production.WARNING Some Message\n" \
"[timestamp] production.INFO Some Message\n" \
"[timestamp] production.DEBUG Some Message\n" | sed \
-e "s/FATAL/"$'\e[31m'"&"$'\e[m'"/" \
-e "s/ERROR/"$'\e[31m'"&"$'\e[m'"/" \
-e "s/WARNING/"$'\e[33m'"&"$'\e[m'"/" \
-e "s/INFO/"$'\e[32m'"&"$'\e[m'"/" \
-e "s/DEBUG/"$'\e[34m'"&"$'\e[m'"/"
Обратите внимание, :это не скроет журналы, просто закрасьте нужные части
sed
? (жаль о том, что был ленив и не изобразил его самостоятельно!), Но добавьте ased
пример также. – Ali 28.11.2011, 18:41tail -f
сawk
код, если строка не имеет ИНФОРМАЦИИ и СЕРЬЕЗНЫЙ, строка, не быть распечатанным. Как я могу распечатать оставаться строки также? (Строка не должна быть окрашена), – Benjamin 29.06.2012, 13:32; next
перед закрывающими фигурными скобками для пропуска последующей обработки и новой технологической линии1 {print}
в конце (1
средства всегда). – Gilles 'SO- stop being evil' 29.06.2012, 14:58