Введение
Форматирование текста является фундаментальным навыком для пользователей Linux и системных администраторов. Возможность представлять данные в структурированном, удобочитаемом формате является важной для создания отчетов, организации вывода и упрощения понимания информации.
В этом практическом занятии (лабораторной работе) вы научитесь использовать команду printf, которая представляет собой мощный инструмент для форматирования текста в Linux. Вы изучите различные техники форматирования, включая выравнивание полей, указание ширины, форматирование чисел и использование управляющих последовательностей. Эти навыки помогут вам создавать хорошо структурированный вывод для скриптов, обработки данных и задач системного администрирования.
Введение в основы printf
Команда printf в Linux используется для форматирования и печати данных. В отличие от более простой команды echo, printf предоставляет вам точный контроль над тем, как отображается ваш текст.
В этом шаге вы изучите базовый синтаксис команды printf и создадите свой первый отформатированный вывод.
Сначала перейдите в каталог вашего проекта:
cd ~/project/text_formatting
Базовый синтаксис printf выглядит следующим образом:
printf "format" arguments
Где:
- "format" – это строка, содержащая текст и спецификаторы формата (format specifiers)
- Спецификаторы формата начинаются с
%и определяют, как должны быть отформатированы аргументы - arguments – это значения, которые нужно отформатировать
Давайте создадим простой пример:
printf 'Hello, %s!\n' "World"
В этой команде:
%s– это спецификатор формата для строк- "World" – это аргумент, который заменяет
%s \nдобавляет новую строку в конце
Вы должны увидеть следующий вывод:
Hello, World!
Теперь попробуйте использовать несколько аргументов:
printf 'Name: %s, Role: %s\n' "Alice" "Engineer"
Вывод:
Name: Alice, Role: Engineer
Давайте сохраним отформатированный текст в файл:
printf 'Today_s date: %s\n' "$(date +%Y-%m-%d)" > date.txt
cat date.txt
Эта команда:
- Использует
$(date +%Y-%m-%d)для получения текущей даты в формате ГГГГ-ММ-ДД - Форматирует ее с помощью
printf - Сохраняет вывод в файл с именем
date.txt - Отображает содержимое файла
Форматирование строк с указанием ширины и выравнивания
При отображении данных в столбцах или таблицах важным становится контроль ширины и выравнивания текста. На этом этапе вы узнаете, как задавать ширину поля и выравнивание для строковых данных.
Спецификатор формата для строк с контролем ширины имеет следующий шаблон:
%[flags][width]s
Где:
[width]задает минимальную ширину поля[flags]контролирует выравнивание и другие параметры (- для выравнивания по левому краю)
Создадим файл с отформатированными столбцами:
touch formatted_names.txt
printf "%-15s %-10s %s\n" "First Name" "Last Name" "Department" >> formatted_names.txt
printf "%-15s %-10s %s\n" "John" "Smith" "Engineering" >> formatted_names.txt
printf "%-15s %-10s %s\n" "Mary" "Johnson" "Marketing" >> formatted_names.txt
printf "%-15s %-10s %s\n" "Robert" "Williams" "Finance" >> formatted_names.txt
cat formatted_names.txt
В этом примере:
%-15sформатирует первый столбец как строку, выровненную по левому краю, с шириной в 15 символов%-10sформатирует второй столбец как строку, выровненную по левому краю, с шириной в 10 символов%sформатирует третий столбец как обычную строку\nдобавляет новую строку в конце
Вывод будет представлять собой аккуратную таблицу с выровненными столбцами:
First Name Last Name Department
John Smith Engineering
Mary Johnson Marketing
Robert Williams Finance
Чтобы увидеть разницу между выравниванием по левому и правому краю, попробуйте следующее:
printf "Left aligned: '%-10s'\n" "text"
printf "Right aligned: '%10s'\n" "text"
Вывод:
Left aligned: 'text '
Right aligned: ' text'
Форматирование чисел и десятичных значений
Команда printf предоставляет различные параметры для форматирования чисел, включая целые и вещественные значения. На этом этапе вы узнаете, как контролировать отображение числовых данных.
Для целых чисел базовым спецификатором формата является %d. Создадим файл с отформатированными числами:
touch numerical_data.txt
printf "Decimal: %d, Padded: %05d\n" 42 42 > numerical_data.txt
cat numerical_data.txt
В этом примере:
%dотображает число как простое десятичное целое число%05dотображает число как пятизначное десятичное целое число, дополненное ведущими нулями
Вывод:
Decimal: 42, Padded: 00042
Для вещественных чисел можно использовать %f и контролировать точность:
printf "Float: %f, Rounded: %.2f\n" 3.14159 3.14159 >> numerical_data.txt
cat numerical_data.txt
В этом примере:
%fотображает полное вещественное число%.2fотображает вещественное число, округленное до двух десятичных знаков
Теперь полный файл содержит:
Decimal: 42, Padded: 00042
Float: 3.141590, Rounded: 3.14
Вы также можете форматировать числа в различных системах счисления:
printf "Decimal: %d, Hexadecimal: %x, Octal: %o\n" 16 16 16 >> numerical_data.txt
cat numerical_data.txt
Добавленный в файл вывод:
Decimal: 16, Hexadecimal: 10, Octal: 20
Использование управляющих последовательностей
Управляющие последовательности в команде printf позволяют включать специальные символы и управляющие коды в отформатированный текст. На этом этапе вы узнаете, как использовать различные управляющие последовательности.
К распространенным управляющим последовательностям относятся:
\n- Новая строка\t- Табуляция\"- Двойная кавычка\\- Обратный слеш\b- Возврат на одну позицию
Создадим файл с примерами управляющих последовательностей:
touch escape_sequences.txt
printf "Lines:\nFirst line\nSecond line\n" > escape_sequences.txt
printf "Tabs:\tColumn1\tColumn2\tColumn3\n" >> escape_sequences.txt
printf "Quotes: \"quoted text\"\n" >> escape_sequences.txt
cat escape_sequences.txt
Вывод показывает, как работают эти управляющие последовательности:
Lines:
First line
Second line
Tabs: Column1 Column2 Column3
Quotes: "quoted text"
Спецификатор формата %b позволяет интерпретировать управляющие последовательности в аргументах:
printf "%b" "Newline: \\n becomes a\nnew line\n" >> escape_sequences.txt
cat escape_sequences.txt
Спецификатор %b также полезен для интерпретации шестнадцатеричных управляющих последовательностей, представляющих символы ASCII или Unicode:
printf "ASCII: %b\n" "\x48\x65\x6c\x6c\x6f" >> escape_sequences.txt
cat escape_sequences.txt
Вывод:
ASCII: Hello
Создание отчета с форматированием
На этом последнем этапе вы сочетаете изученные техники для создания хорошо отформатированного отчета. Это продемонстрирует, как эти навыки форматирования могут быть применены в практических сценариях.
Создадим скрипт, который генерирует отчет о системе:
touch system_report.sh
chmod +x system_report.sh
Откройте файл скрипта с помощью nano:
nano system_report.sh
Добавьте следующее содержимое в скрипт:
#!/bin/bash
## Define the output file
report_file="system_report.txt"
## Clear any existing report
> $report_file
## Add formatted header
printf "=======================================\n" >> $report_file
printf " %s \n" "SYSTEM INFORMATION REPORT" >> $report_file
printf " %s \n" "Generated on: $(date)" >> $report_file
printf "=======================================\n\n" >> $report_file
## CPU Information
printf "%-15s %s\n" "CPU:" "$(grep "model name" /proc/cpuinfo | head -1 | cut -d: -f2 | sed 's/^[ \t]*//')" >> $report_file
## Memory Information
total_mem=$(free -m | grep Mem | awk '{print $2}')
used_mem=$(free -m | grep Mem | awk '{print $3}')
printf "%-15s %d MB (Used: %d MB)\n" "Memory:" $total_mem $used_mem >> $report_file
## Disk Information
disk_info=$(df -h / | tail -1)
disk_size=$(echo $disk_info | awk '{print $2}')
disk_used=$(echo $disk_info | awk '{print $3}')
disk_percent=$(echo $disk_info | awk '{print $5}')
printf "%-15s %s (Used: %s, %s)\n" "Disk Space:" $disk_size $disk_used $disk_percent >> $report_file
## System Uptime
uptime_info=$(uptime -p)
printf "%-15s %s\n" "Uptime:" "$uptime_info" >> $report_file
## Add a table of processes
printf "\n%-6s %-10s %-8s %-6s %s\n" "PID" "USER" "CPU%" "MEM%" "COMMAND" >> $report_file
printf "%-6s %-10s %-8s %-6s %s\n" "--" "----" "----" "----" "-------" >> $report_file
## Get top 5 processes by CPU usage
ps aux --sort=-%cpu | head -6 | tail -5 | while read line; do
pid=$(echo $line | awk '{print $2}')
user=$(echo $line | awk '{print $1}')
cpu=$(echo $line | awk '{print $3}')
mem=$(echo $line | awk '{print $4}')
cmd=$(echo $line | awk '{print $11}')
printf "%-6s %-10s %-8.1f %-6.1f %s\n" "$pid" "$user" "$cpu" "$mem" "$cmd" >> $report_file
done
echo "Report generated: $report_file"
Сохраните и выйдите из nano (нажмите Ctrl+O, затем Enter, а затем Ctrl+X).
Запустите скрипт для генерации отчета:
./system_report.sh
Просмотрите сгенерированный отчет:
cat system_report.txt
В отчете используются различные техники форматирования:
- Ширина полей и выравнивание для организованного представления данных
- Форматирование чисел для значений CPU и памяти
- Заголовки с центрированным текстом
- Табличные данные с выровненными столбцами
В этом примере показано, как изученные техники форматирования могут быть применены для создания четкого и читаемого вывода при отчетности о системе.
Резюме
В этом практическом занятии вы научились использовать команду printf для форматирования текста в Linux. Вы практиковали:
- Базовый синтаксис
printfи форматирование строк - Управление шириной полей и выравниванием для создания чистого табличного вывода
- Форматирование различных типов чисел, включая целые и вещественные значения
- Использование управляющих последовательностей для включения специальных символов в вывод
- Сочетание этих техник для создания практического отчета о системе
Эти навыки форматирования текста являются важными для создания читаемого вывода в шелл-скриптах, генерации отчетов и организации информации в терминале. Команда printf позволяет вам точно контролировать, как ваш текст отображается, что делает ее мощным инструментом для пользователей Linux и системных администраторов.
По мере продвижения в изучении Linux вы обнаружите, что эти техники форматирования будут ценными для ясного и профессионального представления данных в ваших скриптах и приложениях командной строки.



