日志读取(逐行匹配,高亮,排除)
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: 白色

浙公网安备 33010602011771号