Linux 命令 less 全知全會

hedzr發表於2021-12-25
摘要
對 less 的各種用法做一次整理,順便也可以當作參考手冊。
<!--MORE-->

引子

less 是一個 Linux 命令列實用程式,用於顯示檔案內容,它支援管道輸入,所以能夠被用於接收前一命令的標準輸出病進行全屏展示。

lessmore 的增強版本,它具有更全面的全檔案導航能力,以及全文搜尋能力。less 在大檔案開啟方面有很好的優化,在即時顯示、快速載入等方面效能突出。less 還支援一次性開啟多個檔案,它將會逐一地顯示這些檔案的內容。

取名為 less 也因為一句名人名言:less is more。這句名言已經哲學化了。

image-20211225100221467

基本使用

less 的基本使用方法有兩種,一是開啟一個或多個檔案:

less /var/log/messages

二是作為管道操作的末端:

ps aux|less

在管理操作時,可能會常常用到 tail -f 等價的實時重新整理模式:

dmsg|less +F

被嵌入地、隱含地使用

在很多場所中 less 被通過 PAGER 環境變數而悄悄地使用。

一個典型的例子是 man 命令。當:

man printf

時,printf 的手冊頁將被顯示在 less 的閱讀介面中,如同這樣:

image-20211225100928604

閱讀介面操作

在 less 顯示的閱讀介面中,按鍵即命令。

你可以隨時按下 h 顯示幫助屏,q 將退出幫助屏。

其它最常用的按鍵命令有:

按鍵指令
SPACE下一頁
d下半頁
b前一頁
u前半頁
v編輯內容
j 或 ↵ Enter下ㄧ行
k前ㄧ行
Home檔案頂部
End檔案結尾
F跟隨模式(供日誌使用)。Follow Mode (for logs). Interrupt to abort.
g 或 <第一行
G 或 >最後ㄧ行
⟨n⟩G跳到第⟨n⟩
/⟨text⟩向前搜尋⟨text⟩。文字會被視為正規表示式
?⟨text⟩如同/,但為向後搜尋。
n下一個符合的搜尋結果
N上一個符合的搜尋結果
Escu關閉符合突顯(請見-g命令列選項)
-⟨c⟩切換選項⟨c⟩,例如-i會切換是否要在搜尋時忽略大小寫
m⟨c⟩設定標記⟨c⟩
'⟨c⟩跳到標記⟨c⟩
= 或 Ctrl+G檔案資訊
:n下一個檔案
:p上一個檔案
h說明。這會使用less顯示,q離開。
q離開

稍後鍵盤一節中我們會完整地介紹全部可用的按鍵命令。

搜尋

在 less 的閱讀介面中,底部行被稱作狀態命令列。如果你在介面中按鍵,則該行的狀態提示暫時被隱藏,帶有 : 提示符的命令列輸入會被顯示。

當你按下 / 進入搜尋狀態時,狀態命令列等待你繼續鍵入 pattern。

你可以在搜尋時使用正則式 pattern。

重複上一次搜尋是 n

如果你鍵入 -J 序列,那麼閱讀介面左側將顯示一列垂直的狀態列,而 pattern 匹配的行在這個狀態列中會有顯示:

image-20211225103745594

標記(Mark)

標記是一個字母,大小寫敏感。標記等同於我們在 Visual Studio Code 這樣的圖形化文字編輯器中的書籤。

在閱讀介面按下 ma 按鍵序列,m 命令將會為你的當前閱讀位置建立一個名為 a 的標記。稍後你可以使用 'a 返回到這個位置。

如果你鍵入 -J 序列,那麼閱讀介面左側將顯示一列垂直的狀態列,而 a 標記在這個狀態列中會有顯示:

image-20211225102328869

選項

選項既可以從命令列指定,也可以在 less 閱讀介面中通過字首字元序列 --- 直接鍵入和進行翻轉。

例如你可以鍵入 -? 來顯示幫助屏(儘管 h 來得更簡便)。

