Linux форматирование вывода в консоль

Обновлено: 25.06.2024

Терминал Linux очень гибкий и полезный инструмент. С помощью него можно сделать что угодно и во многих случаях даже намного эффективнее чем в графическом интерфейсе. Команды можно объединять между собой, перенаправлять вывод одной команды, на вход другой, комбинировать их различным образом.

Это делает их применение еще более эффективным. В сегодняшней статье я хочу поделиться несколькими полезными командами linux, которые я открыл для себя во время использования этой операционной системы и которыми до сих пор пользуюсь для автоматизации рутинных действий.

В качестве командной оболочки используется самая популярная - bash. Также для некоторых задач нам понадобится демон планирования выполнения задач cron.

Некоторые из этих команд упрощают выполнение той или иной задачи, некоторые полностью выполняют нужные действия за пользователя. Возможно, не все они будут вам полезны, так как, некоторые команды нужны только веб-мастерам, другие системным администраторам, а еще одни обычным домашним пользователям. Но давайте перейдем к списку полезные команды для линукс.

Создание папок в терминале

Для создания папки в терминале используется команда mkdir. Вот так она выглядит:

Но не все знают о ее дополнительных возможностях. Чтобы создать несколько вложенных папок используйте команду p:

mkdir -p /mnt/foo/bar/

Создать несколько папок за один раз:

Создать папку и перейти в нее:

mkdir /home/foo/doc/bar && cd $_

Кстати, синтаксис фигурных скобок поддерживают и другие команды для Linux терминала.

Ожидать завершения команды и выключить компьютер

Это скорее не команда, а небольшая стандартная функция оболочки Bash, о которой не все знают. Иногда нам нужно оставить на выполнение какую-нибудь долго работающую утилиту, например, обновление системы, а самим куда-то отойти. И при этом мы хотим чтобы после завершения работы утилиты компьютер автоматически выключился.

Можно просто объединить команды с помощью стандартного синтаксиса Bash. Для объединения используются символы && и ||. Первый - выполнить другую команду если первая завершилась успешно, второй если первая завершилась ошибкой.

Например, обновить систему и если все хорошо выключить PC:

apt update && apt upgrade && shutdown -h now

Или выключить компьютер если обновление не удалось:

apt update && apt upgrade || shutdown -h now

Или выключить независимо от того произошла ошибка или нет:

apt update && apt upgrade ; shutdown -h now

Здесь приведена команда обновления Ubuntu, но в других дистрибутивах нужно заменить эту команду на свою.

Повторить последнюю команду

Если мы уже начали говорить о возможностях Bash пойдем дальше. Символ !! означает выполнить последнюю команду. Часто ли у вас случалось такое, что вы набираете команду нажимаете Enter и понимаете, что для ее работы нужно было использовать sudo? Тогда приходиться набирать ту же команду только уже правильно. Но можно пойти другим путем, выполнить:

Кроме символа !! В Bash есть еще несколько указателей на команды:

  • !^ — первый аргумент предыдущей команды;
  • !$ — последний аргумент предыдущей команды;
  • !* — все аргументы предыдущей команды;
  • !-2 — вторая с конца команда;
  • *— содержимое текущего каталога.

А вот так можно сохранить последнюю выполненную команду в скрипт:

Ещё о подобных возможностях Bash можно почитать здесь.

Вызвать последнюю команду которая начиналась с символов

И еще о возможностях Bash. Например, вы помните что подключались в последний раз к определенному узлу по SSH, и теперь вам нужно подключиться к нему снова. Чтобы не вводить полностью команду можно набрать знак "!" и символы с которых начиналась команда:

Будет выполнена последняя команда, которая начиналась на ssh.

Посмотреть ip адрес

Часто возникает необходимость быстро узнать ip адрес своей машины. Для этого есть легко запоминающаяся команда, использующая curl и сайт ifconfig.me:

Форматирование вывода

