
Из скрипта я хочу вызвать 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» выделена, как и требовалось, у меня просто возник этот непреднамеренный побочный эффект.)
Моя оболочка — , 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
копирует выделяемые escape-последовательности в канал;less -R
заставляетless
воспроизводить подсветку вместо показа последовательности выхода.
Это не самое изящное решение, но своего рода ответ. Обратите внимание, что команда выведет список всех строк, выделив шаблон, но less -p
опустит строки перед первым совпадением: чтобы воспроизвести это, вам нужно будет использовать sed
.
решение2
Есть еще один способ, all in less
. Но он включает в себя несколько шагов.
less fileToShow.txt
- Hit
&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
, но, похоже, это не влияет на поиск. EDIT: похоже, это зависит от размера окна, т. е. оно заполняет один экран, а затем пропускает.Кто сказал, что я не хочу видеть первые строки? Если я хочу только выделить совпадения, я могу использовать трюк с пустой спичкой:
less -SFXE '+r/ccc|$' fileToShow.txt
но это нарушает навигацию с n/ N. Лучше использовать этот флаг при
/
поиске:Некоторые символы являются специальными, если они введены в начале шаблона; они изменяют тип поиска, а не становятся частью шаблона:
...- ^K Выделите любой текст, соответствующий шаблону на текущем экране, но не переходите к первому совпадению (СОХРАНИТЕ текущую позицию).
Синтаксис включения Ctrl+Kchar зависит от оболочки, в bash это работает:
less -SFXE $'+r/\cKccc' fileToShow.txt
В любом случае, запуск с первой строки также уменьшает количество
~
заполнений экрана.