Форматирование текста в Linux

LinuxLinuxBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Форматирование текста является фундаментальным навыком для пользователей 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

Эта команда:

  1. Использует $(date +%Y-%m-%d) для получения текущей даты в формате ГГГГ-ММ-ДД
  2. Форматирует ее с помощью printf
  3. Сохраняет вывод в файл с именем date.txt
  4. Отображает содержимое файла

Форматирование строк с указанием ширины и выравниванием

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

Спецификатор формата для строк с контролем ширины имеет следующий шаблон:
%[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. Вы практиковали:

  1. Базовый синтаксис printf и форматирование строк
  2. Управление шириной полей и выравниванием для создания чистого табличного вывода
  3. Форматирование различных типов чисел, включая целые и вещественные значения
  4. Использование управляющих последовательностей для включения специальных символов в вывод
  5. Сочетание этих техник для создания практического отчета о системе

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

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