新聞中心
SQL是一種特殊目的的編程語言,是一種數(shù)據(jù)庫查詢和程序設(shè)計語言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫系統(tǒng),本篇文章將使用SQL查詢 Linux日志,下面一起來看一下具體操作方法。

成都創(chuàng)新互聯(lián)公司專注于武鄉(xiāng)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供武鄉(xiāng)營銷型網(wǎng)站建設(shè),武鄉(xiāng)網(wǎng)站制作、武鄉(xiāng)網(wǎng)頁設(shè)計、武鄉(xiāng)網(wǎng)站官網(wǎng)定制、微信平臺小程序開發(fā)服務(wù),打造武鄉(xiāng)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供武鄉(xiāng)網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
搭個環(huán)境
q是一個命令行工具,允許我們在任意文件或者查詢結(jié)果,比如可以在ps -ef查詢進程命令的結(jié)果集上,直接執(zhí)行SQL語句查詢。
宗旨就是文本即數(shù)據(jù)庫表,額~,當(dāng)然這句話是我自己理解的,哈哈哈
它將普通文件或者結(jié)果集當(dāng)作數(shù)據(jù)庫表,幾乎支持所有的SQL結(jié)構(gòu),如WHERE、GROUP BY、JOINS等,支持自動列名和列類型檢測,支持跨文件連接查詢,這兩個后邊詳細(xì)介紹,支持多種編碼。
安裝比較簡單,在Linux CentOS環(huán)境,只要如下三步搞定,Windows環(huán)境更是只需安裝個exe就可以用了。
wget https://github.com/harelba/q/releases/download/1.7.1/q-text-as-data-1.7.1-1.noarch.rpm #下載版本
sudo rpm -ivh q-text-as-data-1.7.1-1.noarch.rpm # 安裝
q --version #查看安裝版本
“官方文檔:https://harelba.github.io/q
語法
q支持所有SQLiteSQL語法,標(biāo)準(zhǔn)命令行格式q + 參數(shù)命令 + “SQL”
q ""
我要查詢myfile.log文件的內(nèi)容,直接q “SELECT * FROM myfile.log”。
q "SELECT * FROM myfile.log"
q不附加參數(shù)使用是完全沒有問題的,但利用參數(shù)會讓顯示結(jié)果更加美觀,所以這里簡單了解一下,它的參數(shù)分為 2種。
input輸入命令:指的是對要查詢的文件或結(jié)果集進行操作,比如:-H命令,表示輸入的數(shù)據(jù)包含標(biāo)題行。
q -H "SELECT * FROM myfile.log"
在這種情況下,將自動檢測列名,并可在查詢語句中使用。如果未提供此選項,則列將自動命名為cX,以c1起始以此類推。
q "select c1,c2 from ..."
output輸出命令:作用在查詢輸出的結(jié)果集,比如:-O,讓查詢出來的結(jié)果顯示列名。
[root@iZ2zebfzaequ90bdlz820sZ software]# ps -ef | q -H "select count(UID) from - where UID='root'"
104
[root@iZ2zebfzaequ90bdlz820sZ software]# ps -ef | q -H -O "select count(UID) from - where UID='root'"
count(UID)
104
還有很多參數(shù)就不一一列舉了,感興趣的同學(xué)在官網(wǎng)上看下,接下來我們重點演示一下使用SQL如何應(yīng)對各種查詢?nèi)罩镜膱鼍?。圖片
玩法賊多
下邊咱們一起看幾個查詢?nèi)罩镜慕?jīng)常場景中,這個SQL該如何寫。
1、關(guān)鍵字查詢
關(guān)鍵字檢索,應(yīng)該是日常開發(fā)使用最頻繁的操作,不過我個人認(rèn)為這一點q并沒有什么優(yōu)勢,因為它查詢時必須指定某一列。
[root@iZ2zebfzaequ90bdlz820sZ software]# q "select * from douyin.log where c9 like '%待解析%'"
2021-06-11 14:46:49.323 INFO 22790 --- [nio-8888-exec-2] c.x.douyin.controller.ParserController : 待解析URL :url=https%3A%2F%2Fv.douyin.com%2Fe9g9uJ6%2F
2021-06-11 14:57:31.938 INFO 22790 --- [nio-8888-exec-5] c.x.douyin.controller.ParserController : 待解析URL :url=https%3A%2F%2Fv.douyin.com%2Fe9pdhGP%2F
2021-06-11 15:23:48.004 INFO 22790 --- [nio-8888-exec-2] c.x.douyin.controller.ParserController : 待解析URL :url=https%3A%2F%2Fv.douyin.com%2Fe9pQjBR%2F
2021-06-11 2
而用grep命令則是全文檢索。
[root@iZ2zebfzaequ90bdlz820sZ software]# cat douyin.log | grep '待解析URL'
2021-06-11 14:46:49.323 INFO 22790 --- [nio-8888-exec-2] c.x.douyin.controller.ParserController : 待解析URL :url=https%3A%2F%2Fv.douyin.com%2Fe9g9uJ6%2F
2021-06-11 14:57:31.938 INFO 22790 --- [nio-8888-exec-5] c.x.douyin.controller.ParserController : 待解析URL :url=https%3A%2F%2Fv.douyin.com%2Fe9pdhGP%2F
2、模糊查詢
like模糊搜索,如果文本內(nèi)容列有名字直接用列名檢索,沒有則直接根據(jù)列號c1、c2、cN。
[root@iZ2zebfzaequ90bdlz820sZ software]# cat test.logabc2345232425[root@iZ2zebfzaequ90bdlz820sZ software]# q -H -t "select * from test.log where abc like '%2%'"Warning: column count is one - did you provide the correct delimiter?2232425
3、交集并集
支持UNION和UNION ALL操作符對多個文件取交集或者并集。
如下建了test.log和test1.log兩個文件,里邊的內(nèi)容有重疊,用union進行去重。
q -H -t "select * from test.log union select * from test1.log"[root@iZ2zebfzaequ90bdlz820sZ software]# cat test.logabc2345[root@iZ2zebfzaequ90bdlz820sZ software]# cat test1.logabc3456[root@iZ2zebfzaequ90bdlz820sZ software]# q -H -t "select * from test.log union select * from test1.log"Warning: column count is one - did you provide the correct delimiter?Warning: column count is one - did you provide the correct delimiter?23456
4、內(nèi)容去重
比如統(tǒng)計某個路徑下的./clicks.csv文件中,uuid字段去重后出現(xiàn)的總個數(shù)。
q -H -t "SELECT COUNT(DISTINCT(uuid)) FROM ./clicks.csv"
5、列類型自動檢測
注意:q會理解每列是數(shù)字還是字符串,判斷是根據(jù)實數(shù)值比較,還是字符串比較進行過濾,這里會用到-t命令。
q -H -t "SELECT request_id,score FROM ./clicks.csv WHERE score > 0.7 ORDER BY score DESC LIMIT 5"
6、字段運算
讀取系統(tǒng)命令查詢結(jié)果,計算/tmp目錄中每個用戶和組的總值??梢詫ψ侄芜M行運算處理。
sudo find /tmp -ls | q "SELECT c5,c6,sum(c7)/1024.0/1024 AS total FROM - GROUP BY c5,c6 ORDER BY total desc"
[root@iZ2zebfzaequ90bdlz820sZ software]# sudo find /tmp -ls | q "SELECT c5,c6,sum(c7)/1024.0/1024 AS total FROM - GROUP BY c5,c6 ORDER BY total desc"
www www 8.86311340332
root root 0.207922935486
mysql mysql 4.76837158203e-06
7、數(shù)據(jù)統(tǒng)計
統(tǒng)計系統(tǒng)擁有最多進程數(shù)的前 3個用戶ID,按降序排序,這就需要和系統(tǒng)命令配合使用了,先查詢所有進程再利用SQL篩選,這里的q命令就相當(dāng)grep命令。
ps -ef | q -H "SELECT UID,COUNT(*) cnt FROM - GROUP BY UID ORDER BY cnt DESC LIMIT 3"
[root@iZ2zebfzaequ90bdlz820sZ software]# ps -ef | q -H "SELECT UID,COUNT(*) cnt FROM - GROUP BY UID ORDER BY cnt DESC LIMIT 3"
root 104
www 16
rabbitmq 4
[root@iZ2zebfzaequ90bdlz820sZ software]# ps -ef | q -H -O "SELECT UID,COUNT(*) cnt FROM - GROUP BY UID ORDER BY cnt DESC LIMIT 3"
UID cnt
root 110
www 16
rabbitmq 4
我們看到加與不加-O命令的區(qū)別就是否顯示查詢結(jié)果的標(biāo)題。
8,連文件查
一般情況下,我們的日志文件會按天分割成很多個固定容量的子文件,在沒有統(tǒng)一的日志收集服務(wù)器的情況下,如果不給個報錯時間區(qū)間去查一個關(guān)鍵詞,那么無異于大海撈針。 圖片如果可以將所有文件內(nèi)容合并后在查就會省事很多,q支持將文件像數(shù)據(jù)庫表那樣聯(lián)合查詢。
q -H "select * from douyin.log a join douyin-2021-06-18.0.log b on (a.c2=b.c3) where b.c1='root'"
文章名稱:如何使用SQL查詢Linux日志
當(dāng)前URL:http://www.5511xx.com/article/djgpsjg.html


咨詢
建站咨詢
