<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          我試了試用SQL查L(zhǎng)inux日志,好用到飛起

          共 7400字,需瀏覽 15分鐘

           ·

          2021-07-10 01:46

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

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

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

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

          搭個(gè)環(huán)境

          q是一個(gè)命令行工具,允許我們?cè)?strong style="font-weight: border;color: #0e88eb;">任意文件或者查詢結(jié)果,比如可以在ps -ef查詢進(jìn)程命令的結(jié)果集上,直接執(zhí)行SQL語(yǔ)句查詢。

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

          它將普通文件或者結(jié)果集當(dāng)作數(shù)據(jù)庫(kù)表,幾乎支持所有的SQL結(jié)構(gòu),如WHEREGROUP BYJOINS等,支持自動(dòng)列名和列類型檢測(cè)支持跨文件連接查詢,這兩個(gè)后邊詳細(xì)介紹,支持多種編碼。

          安裝比較簡(jiǎn)單,在Linux CentOS環(huán)境,只要如下三步搞定,Windows環(huán)境更是只需安裝個(gè)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

          語(yǔ)法

          q支持所有SQLiteSQL語(yǔ)法,標(biāo)準(zhǔn)命令行格式q + 參數(shù)命令 + "SQL"

          q <命令> "<SQL>"

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

          q "SELECT * FROM myfile.log"

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

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

          q -H "SELECT * FROM myfile.log"

          在這種情況下,將自動(dòng)檢測(cè)列名,并可在查詢語(yǔ)句中使用。如果未提供此選項(xiàng),則列將自動(dòng)命名為cX,以c1起始以此類推。

          q  "select c1,c2 from ..."
          • output輸出命令:作用在查詢輸出的結(jié)果集,比如:-O,讓查詢出來(lái)的結(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)上看下,接下來(lái)我們重點(diǎn)演示一下使用SQL如何應(yīng)對(duì)各種查詢?nèi)罩镜膱?chǎng)景。

          玩法賊多

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

          1、關(guān)鍵字查詢

          關(guān)鍵字檢索,應(yīng)該是日常開(kāi)發(fā)使用最頻繁的操作,不過(guò)我個(gè)人認(rèn)為這一點(diǎn)q并沒(méi)有什么優(yōu)勢(shì),因?yàn)樗樵儠r(shí)必須指定某一列。

          [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)容列有名字直接用列名檢索,沒(méi)有則直接根據(jù)列號(hào)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、交集并集

          支持UNIONUNION ALL操作符對(duì)多個(gè)文件取交集或者并集。

          如下建了test.logtest1.log兩個(gè)文件,里邊的內(nèi)容有重疊,用union進(jìn)行去重。

          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)計(jì)某個(gè)路徑下的./clicks.csv文件中,uuid字段去重后出現(xiàn)的總個(gè)數(shù)。

          q -H -t "SELECT COUNT(DISTINCT(uuid)) FROM ./clicks.csv"

          5、列類型自動(dòng)檢測(cè)

          注意:q會(huì)理解每列是數(shù)字還是字符串,判斷是根據(jù)實(shí)數(shù)值比較,還是字符串比較進(jìn)行過(guò)濾,這里會(huì)用到-t命令。

          q -H -t "SELECT request_id,score FROM ./clicks.csv WHERE score > 0.7 ORDER BY score DESC LIMIT 5"

          6、字段運(yùn)算

          讀取系統(tǒng)命令查詢結(jié)果,計(jì)算/tmp目錄中每個(gè)用戶和組的總值。可以對(duì)字段進(jìn)行運(yùn)算處理。

          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)計(jì)

          統(tǒng)計(jì)系統(tǒng)擁有最多進(jìn)程數(shù)的前 3個(gè)用戶ID,按降序排序,這就需要和系統(tǒng)命令配合使用了,先查詢所有進(jìn)程再利用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,連文件查

          一般情況下,我們的日志文件會(huì)按天分割成很多個(gè)固定容量的子文件,在沒(méi)有統(tǒng)一的日志收集服務(wù)器的情況下,如果不給個(gè)報(bào)錯(cuò)時(shí)間區(qū)間去查一個(gè)關(guān)鍵詞,那么無(wú)異于大海撈針。如果可以將所有文件內(nèi)容合并后在查就會(huì)省事很多,q支持將文件像數(shù)據(jù)庫(kù)表那樣聯(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'"

          總結(jié)

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

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

          瀏覽 36
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色小视频在线免费 | 青青草免费在线观看 | 自拍偷拍成人视频 | 人人妻人人摸 | 狠狠狠狠狠狠狠狠狠狠 |