Многие команды Linux выводят данные, разделяя столбцы пробелами. Одна из них mount. И естественно, в этом выводе трудно что-либо разобрать. Для разделения столбцов табуляциями используйте утилиту column:

mount | column -t

Динамический просмотр лога

Допустим, есть у нас лог файл в который пишется определенная информация и мы хотим видеть все изменения сразу, на лету. Тогда используйте команду tail с опцией -f:

tail -f /адрес/лог/файла

Будет выведено 8 последних строк из лога файла, а затем они будут постоянно обновляться.

Очистить терминал

Вывод команд, если во время их разработки были допущены некоторые ошибки может сломать форматирование строк терминала. Или просто может понадобится стереть всю лишнюю информацию. Для этого есть аж две полезные команды linux, первая:

Первая только переводит курсор вверх страницы, вторая добавляет несколько пустых строк. Ещё можно сбросить терминал нажав сочетание клавиш Ctrl+L.

Подключение RAM диска

Если вам нужно немного дискового пространства с высокой скоростью работы, в Linux можно легко подключить немного оперативной памяти в корневую файловую систему:

mount -t tmpfs tmpfs /mnt -o size=1024m

В папку /mnt будет подключен RAM диск размером 1024 мегабайт.

Узнать архитектуру системы

Этой простой командой можно быстро узнать разрядность системы:

Открыть файл на определенной строке

Это не команда, а просто малоизвестная функция консольных редакторов. Очень полезная для программистов. Вот, например, сообщает программа, что у вас ошибка в 55 строке, вместо того чтобы самому искать ту сроку просто набираете:

nano +55 /sourcefile

vim +55 /sourcefile

И оказываетесь сразу на нужной строке.

Время выполнения команды

Хотите узнать сколько времени выполняется та или иная команда? Просто добавьте перед ней вызов утилиты time. Например:

Эту команду также можно использовать в качестве секундомера. Просто выполните:

А затем нажмите Ctrl+D когда нужно будет узнать сколько времени прошло.

Автоматическое удаление старых файлов

Все мы часто качаем файлы из интернета, это торренты, фильмы, музыка и т д. И все это со временем накапливается в папке загрузки если ненужное вовремя не удалять, а нужное не перемещать в другие папки. Тогда папка загрузок начинает напоминать огромную свалку где вообще нереально что-то найти. У себя я всегда время от времени сортировал и удалял файлы, но когда видел такое у знакомых брался за голову. Есть способ упростить очистку папки загрузок.

Утилита find позволяет находить все файлы, созданные позже определенной даты и выполнять с ними нужное действие. Все нужные файлы будем вовремя рассортировывать и перемещать по папкам назначения, а все что останутся в загрузках будут через два дня автоматически удаляться. Знание что файлы будут удалены заставит их вовремя переместить куда нужно.

Вот так выглядит сама команда:

find /home/user/Downloads/ -type f -mtime +180 -exec 'rm -f <>'

Если не хотите полностью удалять файлы можно перемещать их в корзину:

find /home/user/Downloads/ -type f -mtime +180 -exec 'mv <>

Подробнее о работе find можно почитать тут. Для полной автоматизации добавим выполнение этой команды каждый день в расписание cron:

0 0 * * * find /home/user/Downloads/ -type f -mtime +180 -exec 'rm -f <>'

Теперь давние файлы будут автоматически удаляться каждый день.

Убить все процессы из консоли

Если у вас небольшое количество оперативной памяти на компьютере и вы любите открывать очень много вкладок в Chromium, то программа а вместе с ней и окружение рабочего стола могут прочно зависать. Браузер создает для каждой вкладки отдельный процесс, поэтому пока планировщик памяти ядра поймет кто виноват в сбое и что нужно делать уйдет много времени, а пытаться убить каждую вкладку по отдельности очень долгое занятие. Есть команда, с помощью которой можно из терминала одним махом закрыть все вкладки:

ps aux | grep chromium | awk '' | xargs kill -TERM

