當(dāng)前位置:首頁(yè) > IT技術(shù) > 系統(tǒng)服務(wù) > 正文

Linux下查看日志用到的常用命令
2022-02-14 14:03:26

作為一名后端程序員,和Linux打交道的地方很多,不會(huì)看Linux日志,非常容易受到來(lái)自同事和面試官的嘲諷,所以掌握一種或者幾種查看日志的方法非常重要。

Linux查看日志的命令有多種: tail、cat、tac、head、echo等,本文只介紹幾種常用的方法。

grep命令

Linux 文本操作的三大神器:grep、sed、awk。

各自的最佳應(yīng)用場(chǎng)景:

  • grep:使用正則表達(dá)式搜索文本,并把匹配的行打印出來(lái),是強(qiáng)大的文本搜索工具;
  • sed:用于編輯匹配到的文本,是一種流編輯器;
  • awk:能夠?qū)ξ谋具M(jìn)行復(fù)雜的格式處理,是一種處理文本的語(yǔ)言。

我們首先要學(xué)習(xí)grep命令。

命令功能

grep全稱是Global Regular Expression Print,表示全局正則表達(dá)式版本,它的使用權(quán)限是所有用戶。主要功能是在文件中查找/過(guò)濾所需要的內(nèi)容。

比如查看 ip 地址的命令:

ifconfig | grep inet

命令格式

格式:grep [option] pattern file

其中,option 是 grep 命令的參數(shù),pattern 是所需查找/過(guò)濾的內(nèi)容,file 是指定的文件。

命令參數(shù)

  • -A<顯示行數(shù)>:除了顯示匹配 pattern 的那一行外,顯示該行之后的內(nèi)容
  • -B<顯示行數(shù)>:除了顯示匹配 pattern 的那一行外,顯示該行之前的內(nèi)容
  • -C<顯示行數(shù)>:除了顯示匹配 pattern 的那一行外,顯示該行前、后的內(nèi)容
  • -c:統(tǒng)計(jì)匹配的行數(shù)
  • -e:同時(shí)匹配多個(gè)pattern
  • -i:忽略字符的大小寫(xiě)
  • -n:顯示匹配的行號(hào)
  • -o:只顯示匹配的字符串
  • -v:顯示沒(méi)有匹配pattern的那一行,相當(dāng)于反向匹配
  • -w:匹配整個(gè)單詞

grep應(yīng)用示例

比如有一個(gè)hello.txt,內(nèi)容如下:

aaa
bbb
ccc
aaaAAA
bbbBBB
cccCCC
helloworld
hello world

通過(guò)設(shè)定不同命令參數(shù)的示例如下:

同時(shí)匹配多個(gè)pattern(-e)和忽略大小寫(xiě)(-i)很方便查找:

顯示行號(hào)(-n)可以快速定位:

反向匹配(-v)也經(jīng)常用到:

常用的正則表達(dá)式

常用的正則表達(dá)式:

  • .:任意單個(gè)字符
  • *:任意字符多次
  • []:指定范圍,如[0-9]、[a-z]、[A-Z]、[0-9a-zA-Z]
  • ^:行首
  • $:行尾
  • ^$:空行

比如有一個(gè)hello.txt,內(nèi)容如下:

使用正則表達(dá)式的匹配示例:

常用語(yǔ)法總結(jié)

過(guò)濾以“abc”開(kāi)頭的行:grep "^abc"
過(guò)濾不包含"abc"的行:grep -v "abc"
過(guò)濾包含"abc"的行并查看最后兩行:grep "adb" | tail -n 2
過(guò)濾包含"abc"的行并查看最前面一行:grep -m 1  "adb"
過(guò)濾包含"abc"的行并查看第一項(xiàng)(和上面的區(qū)別是,如果如果第一行有多個(gè)匹配項(xiàng),上面會(huì)顯示整行,這里只會(huì)顯示第一行的第一項(xiàng)):grep -m 1  "adb"  |  head 1
過(guò)濾包含"abc"的行并顯示前面兩行和后面三行:grep -B2 -A3 "adb"
過(guò)濾包含"abc"的行并顯示前面兩行和后面兩行:grep -C2 "adb"

tail命令

命令格式:

tail [參數(shù)] [文件]  

參數(shù):

  • -f 循環(huán)讀取
  • -q 不顯示處理信息
  • -v 顯示詳細(xì)的處理信息
  • -c<數(shù)目> 顯示的字節(jié)數(shù)
  • -n<行數(shù)> 顯示行數(shù)
  • -q, --quiet, --silent 從不輸出給出文件名的首部
  • -s, --sleep-interval=S 與-f合用,表示在每次反復(fù)的間隔休眠S秒

用法如下:

tail -n 10 test.log 查詢?nèi)罩疚膊孔詈?0行的日志;
tail -n +10 test.log 查詢10行之后的所有日志;
tail -fn 1000 test.log 循環(huán)實(shí)時(shí)查看最后1000行記錄(最常用的)