less [-[+]aABcCdeEfFgGiIJKLmMnNqQrRsSuUVwWX~]
     [-b space] [-h lines] [-j line] [-k keyfile]
     [-{oO} logfile] [-p pattern] [-P prompt] [-t tag]
     [-T tagsfile] [-x tab,...] [-y lines] [-[z] lines]
     [-# shift] [+[+]cmd] [--] [filename]...

less 允許從命令列直接鍵入命令,使用 + 字首即可,所以 +F 代表著進入滾動重新整理模式,例如:

less +F /var/log/messages

注意你仍然可以使用 less 的命令列專有的選項,例如 -F 代表著檔案內容不夠一屏時立即退出 less。

如果你使用了 ++ 字首,那麼該命令將會被自動應用到每一個檔案。

less 可以一次性開啟多個檔案並依次顯示。

主要的命令列選項

有效的命令列專有選項大體上如下表(由於描述文字很簡單故保留原文):

  -?  ........  --help
                  Display help (from command line).
  -a  ........  --search-skip-screen
                  Search skips current screen.
  -A  ........  --SEARCH-SKIP-SCREEN
                  Search starts just after target line.
  -b [N]  ....  --buffers=[N]
                  Number of buffers.
  -B  ........  --auto-buffers
                  Don't automatically allocate buffers for pipes.
  -c  ........  --clear-screen
                  Repaint by clearing rather than scrolling.
  -d  ........  --dumb
                  Dumb terminal.
  -D [xn.n]  .  --color=xn.n
                  Set screen colors. (MS-DOS only)
  -e  -E  ....  --quit-at-eof  --QUIT-AT-EOF
                  Quit at end of file.
  -f  ........  --force
                  Force open non-regular files.
  -F  ........  --quit-if-one-screen
                  Quit if entire file fits on first screen.
  -g  ........  --hilite-search
                  Highlight only last match for searches.
  -G  ........  --HILITE-SEARCH
                  Don't highlight any matches for searches.
  -h [N]  ....  --max-back-scroll=[N]
                  Backward scroll limit.
  -i  ........  --ignore-case
                  Ignore case in searches that do not contain uppercase.
  -I  ........  --IGNORE-CASE
                  Ignore case in all searches.
  -j [N]  ....  --jump-target=[N]
                  Screen position of target lines.
  -J  ........  --status-column
                  Display a status column at left edge of screen.
  -k [file]  .  --lesskey-file=[file]
                  Use a lesskey file.
  -K            --quit-on-intr
                  Exit less in response to ctrl-C.
  -L  ........  --no-lessopen
                  Ignore the LESSOPEN environment variable.
  -m  -M  ....  --long-prompt  --LONG-PROMPT
                  Set prompt style.
  -n  -N  ....  --line-numbers  --LINE-NUMBERS
                  Don't use line numbers.
  -o [file]  .  --log-file=[file]
                  Copy to log file (standard input only).
  -O [file]  .  --LOG-FILE=[file]
                  Copy to log file (unconditionally overwrite).
  -p [pattern]  --pattern=[pattern]
                  Start at pattern (from command line).
  -P [prompt]   --prompt=[prompt]
                  Define new prompt.
  -q  -Q  ....  --quiet  --QUIET  --silent --SILENT
                  Quiet the terminal bell.
  -r  -R  ....  --raw-control-chars  --RAW-CONTROL-CHARS
                  Output "raw" control characters.
  -s  ........  --squeeze-blank-lines
                  Squeeze multiple blank lines.
  -S  ........  --chop-long-lines
                  Chop (truncate) long lines rather than wrapping.
  -t [tag]  ..  --tag=[tag]
                  Find a tag.
  -T [tagsfile] --tag-file=[tagsfile]
                  Use an alternate tags file.
  -u  -U  ....  --underline-special  --UNDERLINE-SPECIAL
                  Change handling of backspaces.
  -V  ........  --version
                  Display the version number of "less".
  -w  ........  --hilite-unread
                  Highlight first new line after forward-screen.
  -W  ........  --HILITE-UNREAD
                  Highlight first new line after any forward movement.
  -x [N[,...]]  --tabs=[N[,...]]
                  Set tab stops.
  -X  ........  --no-init
                  Don't use termcap init/deinit strings.
  -y [N]  ....  --max-forw-scroll=[N]
                  Forward scroll limit.
  -z [N]  ....  --window=[N]
                  Set size of window.
  -" [c[c]]  .  --quotes=[c[c]]
                  Set shell quote characters.
  -~  ........  --tilde
                  Don't display tildes after end of file.
  -# [N]  ....  --shift=[N]
                  Horizontal scroll amount (0 = one half screen width)
      ........  --no-keypad
                  Don't send termcap keypad init/deinit strings.
      ........  --follow-name
                  The F command changes files if the input file is renamed.
      ........  --use-backslash
                  Subsequent options use backslash as escape char.

常用選項

其中或許會被常常用到的可能有:

選項能力
-X ........ --no-init不使用 termcap 的 init/deinit 功能。退出 less 時不清屏。
-x [N[,...]] --tabs=[N[,...]]設定 TAB 字元的顯示寬度
-n -N .... --line-numbers --LINE-NUMBERS顯示/不顯示行號。行號被顯示在狀態命令列中
-m -M .... --long-prompt --LONG-PROMPT切換狀態命令列的提示符的風格
-J ........ --status-column在左側顯示一列垂直的狀態行,搜尋結果行可以在這一列提供一個標記顯示
-F ........ --quit-if-one-screen如果內容顯示不足一屏則立即退出 less
-e -E .... --quit-at-eof --QUIT-AT-EOF當首次抵達檔案結尾位置時立即退出 less

狀態命令列有兩種風格:short, medium。前者顯示一個 : 提示符,後者顯示一系列文件狀態資訊如行號、顯示位置百分比等等。

如果在閱讀介面中使用 -N,則行號會被顯示在狀態命令列中。

如果在命令列使用了 -N,那麼行號可以被顯示在每一行的左側。對於:

less -N /var/log/syslog

會有:

image-20211225101246073

鍵盤

快捷鍵(less

在手冊頁閱讀介面中,可以使用快捷鍵來幫助閱讀。

由於手冊頁的顯示是使用作業系統 Shell 環境中的預設 PAGER 來完成的,所以快捷鍵遵循相應 PAGER 的功能對映。

大多數系統中現在預設採用 less 作為預設 PAGER,因此下面介紹 less 快捷鍵,但針對 manpage 修正描述文字。

基本操作

按鍵能力
h顯示幫助螢幕
q退出
e ^E J ^N CR前進一行(或 N 行)
y ^Y k ^K ^P後退一行(或 N 行)
f ^F ^V SPACE前進一屏
b ^B ESC-v後退一屏
z前進一屏(設定屏高為 N)
w後退一屏(設定屏高為 N)
ESC-SPACE前進一屏,在文末允許上滾
d ^D前進半屏
u ^U後退半屏
ESC-) RightArrow向右捲動半屏
ESC-( LeftArrow向左捲動半屏
ESC-} ^RightArrow向右捲動到最右側
ESC-{ ^LeftArrow向左捲動到第一列
F持續滾動前進,如同 tail -f 那樣
ESC-F持續滾動前進,但在查詢關鍵字匹配時停止滾動
r ^R ^L重新繪製螢幕
R重繪螢幕,廢棄已經快取的輸入

帶有 N 的命令,允許 N cmd 的輸入方法。

f 命令為例,簡單地鍵入 f 則螢幕向下卷滾,內容上移一行;但你可以鍵入 31f 使得內容一次性地向上滾動 31 行。與其相反的是 b 命令,可以使螢幕向上卷滾,內容下移一行。

F 命令具有即時重新整理檔案內容的能力,它相當於增強版的 tail -f 功能,不但可以隨時重新整理和顯示最新的檔案內容,也能夠暫時停止重新整理,在已有的內容中導航和檢索,而且還能繼續再次地使用 F 進入即時重新整理的狀態。

搜尋

按鍵能力
/pattern向前搜尋關鍵詞 pattern
?pattern向後搜尋關鍵詞 pattern
n重複上一次搜尋(重複 N 次)
N反向地重複上一次搜尋
ESC-n重複上一搜尋,允許跨越多個檔案
ESC-N重複上一搜尋,反向,允許跨越多個檔案
ESC-u放棄、還原、翻轉搜尋高亮狀態
&pattern只顯示匹配行文字

一個 pattern 可以由以下按鍵(ASCII字元)進行字首修飾:

按鍵能力
^N or !搜尋非匹配行
^E or *搜尋多個檔案(越過當前主題的檔案末尾)
^F or @從第一個檔案(/)或者最後一個檔案(?)開始搜尋
^K高亮匹配文字,但不移動(保持當前閱讀位置不變)
^R不使用正則式

跳轉

按鍵能力
g < ESC-<檔案第一行(或第 N 行)
G > ESC->檔案最後一行(或最後第 N 行)
p %轉到檔案開始(或者按百分比定位到 N)
t轉到下一個標記(重複 N 次)
T轉到前一個標記(重複 N 次)
[ ( {查詢閉括號 } ) ]
} ) ]查詢開括號 [ ( {
ESC-^F (c1) (c2)查詢閉括號 (c2)
ESC-^B (c1) (c2)查詢開括號 (c1)

g 這樣的按鍵,在閱讀介面可以直接生效。但你也可以連續按鍵,例如 1 3 g 可以轉到第 13 行。

按鍵能力
m<letter>標記當前位置為 <letter>
'<letter>跳轉到前一個標記位置(以 <letter> 為索引)
''跳轉到前一個標記位置
^X^X等同於 '

一個標記位置(mark)是一個大寫字母或者小寫字母。另外,下面是預定義的標記位置:

  • ^ 檔案開始
  • $ 檔案結尾

切換檔案

按鍵能力
:e [file]裝載一個新檔案
^X^V等同於 :e
:n列表中下一個(後 N 個)檔案
:p列表中上一個(上 N 個)檔案
:x列表中第一個(第 N 個)檔案
:d從命令列列表中刪除當前檔案
= ^G :f列印當前檔名

雜項

按鍵能力
-<flag>翻轉一個命令列選項
--<name>翻轉一個選項
_<flag>顯示一個命令列選項
__<name>顯示一個選項
+cmd每當載入解釋一個新檔案時,執行 less 命令 cmd
!command執行 Shell 命令 command
\Xcommand管道操作,從當前位置和標記位置 X 到 Shell 命令 command
s file儲存輸入到檔案
v編輯當前檔案(使用 $VISUAL$EDITOR
V列印 less 版本號

環境變數

PAGER

less 現在是大多數 Linux 發行版的 PAGER 預設值。因此當 PAGER 沒有顯式設定時,系統總是使用它。

export PAGER=less

LESS

你可以為 less 指定預設的命令列選項,例如:

LESS="-X"; export LESS

這使得 less 退出之後不會清屏。

行編輯

less 閱讀介面中,按鍵輸入會顯示在螢幕最下面一行,同時進入行編輯模式。有時候你可以像 vi 一樣按下 : 進入到命令的行編輯模式。

下面是這個行編輯的鍵盤操作方法(由於描述文字很簡單故保留原文)。

 RightArrow ..................... ESC-l ... Move cursor right one character.
 LeftArrow ...................... ESC-h ... Move cursor left one character.
 ctrl-RightArrow  ESC-RightArrow  ESC-w ... Move cursor right one word.
 ctrl-LeftArrow   ESC-LeftArrow   ESC-b ... Move cursor left one word.
 HOME ........................... ESC-0 ... Move cursor to start of line.
 END ............................ ESC-$ ... Move cursor to end of line.
 BACKSPACE ................................ Delete char to left of cursor.
 DELETE ......................... ESC-x ... Delete char under cursor.
 ctrl-BACKSPACE   ESC-BACKSPACE ........... Delete word to left of cursor.
 ctrl-DELETE .... ESC-DELETE .... ESC-X ... Delete word under cursor.
 ctrl-U ......... ESC (MS-DOS only) ....... Delete entire line.
 UpArrow ........................ ESC-k ... Retrieve previous command line.
 DownArrow ...................... ESC-j ... Retrieve next command line.
 TAB ...................................... Complete filename & cycle.
 SHIFT-TAB ...................... ESC-TAB   Complete filename & reverse cycle.
 ctrl-L ................................... Complete filename, list all.

參考

?

相關文章