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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

我试了试用 SQL查 Linux日志,好用到飞起

發(fā)布時間:2025/3/16 linux 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 我试了试用 SQL查 Linux日志,好用到飞起 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近發(fā)現(xiàn)點好玩的工具,迫不及待的想跟大家分享一下。

大家平時都怎么查Linux日志呢?像我平時會用tail、head、cat、sed、more、less這些經(jīng)典系統(tǒng)命令,或者awk這類三方數(shù)據(jù)過濾工具,配合起來查詢效率很高。但在使用過程中有一點讓我比較頭疼,那就是命令參數(shù)規(guī)則太多了,記的人腦殼疼。

那查日志有沒有一種通用的方式,比如用SQL查詢,畢竟這是程序員都比較熟悉的表達式。

今天分享的工具q,就實現(xiàn)了以寫SQL的方式來查詢、統(tǒng)計文本內(nèi)容,一起看看這貨到底有什么神奇之處。

搭個環(huán)境

q是一個命令行工具,允許我們在任意文件或者查詢結果,比如可以在ps -ef查詢進程命令的結果集上,直接執(zhí)行SQL語句查詢。

宗旨就是文本即數(shù)據(jù)庫表,額~,當然這句話是我自己理解的,哈哈哈

它將普通文件或者結果集當作數(shù)據(jù)庫表,幾乎支持所有的SQL結構,如WHERE、GROUP BY、JOINS等,支持自動列名和列類型檢測支持跨文件連接查詢,這兩個后邊詳細介紹,支持多種編碼。

安裝比較簡單,在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語法,標準命令行格式q + 參數(shù)命令 + "SQL"

q?<命令>?"<SQL>"

我要查詢myfile.log文件的內(nèi)容,直接q "SELECT * FROM myfile.log"。

q?"SELECT?*?FROM?myfile.log"

q不附加參數(shù)使用是完全沒有問題的,但利用參數(shù)會讓顯示結果更加美觀,所以這里簡單了解一下,它的參數(shù)分為 2種。

input輸入命令:指的是對要查詢的文件或結果集進行操作,比如:-H命令,表示輸入的數(shù)據(jù)包含標題行。

q?-H?"SELECT?*?FROM?myfile.log"

在這種情況下,將自動檢測列名,并可在查詢語句中使用。如果未提供此選項,則列將自動命名為cX,以c1起始以此類推。

q??"select?c1,c2?from?..."
  • output輸出命令:作用在查詢輸出的結果集,比如:-O,讓查詢出來的結果顯示列名。

[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ù)就不一一列舉了,感興趣的同學在官網(wǎng)上看下,接下來我們重點演示一下使用SQL如何應對各種查詢?nèi)罩镜膱鼍啊?/p>

玩法賊多

下邊咱們一起看幾個查詢?nèi)罩镜慕?jīng)常場景中,這個SQL該如何寫。

1、關鍵字查詢

關鍵字檢索,應該是日常開發(fā)使用最頻繁的操作,不過我個人認為這一點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.log? abc 2 3 4 5 23 24 25 [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? 2 23 24 25

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.log? abc 2 3 4 5 [root@iZ2zebfzaequ90bdlz820sZ?software]#?cat?test1.log? abc 3 4 5 6 [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? 2 3 4 5 6

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)命令查詢結果,計算/tmp目錄中每個用戶和組的總值。可以對字段進行運算處理。

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命令就相當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ū)別就是否顯示查詢結果的標題。

8,連文件查

一般情況下,我們的日志文件會按天分割成很多個固定容量的子文件,在沒有統(tǒng)一的日志收集服務器的情況下,如果不給個報錯時間區(qū)間去查一個關鍵詞,那么無異于大海撈針。

如果可以將所有文件內(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'"

總結

看完可能會有人抬杠:q寫這么多代碼直接用awk不香嗎?額~ 介紹這個工具的初衷并不是說要替換現(xiàn)有哪種工具,而是多提供一種更為便捷的查日志方法。

我也有在用awk確實很強大沒得說,但這里邊涉及到一個學習成本的問題,琳瑯滿目的命令、匹配規(guī)則想玩轉(zhuǎn)還是要下點功夫的。而對于新手程序員稍微有點數(shù)據(jù)庫經(jīng)驗,寫SQL問題都不大,上手q則會容易的多。

有道無術,術可成;有術無道,止于術

歡迎大家關注Java之道公眾號

好文章,我在看??

總結

以上是生活随笔為你收集整理的我试了试用 SQL查 Linux日志,好用到飞起的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。