一般還會(huì)配合著grep用,例如:

tail -fn 1000 test.log | grep '關(guān)鍵字'

如果一次性查詢的數(shù)據(jù)量太大,可以進(jìn)行翻頁(yè)查看,例如:

tail -n 4700 aa.log |more -1000 可以進(jìn)行多屏顯示(ctrl + f 或者 空格鍵可以快捷鍵)

head命令

跟tail是相反的head是看前多少行日志。

head -n 10 test.log 查詢?nèi)罩疚募械念^10行日志;
head -n -10 test.log 查詢?nèi)罩疚募俗詈?0行的其他所有日志;

head其他參數(shù)參考tail。

cat命令

cat 是由第一行到最后一行連續(xù)顯示在屏幕上。

一次顯示整個(gè)文件:

cat -n filename

從鍵盤(pán)創(chuàng)建一個(gè)文件:

cat > filename

將幾個(gè)文件合并為一個(gè)文件:

cat file1 file2 > file 只能創(chuàng)建新文件,不能編輯已有文件

將一個(gè)日志文件的內(nèi)容追加到另外一個(gè):

cat -n textfile1 > textfile2

清空一個(gè)日志文件:

cat : >textfile2

注意:> 意思是創(chuàng)建,>>是追加。千萬(wàn)不要弄混了。

cat也可以跟tail一樣使用grep進(jìn)行關(guān)鍵字的過(guò)濾。

如果需要實(shí)現(xiàn)多個(gè)關(guān)鍵字同時(shí)包含,可以進(jìn)行“與”操作,例如:

cat test.log| grep "abc" | grep "123"

如果需要打印出文件test.log中匹配包含“abc"或者包含"123"的行,可以用如下方式:

cat test.log | grep "abc|123"

more命令

more命令是一個(gè)基于vi編輯器文本過(guò)濾器,它以全屏幕的方式按頁(yè)顯示文本文件的內(nèi)容,支持vi中的關(guān)鍵字定位操作。more名單中內(nèi)置了若干快捷鍵,常用的有H(獲得幫助信息),Enter(向下翻滾一行),空格(向下滾動(dòng)一屏),Q(退出命令)。more命令從前向后讀取文件,因此在啟動(dòng)時(shí)就加載整個(gè)文件。

該命令一次顯示一屏文本,滿屏后停下來(lái),并且在屏幕的底部出現(xiàn)一個(gè)提示信息,給出至今己顯示的該文件的百分比:–More–(XX%)

  • more的語(yǔ)法:more 文件名
  • Enter 向下n行,需要定義,默認(rèn)為1行
  • Ctrl f 向下滾動(dòng)一屏
  • 空格鍵 向下滾動(dòng)一屏
  • Ctrl b 返回上一屏
  • = 輸出當(dāng)前行的行號(hào)
  • :f 輸出文件名和當(dāng)前行的行號(hào)
  • v 調(diào)用vi編輯器
  • !命令 調(diào)用Shell,并執(zhí)行命令
  • q退出more

sed命令

這個(gè)命令可以查找日志文件特定的一段 , 根據(jù)時(shí)間的一個(gè)范圍查詢,可以按照行號(hào)和時(shí)間范圍查詢。

按照行號(hào):

sed -n '5,10p' filename 這樣你就可以只查看文件的第5行到第10行。

按照時(shí)間段:

sed -n '/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p' test.log

less命令

less命令在查詢?nèi)罩緯r(shí),一般流程是這樣的:

less log.log
shift + G 命令到文件尾部 然后輸入 ?加上你要搜索的關(guān)鍵字例如 ?1213
按 n 向上查找關(guān)鍵字
shift+n 反向查找關(guān)鍵字
less與more類似,使用less可以隨意瀏覽文件,而more僅能向前移動(dòng),不能向后移動(dòng),而且 less 在查看之前不會(huì)加載整個(gè)文件。
less log2013.log 查看文件
ps -ef | less ps查看進(jìn)程信息并通過(guò)less分頁(yè)顯示
history | less 查看命令歷史使用記錄并通過(guò)less分頁(yè)顯示
less log2013.log log2014.log 瀏覽多個(gè)文件

常用的命令參數(shù):

less與more類似,使用less可以隨意瀏覽文件,而more僅能向前移動(dòng),不能向后移動(dòng),而且 less 在查看之前不會(huì)加載整個(gè)文件。
less log2013.log 查看文件
ps -ef | less ps查看進(jìn)程信息并通過(guò)less分頁(yè)顯示
history | less 查看命令歷史使用記錄并通過(guò)less分頁(yè)顯示
less log2013.log log2014.log 瀏覽多個(gè)文件
常用命令參數(shù):
-b <緩沖區(qū)大小> 設(shè)置緩沖區(qū)的大小
-g 只標(biāo)志最后搜索的關(guān)鍵詞
-i 忽略搜索時(shí)的大小寫(xiě)
-m 顯示類似more命令的百分比
-N 顯示每行的行號(hào)
-o <文件名> 將less 輸出的內(nèi)容在指定文件中保存起來(lái)
-Q 不使用警告音
-s 顯示連續(xù)空行為一行
/字符串:向下搜索"字符串"的功能
?字符串:向上搜索"字符串"的功能
n:重復(fù)前一個(gè)搜索(與 / 或 ? 有關(guān))
N:反向重復(fù)前一個(gè)搜索(與 / 或 ? 有關(guān))
b 向后翻一頁(yè)
h 顯示幫助界面
q 退出less 命令

