天天看點

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為空格           

繼續閱讀