2

Из скрипта я хочу 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 а моя меньшая версия - 436 . ОС это RHEL.

2 ответа2

1

Следующая команда может быть заключена в пакетный файл:

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

Параметр $1 - это имя файла, а $2 - шаблон поиска. Обратите внимание:

  • grep -E (или egrep) позволяет сопоставлять более одного шаблона поиска;
  • соответствие ^ (начало строки) гарантирует, что каждая строка указана;
  • совпадение $2 приводит к выделению строки поиска;
  • grep --color=always копирует выделенные escape-последовательности в канал;
  • less -R заставляет less воспроизводить выделение вместо показа escape-последовательности.

Это не самое удачное решение, а какой-то ответ. Обратите внимание, что команда перечислит все строки, выделяя образец, тогда как less -p пропускает строки перед первым соответствием: чтобы воспроизвести это, вам нужно будет использовать sed .

0

Есть другой способ, все 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, чтобы продолжить хвост

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .