源日志:
2023-09-21 06:52:50.251 [http-nio-18110-exec-3] [rys95gq55073g9x] [INFO ] EmployeeService [502] – 111test
2023-09-21 06:52:50.251 [http-nio-18110-exec-3] [rys95gq55073g9x] [INFO ] EmployeeService [502] – 222test
2023-09-21 06:55:37.272 [http-nio-18110-exec-12] [rys95gq55073g9x] [INFO ] EmployeeService [502] – 333test
grep "test" a.log | awk -F "[" '{print $3}' | cut -d "]" -f1 | while read -r logId; do grep "$logId" s.log; done
echo "2023-09-21 06:52:50.251 [http-nio-18110-exec-3] [rys95gq55073g9x] [INFO ] EmployeeService [502] - 111test" | awk -F '[][]' '{print $4}'
awk -F '[][]'
中的 -F
参数用于指定字段分隔符。在这里,我们使用了方括号 []
作为分隔符,但由于方括号在正则表达式中有特殊意义,因此我们将它们用单引号括起来,以确保它们被视为普通字符。
具体解释如下:
-F '[][]'
: 这部分代码设置了字段分隔符-F
为正则表达式'[][]'
,其中方括号[]
包含了两个字符,表示awk
应该将这两个字符作为字段分隔符。在正则表达式中,方括号[]
用于表示字符集,而这里我们只是简单地指定了两个字符,即左括号[
和右括号]
,用来作为字段分隔符。
因此,awk
在处理文本时会将方括号内的字符 [
和 ]
视为字段分隔符,这样我们就可以使用 $4
来访问第 4 个字段,其中包含了 rys95gq55073g9x
。这是一种非常有用的方式来处理包含特殊字符的文本数据。
shell再脚本文件中的应用:
#!/bin/bash
# 设置日志文件目录路径
log_dir="/tmp/info"
# 获取2023-09-19的时间戳
start_timestamp=$(date -d "2023-09-19" +%s)
# 循环遍历日志文件
for log_file in $(find $log_dir -name "a.log" -newermt "2023-09-19"); do
echo "处理日志文件:$log_file"
grep "test" $log_file | awk -F "[" '{print $3}' | cut -d "]" -f1 | while read -r logId; do grep "$logId" $log_file; done
done