Linux下日志文本筛选技巧

1.从全量日志中截断部分日志

#1.截取末尾10000行
tail -1000 /data/logs/hadoop/hadoop-zkfc.log > cut1w.log
#2.按照时间范围截取日志
sed -n '/2020-08-09 01:59/,/2020-08-09 11:14:24/p' hadoop.log > cut10h.log
#3.搜索关键字截取日志
tail -10000 /data/logs/hadoop/hadoop-zkfc.log | grep SERVICE_NOT_RESPONDING > cutservice.log
#4.正则匹配截取超过5000ms的rpc日志
cat hadoop-zkfc.log* | grep 'took 5[0-9][0-9][0-9] milliseconds' > nnSlowRpc5s.log
#5.正则匹配多个字符串
grep -E "varchar|Slow RPC" tempsql.sql >nnSlowRpc5s.log
#6.指定打印3-6行
 sed -n '3,10p' hadoop-zkfc.log //打印3~10行

2.sed列式选择筛选日志
如下csv文件内容:
"1234","jd_newmember","awktest-jDGoWzFjnfhryGX5AepcE","0.9999"
"1234","jd_newmember","awktest-jD5koAx9Jl8R-4SexpcrM","0.9999"
"1234","jd_newmember","awktest-Du5bjYaSN6TrxOIgfpw0","0.9999"
"1234","jd_newmember","awktest-jDoV83iydyKjTtPNgaCYM","0.9999"
"1234","jd_newmember","awktest-jDlN4vlz-mOzfDlr4pae4","0.9999"
需要选择出第三列,常规方法可以使用xls,选择第三列,然后批量替换掉双引号,用awk可以一次性完成。对于规律的用逗号分隔的可以用xls筛选列,当分隔符不规律时awk的强大就体现出来了,可以FS指定任意的分隔符。

#FS指分隔符 "," , $3是打印按照分隔符\",\"的第三列
awk 'BEGIN {FS="\",\""} {print $3}' test_JDnewmember.csv > jd_filter.csv

3.more、less日志翻页搜索

在简单的翻看Linux上的日志时也可以用more、less,翻页是Ctrl+f,前一页是Ctrl+b,搜索用斜杠/,跳转到下一个是n,基本上指令与vim的一致。

more hadoop.log

4.替换内容

#1.替换行尾1个以上的空格
[ ^t]+$
#0.匹配1个或者多个空格
[ ^]+
#1.替换行尾1个以上的空格
[ ^]+$
#2.行首多个空格
^[ ^]+
#3.替换换行符和回车符,可以使用notepad++的“扩展”,常见的Windows换行是由回车符合换行符一起组成 \r\n,Linux默认是\n,Mac默认是\r。
\r\n
#4.匹配包含字符串“MemberLatestSmsTime”的整行。
^.*MemberLatestSmsTime.*$
#匹配连续数字+多个字符到行尾,'[0-9]+':多个连续数字,'.*':多个字符,'$':行尾。“eventHdfsBolt-30-36-1572491424981.txt 8144 bytes, 1 block(s),”
[0-9]+ bytes.*$
#当文件比较大,只能在Linux上面处理时可以用sed来批量替换
sed 's/long/field/g' select* > selectAll.xml //替换字符long为field 
sed 's/tmp/UPDATE tasks/g' temp3.sql > temp4.sql //替换字符tmp为目标字符  
sed 's/^/Head/g' temp3.sql > temp5.sql //添加到行首  
sed 's/$/&TAIL/g' test.file //添加到行尾  
sed 's/`//1' temp08-final.sql > temp09-update.sql #替换第一个匹配的字符  
awk 'BEGIN{OFS=" "}{print $1,$2,$3,$4,$4 }' temp05.sql //指定输出域符号OFS为空格
上一篇:使用ab和wrk对OSS进行benchmark测试


下一篇:张潼:互联网大数据发展趋势