@RomanFrAmM

Как изменить вывод баш скирпта?

Есть скрипт в котором несколько переменных выводят на экран информацию, со временем переменных стало больше и информация не помещается на экране. Приходиться скролить. Вопрос как сделать так что бы вывод данных размещался по всему экрану. В качестве наглядного примера:
#!/bin/bash
V1=$(hostnamectl)
V2=$(hostnamectl)
echo  "$V1  $V2"


А хочется что бы было так:
Static hostname: PC                        Static hostname: PC  
Icon name: computer-vm                Icon name: computer-vm
Chassis: vm                                     Chassis: vm
 ...                                                     ...


а не так:

Static hostname: PC                              
         Icon name: computer-vm              
           Chassis: vm                                    
       ...                                                        
Static hostname: PC                              
         Icon name: computer-vm              
           Chassis: vm                                    
       ...
  • Вопрос задан
  • 147 просмотров
Пригласить эксперта
Ответы на вопрос 2
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
учим следующие команды
sed, grep, awk

учим regexp

режем вывод как хотим и кастомизируем.
Ответ написан
Комментировать
xotkot
@xotkot
хорошо есть и хорошо весьма
если у вас там команды с многострочным выводом, по типу файлов, то для того чтобы это вывести обычно нужно пройти два этапа:
первый, это построчное объединение файлов/переменных с нужным разделителем
второе, это уже непосредственный отформатированный вывод по указанному выше разделителю.
рассмотрим ваш пример с командой hostnamectl
для построчного объединения можно использовать стандартную утилиту paste
paste file1 file2
где вместо файлов подставим вывод наших команд
paste <(hostnamectl) <(hostnamectl)
но в таком виде оно просто сольёт строки, а нам их нужно как-то различать в одной строке, если внутри вывода команд не используется символ ';' то возьмём его в качестве разделителя, то есть нам нужно в конец file1(ну или вывода команды) добавить окончание в виде точки с запятой ';'
делается это просто с помощью того же awk
hostnamectl |awk '{print $0";"}'
в общем виде будет выглядеть так:
paste <(hostnamectl |awk '{print $0";"}') <(hostnamectl)


то есть, по сути, мы получили структурированный текстовый формат по типу CSV/TSV с разделителем в виде ';'
а вывести подобное довольно просто, так как для этого есть много разных консольных утилит, начиная от стандартной линуксовой column
paste <(hostnamectl |awk '{print $0";"}') <(hostnamectl) | column -t -s';'

и заканчивая внешней утилитой csview с рамочками и блэкджеком:
paste <(hostnamectl |awk '{print $0";"}') <(hostnamectl) | csview -H -d';'

хотя в последнем варианте можно сократить до
paste <(hostnamectl) <(hostnamectl) | csview -H --tsv

так как paste добавляет еще табуляцию как разделитель
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы