標簽:Linux
腳本編程, 系統運維, 經驗雜筆Linux grep正則表達式的用法,學好即可旁通其他語言正則表達式
先森培訓紅帽Linux之前,得知要也會教正則表達式,先森是感到非常高興的。因為在先森的印象中,正則表達式是非常難懂難學的,既然有教,一定要學好。本來已經做好面對困難的決心,直到老師教grep正則表達式的時候才發現,原來這么簡單。而且老師也說了,只要學會了用grep正則表達式,學習java等其他語言的正則表達式也就簡單了。redhat linux grep下面先森對自己的學習做一個總結,畢竟代碼總是易忘的。本文敘述的是用grep來使用正則表達式,實際上Linux使用正則表達式的命令工具不止于此。Linux grep命令grep是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。grep很有使用價值,先森在學習之后就在《用Linux分析日志查看產生大量404的IP》一文中有過應用。grep按下述方式接受選項和參數:grep [options] regex [files]其中options是以下的選項,regex是正則表達式,files是需要進行搜索的文本文件。gerp支持的選項如下:-a 不要忽略二進制數據。-A<顯示列數> 除了顯示符合范本樣式的那一行之外,并顯示該行之后的內容。-b 在顯示符合范本樣式的那一行之外,并顯示該行之前的內容。-c 計算符合范本樣式的列數。-C<顯示列數>或-<顯示列數> 除了顯示符合范本樣式的那一列之外,并顯示該列之前后的內容。-d<進行動作> 當指定要查找的是目錄而非文件時,必須使用這項參數,否則grep命令將回報信息并停止動作。-e<范本樣式> 指定字符串作為查找文件內容的范本樣式。-E 將范本樣式為延伸的普通表示法來使用,意味著使用能使用擴展正則表達式。-f<范本文件> 指定范本文件,其內容有一個或多個范本樣式,讓grep查找符合范本條件的文件內容,格式為每一列的范本樣式。-F 將范本樣式視為固定字符串的列表。-G 將范本樣式視為普通的表示法來使用。-h 在顯示符合范本樣式的那一列之前,不標示該列所屬的文件名稱。-H 在顯示符合范本樣式的那一列之前,標示該列的文件名稱。-i 忽略字符大小寫的差別。 -l 列出文件內容符合指定的范本樣式的文件名稱。-L 列出文件內容不符合指定的范本樣式的文件名稱。-n 在顯示符合范本樣式的那一列之前,標示出該列的編號。-q 不顯示任何信息。-R/-r 此參數的效果和指定“-d recurse”參數相同。-s 不顯示錯誤信息。-v 反轉查找。-w 只顯示全字符合的列。-x 只顯示全列符合的列。-y 此參數效果跟“-i”相同。-o 只輸出文件中匹配到的部分。--color:以特定顏色高亮顯示匹配關鍵字--color選項可以讓搜索匹配結果高亮,是個很有用的選項。需要注意的是,grep命令使用正則表達式分為基本正則表達式和擴展正則表達式。我們一般使用"grep -E"或者"egrep"來使用擴展正則表達式。擴展正則表達式的功能更加強大。命令中加入正則表達式時,最好使用引號將表達式括起來,以避免shell的元字符對正則表達式的影響。基本正則表達式正則表達式的學習,主要就是對各種字符的作用進行學習,使用中則主要是將各種功能的字符進行組合,以達到我們的目標匹配。雖然grep正則表達式分為基本正則表達式和擴展表達式,但基本表達式已經能滿足我們的基本需求了。下面來介紹一下各種正則表達式字符:符號含義舉例^開始標記"^abc"滿足的例子abc、abcd^非(在[]內)"[^abc]"滿足的例子:ddd、mpd$結束標記"abc$"滿足的例子abc、mmabc\<匹配單詞開始"\<abc"滿足的例子abc、abcd\>匹配單詞結束"abc\>"滿足的例子abc、pmrabc.任意一個字符"a.c"滿足的例子abc、fapcc*匹配前一個字符≥0次"abc*"滿足的例子abbb(c出現0次)、abcdk\轉義字符"\."滿足的例子192.168[]匹配一系列字符中的一個"[abc]"滿足的例子any、boy、ico-連字符,用在[]中,規定匹配范圍[a-z]匹配小寫字母,[0-9]匹配數字,[0-9a-zA-Z]匹配數字與字母{}{m}、{m,n}、{m,}、{,n}分別為匹配前一個字符m次、m到n次、≥m次、≤n次"abc\{3,5\}"滿足的例子abcccc、abcccccc注意,由于{ }在SHELL中有特殊意義,因此作為正則表達式用的時候要用\轉義一下(若用egrep則不轉義)。 擴展正則表達式grep一般情況下支持基本正則表達式,可以通過參數-E支持擴展正則表達式。所以grep單獨提供了一個擴展命令叫做egrep用來支持擴展正則表達式,這條命令和grep -E等價。雖然一般情況下,基本正則表達式就夠用了。特殊情況下,復雜的擴展表達式,可以簡化字符串的匹配。擴展正則表達式就是在基本正則表達式的基礎上,增加了一些匹配字符。符號含義舉例+匹配前一個字符≥1次"abc+"滿足的例子abcd、abcccdd?匹配前一個字符0或1次"abc?"滿足的例子ab、mabcd|或"AAA|BBB"滿足的例子AAA、BBBpp()匹配整個括號內的字符串(原來都是匹配單個字符)"g(oo|la)d"滿足的例子good、glad()反向引用,最多使用9次,用\*調用(*代表1-9),以左括號確定編號"([a-z]+)([0-9]+)\1\2\1"(\1引用第一個括號內的匹配結果,\2引用第二個括號的匹配結果)滿足的例子abc12abc12abc、a1a1a(注:a1a2c則不滿足)最后相對而言,grep正則表達式還是非常簡單的。需要注意的是,花括號{}在grep中使用需要加反斜杠\轉義,而在grep -E或egrep中則不用轉義。
系統運維, 經驗雜筆用Linux分析日志查看產生大量404的IP
先森網站被阿里云通知超標消耗資源的時候查看網站的日志,發現有幾個IP一直在訪問一個不存在的目錄,產生了大量的404。查了半天沒有查出這些IP與先森使用的CDN等服務有關,看來不是什么好貨了,趕緊用.htaccess屏蔽IP。但是有個問題,日志文件是以行為記錄,一行對應一個請求,一個日志經常成千上萬行,光靠眼睛看不能準確的識別出這些做壞的IP到底有哪些。先森一直在找有沒有能直接分析出來的日志分析工具,但搜到的都是針對搜索引擎蜘蛛痕跡做分析的,只得作罷。近期先森在培訓紅帽Linux,經過學習,發覺Linux確實強大。而老師今天教了正則表達式,再加上以前教的各類命令,發現其實用Linux就能很好的做日志分析了。下面來分享下相關經驗。linux命令首先,查看日志,分析需要篩選的內容。先森貼出其中404的一例:60.191.139.121 - - [09/May/2016:00:33:32 +0800] "GET /_detect HTTP/1.0" 404 209 "-" "-" qxu123456789.my3w.com text/html "/usr/home/qxu123456789/htdocs/_detect" 1048需要注意的是,每行的狀態碼前后是有一個空格的,這個可以用來區分正常訪問中單純的404數字。命令方面其實很簡單,一句搞定:# cat web.log| grep -E ' 404 '|awk '{print $1}'|sort |uniq先森的日志回車后,最終顯示了下面三個IP:222.73.199.10560.191.139.12161.160.245.190這樣就確認了有哪些IP在對網站造成404訪問了,這時候用.htaccess將其屏蔽即可。如果不會,可以參考先森這篇文章:虛擬主機屏蔽IP地址或IP段的方法下面對上面的代碼做些解釋。cat是將web.log的內容作為標準輸出到設備,也就是查看文件內容。|是管道符,將左邊的輸出連接到右邊的輸入,也就是把日志內容傳給下一條命令。gerp -E,相當于egerp,后面跟的是正則表達式,這里我們查找的內容比較簡單,所以暫時不用正則表達式。這條命令用來篩選出有404的行。awk是做數據處理的,是一種編程語言,功能很強大。它可以用-F確定分隔符,默認是空格,這也真是我們需要的。以空格為分隔符,將每行分成了很多段,而后面的printf $1就是輸出第一段,也就是我們的IP地址。sort是排序,這里就是對我們的IP地址進行排序。uniq是去重,也就是將重復的IP地址去除,留下我們想要屏蔽的IP地址。一些延伸上面僅僅是找出404訪問IP,實際上我們可能有這種需求:找去所有的40X的訪問IP,修改上面的一個字符即可實現:# cat web.log| grep -E ' 40. '|awk '{print $1}'|sort |uniq.點符號在Linux正則表達式中是占位符,表示任意的一個字符。有了上面的這種需求,可能我們除了想看IP地址,還想知道它的狀態碼是多少,再修改一下就好:# cat web.log| grep -E ' 40. '|awk '{print $1,$9}'|sort |uniq上面在awk的輸出增加了一個$9,表示已空格作為分隔的第九段。其實想看什么數據,只要以空格為界,數出其所在段位即可。但需要注意的是,時間段不要用來數出,這樣會導致后面的去重沒有什么效果,因為時間都是不同的。Linux操作最后不得不說Linux確實強大,但是它的英文也讓先森很吃不消啊。希望能夠學好,向著運維的方向越走越遠。
系統運維, 經驗雜筆虛擬主機屏蔽IP地址或IP段的方法
先森前兩天內連收三封阿里云計算發的主機產品因超標消耗資源關停通知,心都要碎了,要知道萬網免費云虛擬主機每個月只能手動重啟3次啊。先森這時候已經重啟了兩次了,而且是月初。主機產品因超標消耗資源關停通知分析通過查看日志,雖然疑似是wp-cron.php的問題,但是同時也發現了幾個比較可疑的IP地址,不停的訪問先森網站上不存在的目錄地址,造成大量的404訪問。先森開始嘗試著使用百度云加速的WAF黑名單來防止這幾個IP,但是實踐證明并沒有用,可能是黑客用某種手段還是捕捉到了先森網站的真實IP,直接進行訪問的。既然如此,就只有從主機方面下手了。屏蔽IP雖然是虛擬主機,但還好的是,我們也有屏蔽IP訪問的手段。因為WordPress是PHP語言編寫的,所以先森當初也選擇的是Linux主機,所以這里也是針對Linux主機的方法。Linux主機可以通過 .htaccess文件屏蔽IP。如下:RewriteEngine onRewriteBase /Order Deny,Allow #拒絕開關,allow表示拒絕訪問Deny from 123.245.123.12 #輸入要屏蔽的IP地址Deny from 123.245.123 # 屏蔽IP段關于wp-cron.php因為wp-cron.php而導致的超標消耗系統資源,先森還是感到很納悶的。看了下以前的日志,也存在很多wp-cron.php的痕跡,但是一直都沒有什么問題,突然來個超標,令先森不明所以。當然,wp-cron.php確實是比較消耗系統資源的,這點是比較肯定的。但wp-con.php是當網站批量更新,定時發布,還有用戶點擊才會觸發。一般受影響的是流量多的大站,先森是的流量可沒有多少。不過再沒有找到原因之前,還是只有把它先禁用了。在wp-config.php中添加如下代碼:define('DISABLE_WP_CRON', true);

川公網安備 51011202000104號