一般本人查日志配合應(yīng)用的其他命令:

history // 所有的歷史記錄

history | grep XXX // 歷史記錄中包含某些指令的記錄

history | more // 分頁(yè)查看記錄

history -c // 清空所有的歷史記錄

!! 重復(fù)執(zhí)行上一個(gè)命令

查詢出來(lái)記錄后選中 : !323

Linux日志文件說(shuō)明:
/var/log/message 系統(tǒng)啟動(dòng)后的信息和錯(cuò)誤日志,是Red Hat Linux中最常用的日志之一
/var/log/secure 與安全相關(guān)的日志信息
/var/log/maillog 與郵件相關(guān)的日志信息
/var/log/cron 與定時(shí)任務(wù)相關(guān)的日志信息
/var/log/spooler 與UUCP和news設(shè)備相關(guān)的日志信息
/var/log/boot.log 守護(hù)進(jìn)程啟動(dòng)和停止相關(guān)的日志消息
/var/log/wtmp 該日志文件永久記錄每個(gè)用戶登錄、注銷及系統(tǒng)的啟動(dòng)、停機(jī)的事件

指定日志時(shí)間段

測(cè)試過(guò)程中,經(jīng)常會(huì)出現(xiàn)一閃而過(guò)的錯(cuò)誤信息提示,沒(méi)來(lái)得及截圖, 要想復(fù)現(xiàn),有些許困難。留給開(kāi)發(fā)去定位問(wèn)題的,只能是提供當(dāng)時(shí)錯(cuò)誤信息提示的大概時(shí)間, 如2020-07-20 13:00 -13:10 這個(gè)時(shí)間段,去后臺(tái)找日志。
以下是2種查看指定時(shí)間段日志的命令,比較常用。
日志文件如下-僅供測(cè)試:
要求:查詢2020-07-21 11:58:00~ 12:05:50 這個(gè)時(shí)間段的日志?
方法一:使用grep命令
grep  -E '2020-07-21 1[1-2]:[5-0][8-5]:[0-5]0' out.log
執(zhí)行結(jié)果:Invalid range end
?
正則表達(dá)式匹配的數(shù)字 為:[0-9] 等價(jià)于 [[:digit:]] 因此以上命令不可用。
換種思路:11:58:00 ~ 12:05:50 這個(gè)時(shí)間段 拆分為 11:58:00~11:59:59 和12:00:00~12.05:50,命令如下:
grep  -E '2020-07-21 11:5[8-9]:[0-5][0-9]|2020-07-21 12:0[0-5]:[0-5]0' out.log
grep -E 選項(xiàng)可以用來(lái)擴(kuò)展選項(xiàng)為正則表達(dá)式。如果使用了grep 命令的選項(xiàng)-E,則應(yīng)該使用 | 來(lái)分割多個(gè)pattern,以此實(shí)現(xiàn)OR操作。
方法二:使用sed 命令
sed -n '/2020-07-21 11:58:00/,/2020-07-21 12:05:50/p' out.log

sed 選項(xiàng)說(shuō)明:

  • -n選項(xiàng):只顯示匹配處理的行(不加會(huì)輸出所有)
  • -p選項(xiàng):打印

-n 和-p??經(jīng)常一起使用。

在日志文件中查找關(guān)鍵字前后多少行

方式一

?(1)cat -n pom.xml | grep abc

?上面的命令是打開(kāi)pom.xml文件,并顯示行號(hào),查找關(guān)鍵字abc,這個(gè)-n就是顯示pom.xml這個(gè)文件的行號(hào)。

?(2)cat -n pom.xml | tail -n +13 | head -n 6

tail -n +13意思是從文件的第13行往后顯示,head -n 6 的意思是顯示13行后的6行

總結(jié):先求得關(guān)鍵字的行號(hào),比如求得關(guān)鍵字的行號(hào)是100行。

方式二

  • cat filename |grep 關(guān)鍵字 -C10? 上面顯示關(guān)鍵字的前后10行? ? ? ? ? -C顯示前后多少行
  • cat filename |grep 關(guān)鍵字 -A10? 上面顯示關(guān)鍵字的后10行? ? ? ? ? ? ? -A顯示后多少行
  • cat filename |grep 關(guān)鍵字 -B10? 上面顯示關(guān)鍵字的前10行? ? ? ? ? ? ? -B顯示前多少行

?

本文摘自 :https://www.cnblogs.com/

開(kāi)通會(huì)員,享受整站包年服務(wù)立即開(kāi)通 >