Или намного проще:

Здесь мы получаем список всех процессов в ps, выбираем из них chromium, потом отбираем второй столбец, то есть PID, и с помощью xargs вызываем kill для каждой вкладки. Точно таким же способом можно уничтожить любое приложение создающее много процессов.

Создать пустой файл

Иногда возникает необходимость создать пустой файл, например, когда он нужен для конфигурации какого-либо сервиса или чего-то тому подобного. Для этого можно воспользоваться командой touch:

Для создания файла определённого размера надо использовать команду dd:

dd if=/dev/zero of=/путь/к/файлу bs=1M count=размер_в_мегабайтах

Завершение

Вот и подошли к концу наш список. Если вы знаете другие полезные команды Linux, поделитесь ими в комментариях!

Вэтом выпуске мы расскажем об основных возможностях форматирования вывода с помощью команд grep, sed, awk, cat и cut. Это может быть очень полезным, если соединять вместе такие вещи как Conky или скрипты, которые отображают информацию в терминале.

Сначала рассмотрим работу команды cut. Если бы мы хотели отобразить название дистрибутива в нашем скрипте, мы нашли бы его в /etc/issue. Если мы выполним cat /etc/issue, мы увидим много длинных строк со множеством экранирующих символов в них. Так, если мы выполним cat /etc/issue | head -n 1, мы уберём дополнительные строки, сузив вывод команды cat с помощью команды head, которая оставит только первую строку вывода. Пока всё хорошо, но что насчёт специальных символов? Для таких случаев у нас есть cut. Чтобы её использовать, мы должны указать разделитель, а затем сказать ей, что с ним делать. Мы могли бы выполнить следующую команду:

Эта команда говорит cut использовать в качестве разделителя знак пробела, и показать первые два поля (по существу, cut делит вывод на сегменты в соответствии с разделителем, поэтому поля 1 и 2 - это первые два поля до и после разделителя, в нашем случае это Ubuntu 8.10). Cut также можно использовать для отображения только определённого числа символов, используя флаг -c.

То же самое можно сделать и с помощью команды sed:

В заключение, такой же результат мы можем получить с помощью awk:

Это всё рассматривается только как поверхностный взгляд на возможности awk, sed и cut. Из-за их гибкой реализации сложно написать краткое вводное руководство для всех них. Пояснения приведены, чтобы показать, как команды работают, а не описывать их полный потенциал. В реальном мире использование этих команд будет в первой половине любого собственного скрипта (ниже приведен пример, который также выводит информацию о скрипте, но часть не обязательно подходит к этой статье; она оставлена, чтобы оставить скрипт завершённым). Пример также содержит вызов для каждого, кто желает его попробовать: сообразите, как использовать одну из трёх команд, чтобы убрать параграф в памятной части скрипта, и, если вы хотите больше практики, попробуйте заменить каждое использование cut, sed или awk на другую команду, делающую то же самое (т.е. заменить команду cut на awk). Конечно, никакого приза нет, но это хорошая практика, чтобы понять внутреннюю работу этих команд.

В отличие от многих других команд, команда printf не используется для конвейеров (она не принимает стандартный ввод) и не находит частого применения непосредственно в командной строке (чаще всего используется в сценариях). Так почему так важна? Потому что printf так широко используется.

printf (от фразы «print formatted») изначально был разработан для языка программирования C и был реализован во многих языках программирования, включая оболочку. Фактически, в bash printf является встроенной командой.

printf работает так:

Команде даётся строка, содержащая описание формата, которое затем применяется к списку аргументов. Отформатированный результат отправляется на стандартный вывод. Вот банальный пример:

Строка формата может содержать буквальный текст (например, «Я отформатировал строку:»), escape-последовательности (например, \n, символ новой строки) и последовательности, начинающиеся с символа %, которые называются спецификациями преобразования. В приведённом выше примере спецификация преобразования %s используется для форматирования строки «аргумент» и помещения её в выходные данные команды. И снова:

