
我想從腳本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
。不過,它涉及幾個步驟。
less fileToShow.txt
- 命中
&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.
- 最後按F恢復拖尾
答案3
不完全是一個解決方案,但有一些改進-p
......
這些依賴於靈活的+
標誌:
如果命令列選項以 開頭
+
,則該選項的其餘部分將被視為初始命令較少的。例如,+G
告訴 較少的 從文件末尾而不是開頭開始,並+/xyz
告訴它從文件中第一次出現“xyz”開始。作為一種特殊情況,+<number>
其行為類似於+<number>g
;也就是說,它從指定的行號開始顯示(但是,請參閱上面“g”命令下的警告)。如果選項開頭為++
,則初始命令適用於正在查看的每個文件,而不僅僅是第一個文件。先前描述的命令+
也可以用於設定(或改變)每個檔案的初始命令。
-p
跳到第一個匹配項(或者如果您使用則跳到它之前的幾行)--jump-target
)。這不是我想要的與短時退出相結合的效果——跳過的行甚至不是終端的回滾!
如果您啟動
less
然後交互式搜索/ccc
,則 less 會先從頭開始顯示行,然後才滾動,因此它們會成為終端回滾緩衝區的一部份。我們可以使用以下命令來模擬它+
,但我們需要明確地要求重新繪製r
:env LESS= less -SFXE +r/ccc fileToShow.txt
這仍然滾動到該
ccc
行,但現在aaa
和bbb
至少在回滾緩衝區中。但是,如果搜尋跳過很多行:seq 1000 | less -SFXE +r/980
回滾將顯示類似以下內容:
48 49 50 ...skipping... 980 981 982
我預計這可以透過 進行調整
--max-back-scroll
,但它似乎不會影響搜尋。編輯:它似乎取決於視窗大小,即它填滿一個螢幕,然後跳過。誰說我不想看第一行?如果我只想突出顯示匹配項,我可以使用空匹配技巧:
less -SFXE '+r/ccc|$' fileToShow.txt
但這會破壞n/ 的導航N。最好在
/
搜尋時使用此標誌:如果在模式的開頭輸入某些字符,則它們是特殊的;他們修改搜尋類型而不是成為模式的一部分:
...- ^K 突出顯示與當前螢幕上的模式匹配的任何文本,但不要移動到第一個匹配項(保留當前位置)。
包含 char 的語法Ctrl+K取決於 shell,在 bash 中這是有效的:
less -SFXE $'+r/\cKccc' fileToShow.txt
不管怎樣,從第一行開始也減少了
~
填滿螢幕的次數