Як використовувати `cat` або` менше` залежно від кількості рядків?


12

Переглядаючи вміст файлів, я хотів би автоматично catкороткі файли, але lessті, що перевищують розмір екрана. Я міг би щось використати wc -l, але чи є кращий спосіб, який, можливо, також враховує розмір вікна / поточну кількість рядків?


1
Хоча багато інструментів це роблять, зауважте, що це порушує очікуваність. Тобто користувач не може заздалегідь знати, що станеться. Мені здається, це дратує, наприклад, git logколи це робиться точно. Ніколи не знаєш заздалегідь, що ти збираєшся отримати (чи ти повинен вдарити q?).
бітмаска

4
ПРИМІТКА. Загалом, вам слід уникати використання catдля перегляду файлів. Зазвичай ви повинні використовувати лише catдля надсилання вмісту файлу в stdout, щоб він міг бути переданий в інший процес. Причина уникати використання catдля перегляду полягає в тому, що він надсилає необроблені байти в термінал, що може спричинити виконання несподіваних термінальних команд (наприклад, деякі користувачі застрягли, коли в файлі траплявся правильний байт для відключення термінальної клавіатури) . Зазвичай слід використовувати пейджер типу less"редактор", який буде форматувати спеціальні символи для відображення, щоб вони не інтерпретувалися терміналом.
Кріс Пейдж

2
Якщо ви збираєтеся використовувати cat для перегляду вмісту файлів безпосередньо в терміналі, принаймні використовуйте, cat -vщоб він уникав спеціальних символів.
Кріс Пейдж

@bitmask хороший момент, тому я запитав, чи можливий розділений екран cat? що може бути кращим рішенням
Тобіас Кіенцлер

@ChrisPage Моя клавіатура не була вбита, але я думаю , що мені вдалося вкрутити кодові один раз ... Дякую за вказівку cat -vз
Tobias Kienzler

Відповіді:


9

Щоб дати вам формулу, яка включає wcперевірку на основі:

(($(wc -l<input_file)<=$(tput lines))) && echo 'will fit' || echo 'not enough'

Існує $LINESзмінна оболонки, яку також можна використовувати:

(($(wc -l<input_file)<=LINES)) && echo 'will fit' || echo 'not enough'

Але $LINESоновлюється лише тоді, коли в командному рядку. Щоб зрозуміти, що я маю на увазі, запустіть це та змініть розмір вікна терміналу під час sleep:

( sleep 3; echo $LINES; tput lines )

Дякую, це має перевагу в тому, що його можна буде налаштувати lessвже в тому випадку, якщо 2/3 екрана використовувались cat.
Тобіас Кіенцлер

20

Можливо, "менше -F file_to_read" - це варіант: він виходить менше, якщо вікна достатньо для відображення всього файлу, і чекайте на пейджер, якщо це не так


звучить добре, але це нічого не видає в цьому випадку, і коди виходу однакові в обох випадках
Tobias Kienzler

Я просто намагаюся "менше -F / etc / passwd", і він відображає файл коректно (з пейджером або без нього). Ви праві, зворотний код - 0 в обох випадках.
Дом

11
Ця команда працює як вимагається, але з незначним збоєм: вона очищає екран після відображення файлу. Додавання -Xпараметра зупинить очищення, тому короткі файли відображатимуться так catсамо. На жаль, -Xекран не очиститься ні після відображення довгих прокручених файлів.
манатура

1
@manatwork це чудово, дякую. Не очищати екран насправді нормально, оскільки саме це сталося б (не), якби catйого також викликали
Тобіас Кіенцлер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.