你所不知道的用 less 檢視檔案的高階用法

2020-03-16 15:38:00

使用 less 檔案檢視器的一些技巧。

最近,我正在拜讀 Scott Nesbitt 的文章《在 Linux 命令列中使用 less 來檢視文字檔案》,並受到了一些啟發,所以我想分享一些使用 less 命令的技巧。

LESS 環境變數

如果你定義了環境變數 LESS(例如在 .bashrc 中),那麼 less 會將其視為一個選項列表,就像在命令列中傳遞給它一樣。

我這樣定義:

LESS='-C -M -I -j 10 -# 4'

它的意思是:

  • -C – 通過不從底部捲動來加快全螢幕列印速度。
  • -M – 在最後一行(狀態行)顯示更多資訊。你可以使用 -PM 來自定義顯示的資訊,但我通常只用 -M
  • -I – 忽略搜尋中的大小寫。
  • -j 10 – 在終端的第 10 行而不是第一行顯示搜尋結果。這樣,每次按 n 或(N) 跳到下一個(或上一個)匹配項時,就會有 10 條上下文。
  • -# 4 – 當按下向右或向左的箭頭時,會向右或向左跳四個字元。預設情況時跳轉半個螢幕,我覺得太多了。一般來說,less 似乎(至少部分)是按最初開發它時的環境優化的,那時使用慢速數據機和低頻寬的網際網路連線,所以跳過半個螢幕是有意義的。

PAGER 環境變數

許多程式使用在 PAGER 環境變數中的命令來顯示資訊。因此,你可以在 .bashrc 中設定 PAGER=less,然後讓程式執行 less。檢視手冊頁(man 7 environ)中是否有其它此類變數。

-S

-S 告訴 less 將長行切斷而不是將它們換行。除非我在(或我要)檢視檔案,否則我很少需要這樣做。幸運的是,你可以在 less 中輸入所有命令列選項,就像它們是鍵盤命令一樣。因此,如果我想在檔案已經開啟的情況下隔斷長行,我可以簡單地輸入 -S。(LCTT 譯註:注意大寫 S ,並按回車)

這是我經常使用的一個例子:

su - postgresexport PAGER=less  # 因為我不用在所有的機器上編輯 postgres 的 .bashrcpsql

有時當我檢視一個 SELECT 命令的輸出非常寬時,我會輸入 -S 以便將其格式化的漂亮一些。如果當我按下右箭頭想檢視更多內容時它跳得太遠(因為我沒有設定 -#),則可以輸入 -#8,那麼每次按下右箭頭都會向右移動八個字元。

有時在多次輸入 -S 之後,我會退出 psql 並設定環境變數後再次執行它:

export LESS=-S

F

命令 F 可以使 lesstail -f 一樣工作,等待更多的資料被新增到檔案後再顯示它們。與 tail -f 相比,它的一個優點是,高亮顯示搜尋匹配仍然有效。因此,你可以輸入 less /var/log/logfile,搜尋某些內容時,它將高亮顯示所有出現的內容(除非你使用了 -g),然後按下 F 鍵,當更多資料寫入到紀錄檔時,less 將顯示它並高亮新的匹配項。

按下 F 後,可以按 Ctrl+C 來停止其查詢新資料(這不會乾掉它),這樣你可以返回檔案檢視舊內容,搜尋其它內容等,然後再次按 F 鍵來檢視更多新資料。

搜尋

搜尋使用系統的正規表示式庫,這通常意味著你可以使用擴充套件正規表示式。特別是,搜尋 one|two|three 可以找到並高亮所有的 one、two 或 three。

我經常使用的另一種模式是 .*someting.*,特別是對於一些很長的紀錄檔行(例如,跨越多個終端寬度的行),它會高亮整行。這種模式使檢視一行的起始和結束位置變得更加容易。我還會結合其它內容,例如 .*one thing.*|.*another thing.*,或者使用 key: .*|.*marker.* 來檢視 key 的內容。例如,一個紀錄檔檔案中包含一些字典/雜湊的轉儲。它會高亮相關的標記行,這樣我就看到上下文了,甚至,如果我知道這個值被引號引起來的話,就可以:

key: '[^']*'|.*marker.*

less 會保留你的搜尋項的歷史紀錄,並將其儲存到磁碟中以備將來呼叫。當你按下 /? 時,可以使用向上或向下箭頭瀏覽歷史記錄(以及進行基本的行編輯)。

在撰寫本文時,我無意間看了下 less 手冊頁,發現了一個非常有用的功能:使用 &!pattern 跳過無關的行。例如,當我在 /var/log/messages 中尋找內容時,經常會一個個疊代使用以下命令:

cat /var/log/messages | egrep -v 'systemd: Started Session' | lesscat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session' | lesscat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session|User Slice' | lesscat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session|User Slice|dbus' | lesscat /var/log/messages | egrep -v 'systemd: Started Session|systemd: Starting Session|User Slice|dbus|PackageKit Daemon' | less

但是現在我知道如何在 less 中做同樣的事情。例如,我可以輸入 &!systemd: Started Session,然後想要隱藏 systemd: Starting Session,所以我輸入 &!,並使用向上箭頭從歷史記錄中獲得上一次搜尋的結果。然後我接著輸入 |systemd: Starting Session 並按下回車,繼續以相同的方式新增更多條目,直到我過濾掉足夠多的條目,看到更有趣的內容。

=

命令 = 顯示有關檔案和位置的更多資訊,甚至比 -M 更多。如果檔案非常大,計算 = 花費的時間太長,可以按下 Ctrl+C,它將停止嘗試計算。

如果你正在檢視的內容來自管道而不是檔案,則 =(和 -M)不會顯示未知內容,包括檔案中的行數和位元組數。要檢視這些資料,如果你知道管道命令將很快結束,則可以使用 G 跳到最後,然後 less 將開始顯示這些資訊。

如果按下 G 並且寫入管道的命令花費的時間比預期的長,你可以按下 Ctrl+C,該命令將被終止。即使你沒有按 GCtrl+C 鍵也會殺死它。因此,如果你不想終止命令,請不要意外按下 Ctrl+C。出於這個原因,如果命令執行了某些操作(不僅是顯示資訊),通常更安全的做法是將其輸出寫入檔案並在單獨的終端中檢視檔案,而不是使用管道。

為什麼你需要 less

less 是一個非常強大的程式,與該領域中較新的競爭者(例如 mostmore)不同,你可能會在幾乎所有的系統上找到它,就像 vi 一樣。因此,即使你使用 GUI 檢視器或編輯器,花一些時間瀏覽 less 手冊頁也是值得的,至少可以了解一下它的用處。這樣,當你需要做一些已有的功能可能提供的工作時,就會知道如何要搜尋手冊頁或網際網路來找到所需的內容。

有關更多資訊,存取 less 主頁。該網站有一個不錯的常見問題解答,其中包含更多提示和技巧。