less 使用 -F 選項和模式匹配

less 使用 -F 選項和模式匹配

我想從腳本less中調用文件並將輸出打印到控制台,而不是新螢幕。如果文件足夠短以適合一個螢幕,我想禁用滾動。如果它比一個螢幕長,我希望能夠滾動它,但一旦到達底部,我想將less控制權返回到控制台。行也應該被截斷(在這種情況下,在控制台視窗之外丟失字串的末尾是可以的)。

我還希望它能夠突出某種模式。

這是我用於參數的內容:

less -SFXE -p "ccc" fileToShow.txt

我用來-S截斷長行,-FX檢測文件的行數是否少於控制台,並將所有文字列印到控制台而不滾動,並在到達文件末尾時-E退出less

這些工作得很好,直到我添加了-p用於突出顯示匹配項的開關。

假設 fileToShow.txt 包含以下內容:

aaa
bbb
ccc
ddd
eee

如果沒有模式切換,我得到這個:

[evan@localhost] $ less -SFXE fileToShow.txt
aaa
bbb
ccc
ddd
eee
[evan@localhost] $ 

當我新增模式匹配時, less 會列印直到控制台高度的空白行(使用波浪號顯示空白行)。

[evan@localhost] $ less -SFXE -p "ccc" fileToShow.txt
ccc
ddd
eee
~
~
~
~
~
~
~
~
[evan@localhost] $ 

有什麼方法可以使用該-p開關並且在使用時不顯示那些空行-F? (注意:「ccc」行根據需要突出顯示,我只是有這種意想不到的副作用。)

我的 shell 是bash 3.2.25,我的 less 版本是436.作業系統是RHEL。

答案1

可以將以下命令封裝在批次檔中:

 grep --color=always -E "^|$2" "$1"|less -SFXER

參數$1是檔名,$2是搜尋模式。注意事項:

  • grep -E(或egrep) 允許符合多個搜尋模式;
  • 匹配到^(行的開頭)可確保列出每一行;
  • 匹配$2導致搜尋字串突出顯示;
  • grep --color=always將突出顯示轉義序列複製到管道;
  • less -R使less重現突出顯示而不是顯示轉義序列。

這不是最巧妙的解決方案,而是某種答案。請注意,該命令將列出所有行,突出顯示模式,而less -p忽略第一個匹配之前的行:要重現此內容,您需要使用sed.

答案2

還有一個辦法,全都在less。不過,它涉及幾個步驟。

  1. less fileToShow.txt
  2. 命中&ccc(假設ccc是您正在尋找的模式)。從手冊頁:

    &pattern: Display only lines which match the pattern; lines which do not match the pattern are not displayed. If pattern is empty (if you type & immediately followed by ENTER), any filtering is turned off, and all lines are displayed. While filtering is in effect, an ampersand is displayed at the beginning of the prompt, as a reminder that some lines in the file may be hidden. Certain characters are special as in the / command: ^N or ! Display only lines which do NOT match the pattern. ^R Don't interpret regular expression metacharacters; that is, do a simple textual comparison.

  3. 最後按F恢復拖尾

答案3

不完全是一個解決方案,但有一些改進-p......
這些依賴於靈活的+標誌:

如果命令列選項以 開頭+,則該選項的其餘部分將被視為初始命令較少的。例如, +G 告訴 較少的 從文件末尾而不是開頭開始,並+/xyz告訴它從文件中第一次出現“xyz”開始。作為一種特殊情況,+<number>其行為類似於+<number>g;也就是說,它從指定的行號開始顯示(但是,請參閱上面“g”命令下的警告)。如果選項開頭為 ++,則初始命令適用於正在查看的每個文件,而不僅僅是第一個文件。先前描述的命令 + 也可以用於設定(或改變)每個檔案的初始命令。

-p跳到第一個匹配項(或者如果您使用則跳到它之前的幾行)--jump-target)。這不是我想要的與短時退出相結合的效果——跳過的行甚至不是終端的回滾!

  1. 如果您啟動less然後交互式搜索/ccc,則 less 會先從頭開始顯示行,然後才滾動,因此它們成為終端回滾緩衝區的一部份。我們可以使用以下命令來模擬它+,但我們需要明確地要求重新繪製r

    env LESS= less -SFXE +r/ccc fileToShow.txt
    

    這仍然滾動到該ccc行,但現在aaabbb至少在回滾緩衝區中。但是,如果搜尋跳過很多行:

    seq 1000 | less -SFXE +r/980
    

    回滾將顯示類似以下內容:

     48
     49
     50
     ...skipping...
     980
     981
     982
    

    我預計這可以透過 進行調整--max-back-scroll,但它似乎不會影響搜尋。編輯:它似乎取決於視窗大小,即它填滿一個螢幕,然後跳過。

  2. 誰說我不想看第一行?如果我只想突出顯示匹配項,我可以使用空匹配技巧:

     less -SFXE '+r/ccc|$' fileToShow.txt
    

    但這會破壞n/ 的導航N。最好在/搜尋時使用此標誌:

    如果在模式的開頭輸入某些字符,則它們是特殊的;他們修改搜尋類型而不是成為模式的一部分:
    ...

    • ^K 突出顯示與當前螢幕上的模式匹配的任何文本,但不要移動到第一個匹配項(保留當前位置)。

    包含 char 的語法Ctrl+K取決於 shell,在 bash 中這是有效的:

     less -SFXE $'+r/\cKccc' fileToShow.txt
    

    不管怎樣,從第一行開始也減少了~填滿螢幕的次數

相關內容