你所不知道的用less查看文件的高級用法
使用 less 文件查看器的一些技巧。
最近,我正在拜讀 Scott Nesbitt 的文章《在 Linux 命令行中使用 less 來查看文本文件》,并受到了一些啟發(fā),所以我想分享一些使用 less
命令的技巧。
LESS 環(huán)境變量
如果你定義了環(huán)境變量 LESS
(例如在 .bashrc
中),那么 less
會將其視為一個(gè)選項(xiàng)列表,就像在命令行中傳遞給它一樣。
我這樣定義:
LESS='-C -M -I -j 10 -# 4'
它的意思是:
-C
– 通過不從底部滾動來加快全屏打印速度。-M
– 在最后一行(狀態(tài)行)顯示更多信息。你可以使用-PM
來自定義顯示的信息,但我通常只用-M
。-I
– 忽略搜索中的大小寫。-j 10
– 在終端的第 10 行而不是第一行顯示搜索結(jié)果。這樣,每次按n
或(N
) 跳到下一個(gè)(或上一個(gè))匹配項(xiàng)時(shí),就會有 10 條上下文。-# 4
– 當(dāng)按下向右或向左的箭頭時(shí),會向右或向左跳四個(gè)字符。默認(rèn)情況時(shí)跳轉(zhuǎn)半個(gè)屏幕,我覺得太多了。一般來說,less
似乎(至少部分)是按最初開發(fā)它時(shí)的環(huán)境優(yōu)化的,那時(shí)使用慢速調(diào)制解調(diào)器和低帶寬的互聯(lián)網(wǎng)連接,所以跳過半個(gè)屏幕是有意義的。
PAGER 環(huán)境變量
許多程序使用在 PAGER
環(huán)境變量中的命令來顯示信息。因此,你可以在 .bashrc
中設(shè)置 PAGER=less
,然后讓程序運(yùn)行 less
。查看手冊頁(man 7 environ
)中是否有其它此類變量。
-S
-S
告訴 less
將長行切斷而不是將它們換行。除非我在(或我要)查看文件,否則我很少需要這樣做。幸運(yùn)的是,你可以在 less
中輸入所有命令行選項(xiàng),就像它們是鍵盤命令一樣。因此,如果我想在文件已經(jīng)打開的情況下隔斷長行,我可以簡單地輸入 -S
。(LCTT 譯注:注意大寫 S
,并按回車)
這是我經(jīng)常使用的一個(gè)例子:
su - postgres
export PAGER=less # 因?yàn)槲也挥迷谒械臋C(jī)器上編輯 postgres 的 .bashrc
psql
有時(shí)當(dāng)我查看一個(gè) SELECT
命令的輸出非常寬時(shí),我會輸入 -S
以便將其格式化的漂亮一些。如果當(dāng)我按下右箭頭想查看更多內(nèi)容時(shí)它跳得太遠(yuǎn)(因?yàn)槲覜]有設(shè)置 -#
),則可以輸入 -#8
,那么每次按下右箭頭都會向右移動八個(gè)字符。
有時(shí)在多次輸入 -S
之后,我會退出 psql 并設(shè)置環(huán)境變量后再次運(yùn)行它:
export LESS=-S
F
命令 F
可以使 less
像 tail -f
一樣工作,等待更多的數(shù)據(jù)被添加到文件后再顯示它們。與 tail -f
相比,它的一個(gè)優(yōu)點(diǎn)是,高亮顯示搜索匹配仍然有效。因此,你可以輸入 less /var/log/logfile
,搜索某些內(nèi)容時(shí),它將高亮顯示所有出現(xiàn)的內(nèi)容(除非你使用了 -g
),然后按下 F
鍵,當(dāng)更多數(shù)據(jù)寫入到日志時(shí),less
將顯示它并高亮新的匹配項(xiàng)。
按下 F
后,可以按 Ctrl+C
來停止其查找新數(shù)據(jù)(這不會干掉它),這樣你可以返回文件查看舊內(nèi)容,搜索其它內(nèi)容等,然后再次按 F
鍵來查看更多新數(shù)據(jù)。
搜索
搜索使用系統(tǒng)的正則表達(dá)式庫,這通常意味著你可以使用擴(kuò)展正則表達(dá)式。特別是,搜索 one|two|three
可以找到并高亮所有的 one、two 或 three。
我經(jīng)常使用的另一種模式是 .*someting.*
,特別是對于一些很長的日志行(例如,跨越多個(gè)終端寬度的行),它會高亮整行。這種模式使查看一行的起始和結(jié)束位置變得更加容易。我還會結(jié)合其它內(nèi)容,例如 .*one thing.*|.*another thing.*
,或者使用 key: .*|.*marker.*
來查看 key
的內(nèi)容。例如,一個(gè)日志文件中包含一些字典/哈希的轉(zhuǎn)儲。它會高亮相關(guān)的標(biāo)記行,這樣我就看到上下文了,甚至,如果我知道這個(gè)值被引號引起來的話,就可以:
key: '[^']*'|.*marker.*
less
會保留你的搜索項(xiàng)的歷史紀(jì)錄,并將其保存到磁盤中以備將來調(diào)用。當(dāng)你按下 /
或 ?
時(shí),可以使用向上或向下箭頭瀏覽歷史記錄(以及進(jìn)行基本的行編輯)。
在撰寫本文時(shí),我無意間看了下 less
手冊頁,發(fā)現(xiàn)了一個(gè)非常有用的功能:使用 &!pattern
跳過無關(guān)的行。例如,當(dāng)我在 /var/log/messages
中尋找內(nèi)容時(shí),經(jīng)常會一個(gè)個(gè)迭代使用以下命令:
cat /var/log/messages | egrep -v 'systemd: Started Session' | less
cat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session' | less
cat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session|User Slice' | less
cat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session|User Slice|dbus' | less
cat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session|User Slice|dbus|PackageKit Daemon' | less
但是現(xiàn)在我知道如何在 less
中做同樣的事情。例如,我可以輸入 &!systemd: Started Session
,然后想要隱藏 systemd: Starting Session
,所以我輸入 &!
,并使用向上箭頭從歷史記錄中獲得上一次搜索的結(jié)果。然后我接著輸入 |systemd: Starting Session
并按下回車,繼續(xù)以相同的方式添加更多條目,直到我過濾掉足夠多的條目,看到更有趣的內(nèi)容。
=
命令 =
顯示有關(guān)文件和位置的更多信息,甚至比 -M
更多。如果文件非常大,計(jì)算 =
花費(fèi)的時(shí)間太長,可以按下 Ctrl+C
,它將停止嘗試計(jì)算。
如果你正在查看的內(nèi)容來自管道而不是文件,則 =
(和 -M
)不會顯示未知內(nèi)容,包括文件中的行數(shù)和字節(jié)數(shù)。要查看這些數(shù)據(jù),如果你知道管道命令將很快結(jié)束,則可以使用 G
跳到最后,然后 less
將開始顯示這些信息。
如果按下 G
并且寫入管道的命令花費(fèi)的時(shí)間比預(yù)期的長,你可以按下 Ctrl+C
,該命令將被終止。即使你沒有按 G
,Ctrl+C
鍵也會殺死它。因此,如果你不想終止命令,請不要意外按下 Ctrl+C
。出于這個(gè)原因,如果命令執(zhí)行了某些操作(不僅是顯示信息),通常更安全的做法是將其輸出寫入文件并在單獨(dú)的終端中查看文件,而不是使用管道。
為什么你需要 less
less
是一個(gè)非常強(qiáng)大的程序,與該領(lǐng)域中較新的競爭者(例如 most
和 moar
)不同,你可能會在幾乎所有的系統(tǒng)上找到它,就像 vi
一樣。因此,即使你使用 GUI 查看器或編輯器,花一些時(shí)間瀏覽 less
手冊頁也是值得的,至少可以了解一下它的用處。這樣,當(dāng)你需要做一些已有的功能可能提供的工作時(shí),就會知道如何要搜索手冊頁或互聯(lián)網(wǎng)來找到所需的內(nèi)容。