Linux 文本格式化

LinuxLinuxBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

文本格式化是 Linux 用户和系统管理员的一项基本技能。以结构化、易读的格式呈现数据的能力,对于创建报告、整理输出以及让信息更易于理解至关重要。

在这个实验中,你将学习如何使用 printf 命令,它是 Linux 中一个强大的文本格式化工具。你将探索各种格式化技术,包括字段对齐、宽度指定、数字格式化以及使用转义序列。这些技能将帮助你为脚本、数据处理和系统管理任务创建结构良好的输出。

printf 基础介绍

Linux 中的 printf 命令用于格式化和打印数据。与较为简单的 echo 命令不同,printf 能让你精确控制文本的显示方式。

在这一步,你将学习 printf 命令的基本语法,并创建你的第一个格式化输出。

首先,导航到你的项目目录:

cd ~/project/text_formatting

printf 的基本语法如下:

printf "format" arguments

其中:

  • "format" 是一个包含文本和格式说明符的字符串
  • 格式说明符以 % 开头,用于定义参数的格式化方式
  • 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) 以 YYYY-MM-DD 格式获取当前日期
  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 将数字显示为 5 位十进制整数,前面用零填充

输出:

Decimal: 42, Padded: 00042

对于浮点数,你可以使用 %f 并控制精度:

printf "Float: %f, Rounded: %.2f\n" 3.14159 3.14159 >> numerical_data.txt
cat numerical_data.txt

在这个示例中:

  • %f 显示完整的浮点数
  • %.2f 显示四舍五入到小数点后 2 位的浮点数

现在完整的文件内容如下:

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 和内存值
  • 带有居中文本的标题
  • 列对齐的表格数据

这个示例展示了你所学的格式化技术如何应用于创建清晰、易读的系统信息报告输出。

总结

在这个实验中,你学习了如何在 Linux 中使用 printf 命令进行文本格式化。你练习了:

  1. 基本的 printf 语法和字符串格式化
  2. 控制字段宽度和对齐方式,以获得清晰的表格输出
  3. 格式化不同类型的数字,包括整数和浮点值
  4. 使用转义序列在输出中包含特殊字符
  5. 结合这些技术创建实用的系统信息报告

这些文本格式化技巧对于在 shell 脚本中创建易读的输出、生成报告以及在终端中组织信息至关重要。printf 命令让你能够精确控制文本的显示方式,使其成为 Linux 用户和系统管理员的强大工具。

在你继续探索 Linux 的过程中,你会发现这些格式化技术对于在脚本和命令行应用程序中清晰、专业地呈现数据非常有价值。