【Linux】linux中grep(過濾運行日誌)和find的正則用法

本人菜雞一隻,對於正則其實真是菜的摳腳!所以得趕緊記下來,不然下次又忘了!!

遇到了個場景,程序的運行日誌中,有部分信息我們是想要的,需要進行一些基礎的分析。

日誌拿到手上,裏面可能有上萬條日誌,但是我們只需要其中一部分。

處理方式有非常多

1、通過各種語言io流讀取日誌,判斷讀入的行中是否包含某些字段是我們需要的

2、把日誌加載到某些“容器”中,比如數據庫啊,es啊等等的,然後通過對應的語法,filter出我們想要的行!

 

但是,說實話,如果能不做任何處理(一般服務是部署在linux上,所以運行日誌也是在linux上的),直接通過linux命令行來處理是最方便的

3、linux命令行,來過濾我們想要的日誌

所以選擇使用grep命令

 

所以我先說grep命令幾個比較常用的參數

參數 註釋 用法
--color 匹配到的數據變紅 grep --color '要匹配的行的特徵'
-A 查看後幾行數據  查看匹配的行的後十行:grep -A 10 '要匹配的行的特徵'
-B 查看前幾行數據 用法和-A一樣
-i 無視大小寫 grep -i '要匹配的行的特徵'
-v 反選,不保留匹配到的數據 grep -v '要匹配的行的特徵'

其實grep是可以使用正則的匹配的,但是他當中的所有特殊符號都需要轉義!!!

看看一下的具體例子:

#查看日誌中,包含“表名:”或者“包含SQL:”的行!
cat 2019-02-22.log | grep  "^\(表名:\|SQL:\).*$" 

#查看日誌中,包含“表名:”或者“包含SQL:”的行!,但是還需要過濾掉select語句
cat 2019-02-22.log | grep  "^\(表名:\|SQL:\).*$" | grep -v -i 'select'

#查看日誌中,將這部分日誌追加到某個文件中
#如果是覆蓋,就使用 ">"
cat 2019-02-22.log | grep  "^\(表名:\|SQL:\).*$" | grep -v -i 'select' >> 20190222.log

4、另外我在說下find命令的一些東西

find命令的一些具體的用法,我就不說了,一般這個是在有些文件我們實在找不到的時候纔去使用的

-1.find正常用法

find 在哪個目錄中查找 拼接一些參數-name,-type,-size,-mtime... 加上匹配的內容

具體我就不展開了,因爲畢竟簡單網上也很多可以找到的,

例如:https://blog.51cto.com/13869554/2151557(作者:fengchen51)

這裏主要說說find怎麼使用正則來匹配查找的文件

-2.-name是不能寫正則來查找文件的!

因此如果要實現根據正則,查詢文件夾下的文件,就需要使用  -regex  ,也可以指定通過  -regextype 指定支持的正則類型

type: 如果不使用選項 -regextype "type", 則默認的正則表達式類型是emacs,使用該選項的話,type 類型包括 posix-awk, posix-basic, posix-egrep 和 posix-extended 四種,具體區別其實我也不太懂,正則確實在不同環境下會有細微的區別,大家使用前多測試下就好了

下面來說一個實例:

我想要查某個文件夾下修改時間一天以內,以abc爲開頭,以tar.gz或者zip結尾的文件,並且查詢出來排個序,因此如下

find 目標路徑 -regextype posix-extended -regex ".*?abc.*(zip|tar.gz)$" -mtime -1 | sort

!!注意:這裏使用正則千萬要注意!
find命令查詢出來是全路徑+文件名,所以正則匹配的時候要從路徑開始匹配

比如你查當前目錄的,匹配出來的文件是:

./abcxxxxxx.zip

./abcxxxxxx.zip

這時候如果你正則寫的是abc開頭,那這個數據你就永遠都匹配不到!!因爲數據是./開頭的!!

所以查詢的時候跟你輸入的目標路徑也是有關係的,請大家注意!!!!

 

這裏還是要提一句,不管什麼需求,都要儘量用最簡單的方式來做(不要搭上一大堆框架,因爲東西多了,不好開發,也不好維護,出了問題,也要一個框架一個框架查,很麻煩!!!!)

好了,所以很短的文章,記錄很簡單的問題!(這篇文章說不定會更新,記錄下linux其他的命令的問題)

我是菜雞,下次再見,拜拜~~!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章