日志读取(逐行匹配,高亮,排除)

1.读取日志(匹配,高亮,排除)

读取日志的每一行,进行筛选

sh arg1 arg2  arg3

输入参数

arg1为 必须要匹配的字符串。以逗号分隔

arg2 表示,需要高亮的字符串,以逗号分隔

arg3表示,排除的不显示的字符串,包含任意一个都不显示。以逗号分隔。  可以默认为空

所有参数支持正则表达。

 举例  ./readlog.sh   'SYSCALL=execve'     'exe.*subj'    sleep

 脚本

touch readlog.sh

chmod +x readlog.sh

./readlog.sh arg1 arg2  arg3

 用法:

1. 可以使用正则表达式

'type=[^ ]*'  匹配type=到空格结束

1984[5-9]|1985[0-6]  ,匹配19545到19856的任意一个字符串

 

 1 #!/bin/bash
 2 
 3 # 检查参数数量
 4 if [ "$#" -lt 1 ]; then
 5     echo "Usage: $0 <arg1> [arg2] [arg3]"
 6     exit 1
 7 fi
 8 
 9 # 使用逗号分隔的参数字符串
10 arg1="$1"
11 arg2="${2:-}"
12 arg3="${3:-}"
13 
14 # 定义日志文件路径
15 logfile="/var/log/audit/audit.log"
16 
17 # 初始化颜色变量
18 current_color="red"
19 
20 # 将逗号分隔的参数字符串拆分为数组
21 IFS=',' read -r -a arg1_array <<< "$arg1"
22 IFS=',' read -r -a arg2_array <<< "$arg2"
23 IFS=',' read -r -a arg3_array <<< "$arg3"
24 
25 # 逐行读取日志文件,并输出匹配条件的行
26 while IFS= read -r line; do
27     # 检查行中是否包含输入字符串arg1(必须),且不包含arg3中的任何一个字符串
28     contains_all_arg1=true
29     for a1 in "${arg1_array[@]}"; do
30         if [[ ! $line =~ $a1 ]]; then
31             contains_all_arg1=false
32             break
33         fi
34     done
35 
36     if $contains_all_arg1; then
37         contains_arg3=false
38         for a3 in "${arg3_array[@]}"; do
39             if [[ $line =~ $a3 ]]; then
40                 contains_arg3=true
41                 break
42             fi
43         done
44         if [ "$current_color" == "red" ]; then
45             color=6
46             current_color="blue"
47         else
48             color=1
49             current_color="red"    
50         fi
51     highlighted_line=$line
52         if ! $contains_arg3; then
53             for a2 in "${arg2_array[@]}"; do
54                 # 高亮显示字符串arg2中的每个字符串
55                 highlighted_line=$(echo "$highlighted_line" | sed "s,\($a2\),$(tput setaf $color)\1$(tput sgr0),g")
56             done
57         echo "$highlighted_line"
58         fi
59     fi
60 done < "$logfile"

 

 

 

定制化:

 1.18-20行 为输入的参数分隔符

2. 45行的                 highlighted_line=$(echo "$line" | sed "s,\($a2\),$(tput setaf 6)\1$(tput sgr0),g")      sed中的,为分隔符(如果要高亮的字符串包含,会混乱,可替换为其他)

3.                  $(tput setaf 6)高亮颜色改变

ANSI 颜色代码:

  • 0: 黑色
  • 1: 红色
  • 2: 绿色
  • 3: 黄色
  • 4: 蓝色
  • 5: 紫色
  • 6: 青色
  • 7: 白色

 

posted @ 2024-05-07 20:48  zzl14  阅读(31)  评论(0)    收藏  举报