日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

日志处理中一些shell命令技巧

發布時間:2023/12/10 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 日志处理中一些shell命令技巧 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

日志處理中一些shell命令技巧

陰差陽錯的做的日志分析,前途未卜的這段日子,唯一還有點意思的可能就是手動的處理大量日志。總結一下。

日志文件的輸入是動則幾個G的文本。從N個這樣的文件中得到一個列表,一個數字,一個比例。在什么工具都沒有情況下,用shell命令不僅是驗證系統數據的準確性的方法,也是一個很好的學習過程。

使用cut命令切割日志行

下面的一行典型的apache訪問日志:

120.51.133.125 - - [26/Apr/2013:12:20:06 +0800] "GET /skins/skin_homepage.php?display=wvga&lang=ja_JP&pixel=720X1280&density=2.0&version=5.7&key=5146f54950f09f71750005ef&uid=1 HTTP/1.1" 200 4847 "http://t.co/rww3WDuhS5" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; YTB730)" 0

如果需要得到IP地址可以使用cut命令

cat log | cut -d ' ' -f1

-d ' '表示按照空格將行切開,-f1?取第一個字段,這樣得到的結果就是IP列表

有時候拿到的文件是\t分隔,也可以使用cut切開,只不過需要多寫一個$

[l]$ cat log | cut -d '\t' -f1 cut: the delimiter must be a single character #-d '\t'會報錯的 cut -f2 -d$'\t' infile #work

使用tr命令去掉字符,替換字符

-c:complement,用SET2替換SET1中沒有包含的字符
-d:delete,刪除SET1中所有的字符,不轉換
-s: squeeze-repeats,壓縮SET1中重復的字符
-t: truncate-set1,將SET1用SET2轉換,一般缺省為-t

如果拿到分割的文件

cat log | tr -s ' ' ','

zzx@zzx103:~/dhcptest$ echo "aaacccddd ss " | tr -s [a-c] ? # -s
acddd ss

zzx@zzx103:~/dhcptest$ echo "aaacccddd ?ss " | tr -s " " "," ?#d和s之間有2個空格,替換后壓縮重復
aaacccddd,ss,

zzx@zzx103:~/dhcptest$ echo "aaacccddd ?ss " | tr -t " " ","
aaacccddd,,ss,

zzx@zzx103:~/dhcptest$ echo "aaacccddd ?ss " | tr -s "a" "b" #替換后壓縮重復
bcccddd ss

將空格替換成,文件變成csv

cat log | tr -d ' '

上面的命令直接刪除空格 ??

日志處理后經常會出現空行,tr命令去掉空行的原理就是將連續兩個換行替換成一個換行

cat log | tr -s '\n\n' '\n'

使用uniq命令去重

試想得到IP列表,欲得到獨立訪問的IP列表。

[l]$ cat log | cut -d ' ' -f1 | uniq -u

如果不僅僅是去重,還想統計每個IP訪問次數,可以加一個參數c

[l]$ cat log | cut -d ' ' -f1 | uniq -uc

得到的格式形如:

1 126.193.38.128 5 49.98.156.154

前面的數字就是出現的次數

使用awk/seed來處理日志

awk/seed是處理日志的最終的萬金油。確實是什么都可以做。awk/seed是一門很大的學問。這里取我碰到的一個日志,日志格式形如:

display=wvga|||lang=ja_JP|||isActive=1|||pixel=720X1280|||density=2.0|||version=5.7|||key=5146f54950f09f71750005ef|||out=abc'3|||uid=1

如果我需要得到isActive=1的日志行,取到out=中'前一段,如上面的abc。

cat l | grep "isActive=1|" | awk 'match($0,/out=[^\x27]+/){print substr($0,RSTART+4,RLENGTH-4)}'

grep的功能是篩選isActive=1的行。awk 后面跟''的是awk語言。$0總是代表當前匹配的字段值,match substr是awk可以用的函數,當match時后面{}中的代碼才會執行。當match,$0就是正則匹配的部分。RSTART,RLENGTH是awk可以使用的常量,分別表示開始匹配的開始下標,RLENGTH是匹配的長度。

在''中需要再使用'光轉義是不行的,得用16進制的代碼\x27。轉16進制可以使用python代碼?"'".encode("hex")得到

//驚訝awk就這么簡單的解釋了,可這連入門都算不上。

集合操作

試想我想得到兩個列表的交際,并集,差集,統計中經常會碰到,比如我想獲得昨天今天都在訪問的IP,其實就是今天的IP列表和昨天IP列表的交集。

先定義兩個簡單的文件:

[ l]$ cat a.txt 1 2 3 4 5 [ l]$ cat b.txt 4 5 6 7 8 9

如果想得到ab的交集4 5 ,可以使用下面的命令:

sort -m a.txt b.txt | uniq -d 4 5

如果要得到并集1-9,可以:

sort -m a.txt b.txt | uniq 1 2 3 4 5 6 7 8 9

如果想得到ab的差集,即a去掉ab的交集1 2 3

comm -23 a.txt b.txt 1 2 3

同理:ba的差集:

comm -13 a.txt b.txt comm -23 b.txt a.txt

上述兩個命令等價

comm命令就是compare功能,如果什么參數都不帶呢得到的什么呢?

comm a.txt b.txt 1 2 3 4 5 6 7 8 9

diff命令以前經常看代碼改了哪些:

diff a.txt b.txt 1,3d0 < 1 < 2 < 3 5a3,6 > 6 > 7 > 8 > 9

總結&&參考資料

竊以為能玩轉上面這些命令,處理個日志問題不大了。

一篇介紹shell中集合操作的博文:

http://wordaligned.org/articles/shell-script-sets

一直放在收藏夾的shell方面的博客:

Linux Shell常用技巧

Linux Shell高級技巧?awk部分寫的獨好

轉載于:https://www.cnblogs.com/hanxing/p/4113554.html

總結

以上是生活随笔為你收集整理的日志处理中一些shell命令技巧的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。