jq处理日志数据
介绍
jq 是一个轻量级且灵活的命令行 JSON 处理器。它允许你使用简单的过滤器来处理 JSON 数据,提取、操作和转换 JSON 文档。jq 是处理 JSON 数据的强大工具,特别适合在命令行环境中使用。
简单将就是:专门处理 json结构的字符串的工具
我将加入jq这个更加权威的圈子
awk在处理大批量&&简单数据的时候还是挺方便的,但是对于一些复杂的数据还是比较麻烦。
特别是现在的日志一般都是json格式,所以jq的好处就不言而喻了。
用到的命令
jq代码
grep '"msg":"OnConstelltionHoroScop-success"' "$filename" | jq --arg ts "$min_timestamp"\-r -c 'select(.timestamp >= $ts) |.timestamp |= (split(".")[0])|[.PlayerId,.star,.timestamp]| map(tostring) | join(",")'
分析:
jq --arg ts "$min_timestamp" # 这句代码是将 实参 $min_timestamp 传给 形参 ts
-r -c # -r 去掉字符串引号, -c 多个字段同一行显示
select(.timestamp >= $ts) # .timestamp就是取timestamp的值|select 作比较,选满足条件的行
= (split(".")[0]) # 去掉毫秒时间戳
[.PlayerId,.star,.timestamp]# 取字段值合成数组
map(tostring) # 将数组转成字符串 mapjoin(",")' # 合成一个字符串,用,隔开
代码参考
#!/bin/bashfuncSearch() {local filename="$1"local min_timestamp="$2"echo $filename,$min_timestampgrep '"msg":"OnConstelltionHoroScop-success"' "$filename" | jq --arg ts "$min_timestamp"\-r -c 'select(.timestamp >= $ts) |.timestamp |= (split(".")[0])|[.PlayerId,.star,.timestamp]| map(tostring) | join(",")'
}funcExcel() {local filename="$1"local min_timestamp="$2"echo $filename,$min_timestampgrep '"msg":"OnConstelltionHoroScop-success"' "$filename" | jq --arg ts "$min_timestamp"\-r -c 'select(.timestamp >= $ts) |.timestamp |= (split(".")[0])|[.PlayerId,.star,.timestamp]| map(tostring) | join(",")'>>log.csv
}# 获取用户输入的天数
days=$1
current_date=$(date +"%Y-%m-%d")
end_date=$(date -d $current_date +%s)
#end_date=$(date -d "2025-06-03" +%s)
start_date=$(date -d "$current_date -$days days" +%s)search_start_date=$(date -d "$current_date -$days days" +"%Y-%m-%d")
#search_start_date="2025-05-31"# 处理带前缀的日志文件(格式:xxx-2025-05-30T02-26-06.459.log)
find ./mgActivity -name "mgActivity*.log" | while read file; do# 从带前缀的文件名提取日期部分file_date=$(basename "$file" | grep -oE '[0-9]{4}-[0-9]{2}-[0-9]{2}')timestamp=$(date -d "$file_date" +%s 2>/dev/null)if [ -n "$timestamp" ] && [ "$timestamp" -ge "$start_date" ] && [ "$timestamp" -le "$end_date" ]; thenecho "处理文件: $file"funcExcel $file $search_start_date# funcSearch $file $search_start_datefi
donefile="./mgActivity/mgActivity.log"
echo "处理文件: $file"
#echo "PlayerId,star,timestamp" > log.csv
funcExcel $file $search_start_date