Как мы видим, спецификация преобразования %s заменена строкой «аргумент» в выводе команды. Преобразование s используется для форматирования строковых данных. Есть и другие спецификаторы для других видов данных. В этой таблице перечислены наиболее часто используемые типы данных:

Общие спецификаторы типов данных printf

Спецификатор Описание
d Форматировать число как десятичное целое со знаком.
f Форматировать и вывести число с плавающей запятой.
o Форматировать целое число как восьмеричное число.
s Форматировать строку.
x Форматировать целое число как шестнадцатеричное, используя строчные буквы a-f, где необходимо.
X То же, что и x, но с прописными буквами.
e Научная нотация (экспоненциальная запись) в форме [-]d.ddde±dd, например, 1,233300e+04
E То же, что и e, но с прописной буквой E, например, 1,233300E+04.
% Вывести буквальный символ (т.е. укажите «%%»)

Мы продемонстрируем влияние каждого из спецификаторов преобразования на строку «380»:

Поскольку мы указали шесть спецификаторов преобразования, мы также должны предоставить шесть аргументов для обработки printf. Шесть результатов показывают влияние каждого спецификатора.

К спецификатору преобразования можно добавить несколько дополнительных компонентов, чтобы настроить его вывод. Полная спецификация преобразования может состоять из следующего:

При использовании нескольких необязательных компонентов они должны появляться в указанном выше порядке, чтобы их можно было правильно интерпретировать. Вот описание каждого из них:

Компоненты спецификации преобразования printf

Есть пять разных флагов:

0 – (ноль) означает заполнит вывод нулями. Это означает, что поле будет заполняться ведущими нулями, как в «000380».

- – (тире) означает выровнять вывод по левому краю. По умолчанию printf выравнивает выход по правому краю.

‘ ’ – (пробел) создаёт начальный пробел для положительных чисел.

+ – (знак плюса) добавит знак к положительным числам. По умолчанию printf пишет знак только для отрицательных исел.

Вот несколько примеров использования различных форматов:

Примеры спецификации преобразования printf

Опять же, printf используется в основном в сценариях, где он используется для форматирования табличных данных, а не непосредственно в командной строке. Но мы все ещё можем показать, как его можно использовать для решения различных проблем форматирования. Сначала давайте выведем несколько полей, разделённых символами табуляции:

Вставив \t (escape-последовательность для табуляции), мы достигаем желаемого эффекта. Далее несколько чисел с аккуратным форматированием:

Это показывает влияние минимальной ширины поля на расстояние между полями.

А как насчёт форматирования крошечной веб-страницы:


Если при использовании printf вы столкнулись с ошибкой «недопустимое число», например:

bash: printf: 3.14156295: недопустимое число

Если вы действительно указали правильное число, но получаете эту ошибку, то дело может быть в десятичной точке, а именно в используемом для неё символе.

Суть в том, что в разных странах в качестве десятичной точки используется либо точка, либо запятая. В компьютере принимаемый в качестве десятичной точки символ зависит от локали ОС. Если вы получили указанную ошибку, то просто попробуйте заменить точку в числе на запятую (или наоборот, запятую на точку), например, вместо числа 3.14156295 используйте чисто 3,14156295.


Я бы тогда так сделал:
Башем расставил границы:

Меняю предпоследнюю строку на

На выходе получаю

А лучше не натягивать сову на глобус, а взять нормальный скиптовый ЯП.

На bash + sed эквивалентный алгоритм накостылять тоже можно, но зачем?

Проблема в том, что column работает с файлом целиком. Если ему подсовывать отдельные строки, он будет выводить отдельные столбцы для каждой строки, ничего не помня о предыдущих.
Как один из костылей можно изменить конец скрипта так:

Пробел перед стенкой и |, те.:


щитай столбики, программа только их и отображает, она не телепат чтоб все твои хотелки удовлетворять

