linux 脚本详解,shell脚本分析日志
需求
臨時接到一個需求,需要幫忙check一下線上新老用戶區分是否正確。
新老用戶確認的方法:
老用戶(注冊4天以外), 新用戶(注冊4天以內)
也就是說,需要check日志中請求的時間點和注冊的時間戳,相差是不是超過4天或者小于4天
日志大致如下:
2018-12-28/15:30:57 [strategy.go::xxxx.com/xxx/xxx/xxx.(*Strategy).FindStrategy] [INF] 222222222222222222:new_user_xxx_xxx_xxx, a97774397e994a4d, {"uid":"72666259","device_code":"A000007527957C","page":1,"count":3},1545982248
改掉了一些日志中的敏感信息
思路
利用grep 篩選 new_user/old_user,并將這一行日志,重定向到新的文件中
讀取文件,分別提取前面的請求時間,并轉化為時間戳,與這一行日志最后的時間戳對比
所以有了大致結構:
1.利用grep awk 縮小日志
2.> 將日志重定向到文本文件中
3.利用while 循環讀取文件
4.字符串截取前面的時間,并轉換為時間戳
5.字符串截取最后的時間戳
6.對比兩個時間戳的間隔時間
腳本解析
按照上面的思路,最終腳本如下:
grep new_user /logs/engine_info.log |awk -F',' '{print $1,$3}' >new_user.txt
sleep 1
while read line;
do
a=${line:0:19}
#注冊時間戳
timestamp=${line:0-10}
#請求時間戳
actualtime=${a/\// }
time=`date -d "$actualtime" +%s`
a=$((timestamp+345600))
#[ $time -gt $a ];echo $?
if [ $time -gt $a ];
then
echo "error"
echo $line
fi;
done
第一行,結合grep和awk、重定向,將日志輸出到new_user.txt中
讀取文件
a=${line:0:19}
這邊是截取前面19個字符,即
2018-12-28/15:30:57
由于這個格式無法轉換為時間戳,所以還需要將中間的 / 替換為空格
actualtime=${a/\// } ----結果 2018-12-28 15:30:57
然后轉換為時間戳
date -d "$actualtime" +%s ------結果 1545961368
注冊時間戳是日志的最后10位,再次進行截取
timestamp=${line:0-10} ----結果是1545982248
下面只對比二者之間的差距,以新用戶為例,是期望注冊時間是4天以內的,即時間戳相差 345600
期望請求的時間戳,比注冊時間+345600 的結果要小,如果請求的時間戳比它大,那么就是錯誤的情況,最終邏輯如下:
a=$((timestamp+345600))
if [ $time -gt $a ];
then
echo "error"
echo $line
fi;
done
以上,所有為一次簡單的日志分析實踐。
總結
以上是生活随笔為你收集整理的linux 脚本详解,shell脚本分析日志的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux c++ 函数 查看,在C++
- 下一篇: linux 路径名长度限制,linux下