1. 程式人生 > >grep命令引數列表過長?我們還有find、xargs和grep

grep命令引數列表過長?我們還有find、xargs和grep

一、問題

撈取當前目錄中指定子目錄下指定伺服器指定時間範圍內所有包含有“功勳獲取”的日誌內容

1、指定子目錄

1.2.3.25 .... 1.2.3.83

2、指定伺服器

該伺服器的日誌的檔名格式為: sceneserver.log.(年的後兩位,兩位數)(月份,不夠用0補,兩位數)(日,不夠用0補,兩位數)-(小時,不夠用0補,兩位數)
如2014年1月22號16點的日誌檔名為:sceneserver.log.140122-16

3、指定時間範圍

從2014年10月22到2014年12月9號

二、grep的無奈

毋庸置疑,直接想到的肯定是強大的grep,寫出命令:
grep '功勳獲取' 1.2.3.{2[5-9],[3-7][0-9],8[0-3]}/sceneserver.log.14{10{2[2-9],3},11,120[1-9]}* > tmp.log

不一會結果就出來了。提示:
提示:命令引數列表過長
(後來發現匹配的檔案有接近3w個) 好了,那麼問題來了: 除了grep外,還有那些linux命令是支援正則表達的搜尋檔案的?

三、強大的組合

找檔案肯定就是find命令了,man一下,發現find其實是支援正則表示式的。命令:
find . -regextype "egrep" -regex "\./1\.2\.3\.(2[5-9]|[3-7][0-9]|8[0-3])/sceneserver\.log\.14(10(2[2-9]|3)|11|120[1-9]).*" -print0 | xargs -0 grep '功勳獲取' >> tmp.log
需要注意的地方有: 1、注意find命令引數中-print和-print0的區別、以及xargs引數有-0引數和沒有-0引數的區別 2、可以使用下面的命令檢視匹配的檔案有多少個
find . -regextype "egrep" -regex "\./1\.2\.3\.(2[5-9]|[3-7][0-9]|8[0-3])/sceneserver\.log\.14(10(2[2-9]|3)|11|120[1-9]).*" -print | wc -l