标记后着色运行日志

时间:2014-10-24 08:25:16

标签: perl sed

我经常需要在控制台中分析大型日志。 我使用以下命令为重要的关键字着色:

    echo "string1\nerror\nsuccess\nstring2\nfail" | perl -p -e 's/(success)/\e[1;32;10m$&\e[0m/g;' -e 's/(error|fail)/\e[0;31;10m$&\e[0m/g'

它将使用绿色着色“成功”,使用红色将错误消息着色并保持其他行不变(因为它们包含一些有用的信息)。 但在某些情况下,我需要在某个标记之后对值进行着色,而不是标记本身,即在这些行中

Marker1: value1
Marker2: value2

需要通过已知标记仅突出显示value1和value2。 我正在寻找一种方法来修改我当前的oneliner以添加此功能

此外,我尝试了以下解决方案,我更喜欢

#!/bin/bash

default=$(tput op)
red=$(tput setaf 1 || tput AF 1)
green=$(tput setaf 2 || tput AF 2)

sed -u -r "s/(Marker1: )(.+)$/\1${red}\2${default}/
    s/(Marker2: )(.+)$/\1${green}\2${default}/" "${@}"`

但它有一些缓冲问题,所以对于某些常量文件是可以的,但是连续运行的日志根本不显示

更新: 在一些perl大师的帮助下找到了解决方案。

echo -e "string1\nerror\nsuccess\nstring2\nfail\nMaker1: value1\nMaker2: value2" | \
perl -p \
-e 's/(success)/\e[32m$&\e[0m/g;' \
-e 's/(error|fail)/\e[31m$&\e[0m/g;' \
-e 's/(Maker1:) (.*)/$1 \e[36m$2\e[0m/m;' \
-e 's/(Maker2:) (.*)/$1 \e[01;34m$2\e[0m/m;'

2 个答案:

答案 0 :(得分:1)

echo -e "string1\nerror\nsuccess\nstring2\nfail\nMaker1: value1\nMaker2: value2" | \
perl -p \
-e 's/(success)/\e[32m$&\e[0m/g;' \
-e 's/(error|fail)/\e[31m$&\e[0m/g;' \
-e 's/(Maker1:) (.*)/$1 \e[36m$2\e[0m/m;' \
-e 's/(Maker2:) (.*)/$1 \e[01;34m$2\e[0m/m;'

答案 1 :(得分:0)

#!/bin/bash

default=$(tput op)
red=$(tput setaf 1 || tput AF 1)
green=$(tput setaf 2 || tput AF 2)
#default='e[0m'
#red='e[0;31;10m'
#green='e[1;32;10m'

# automaticaly use passed argument file if any or stdin if not
sed -u -r \
 "/success/    s//${green}&${default}/
  /error|fail/ s//${red}&${default}/
  /^Marker1:/ {s//\1${red}/;s/$/${default}/;}
  /^Marker2:/ {s//\1${green}/;s/$/${default}/;}" \
    $( [ ${#@} -gt 0 ] && echo ${@} )

一行:

  • 删除其他第一行
  • ;
  • 替换sed中的换行符
  • 直接使用终端代码代替变量
  • 如果您管道或使用特定文件,则删除最后一行