CHIPOK ★★★ ( 12.01.15 21:51:07 )
Последнее исправление: CHIPOK 12.01.15 21:51:36 (всего исправлений: 1)

А ok - не сразу понял в чём дело. Ну, хз. Мне кажется, вполне укладывается [данные -> сериализация (по сути csv c del '|') -> view], ну или вот rb скриптец.


PS: люблю перед сном написать что-нить упоротое…

emulek ★ ( 12.01.15 22:01:55 )
Последнее исправление: emulek 12.01.15 22:06:08 (всего исправлений: 1)

Короч, я за этот гоолосую.

Да, круто, но очень уж, как ты выразился, упорото ))


но очень уж, как ты выразился, упорото

можно и попроще, но выше и без меня сделали.

Изначально парсится огромный .xml, из которого выбираются нужные строки, ну а дальше выдираются три параметра: номер, имя и адрес. Поэтому вывод формируется построчно.
Тот пример, что выше на sed тоже не будет работать, потому что это будет работать только тогда, когда все строки уже находятся в одном файле. Если они выводятся по одной, и после каждой строки стоит column -t -s '|' -n , то общая картина будет беспорядочная. В общем самое простое решение - использование промежуточного файла и полные его вывод в самом конце, типа такого:


Тот пример, что выше на sed тоже не будет работать

мой пример работает тупо построчно.

1. формируется первая колонка в 10 символов в начале строки, пустая, либо с числом.

2. формируется вторая колонка шириной 40 символов в начале строки. Однако эта колонка кончается первым непробельным символом, после которого нет пробелов.

Твой работает, я и не спорил )) А строк в исходном файле может быть больше, чем 100500 раз в пять, серьезно ))

Тот пример, что выше на sed тоже не будет работать, потому что это будет работать только тогда, когда все строки уже находятся в одном файле. Если они выводятся по одной, и после каждой строки стоит column -t -s '|' -n , то общая картина будет беспорядочная.

Самый простой способ — научиться пользоваться перенаправлениями:

Скрипту на вход поступит один непрерывный пайп. Без всяких временных файлов.

О, чёткий скрипт, респект. :D Тоже хотел написать циклом на sed, но поздно вечером не осилил вспомнить, как это делается, и ман читать лень было.


можно не по 1 пробелу добавлять, а сразу добавить 10 пробелов, а потом выдернуть 10 первых символов. Это будет быстрее, но лень жеж.


Изначально парсится огромный .xml, из которого выбираются нужные строки, ну а дальше выдираются три параметра: номер, имя и адрес.

Ну почему не взять python??


Почему? Тут же фиксированные позиции. Всё работает

sdio ★★★★★ ( 13.01.15 09:41:04 )
Последнее исправление: sdio 13.01.15 09:43:03 (всего исправлений: 2)


Более простое форматирование вывода плюс вангую жуткие костыли для парсинга xml в скрипте ТСа (по крайней мере я не нашел легкого варианта парсеров этого формата для bash).

Он уже регэкспами распарсил. А форматированный вывод - тот же printf.


А то что кириллица едет это ничего страшного? Да и регекспами парсить тоже не очень хорошо на мой взгляд.

Ниче страшного. Можно чтоб и не сьезжала. Тут уж какой вариант выберет.

Питон из за регекспов в конечном счете?

А то что кириллица едет это ничего страшного?

Все решаемо. ТС должен заранее описывать диапазон входного текста при задании вопроса, чтобы избежать неверных решений.

Да и регекспами парсить тоже не очень хорошо на мой взгляд.

Не хорошо, но это оффтопик здесь.


Можно указать какие значения из DOM нужно выбрать, без регекспов.

Внутри либы тоже регэкспы. Почему б сразу не выбрать нужные данные, вместо ненужных процедур. Что здесь решается питоном, почему лучше?


Для большей убедительности предлагаю ТСу показать свой скрипт, а я напишу то же самое на python, посмотрим где проще\нагляднее.

Читайте также: