// Linux · 2025-01-20

深入解析 awk 的 print 和 printf 函数

一、print 函数

print 是 awk 中最常用的输出函数,它可以将指定的变量、字段或表达式的值输出到标准输出。

1. 基本语法

print [expr1], [expr2], ..., [exprN]
  • expr1, expr2, ..., exprN:是要输出的表达式,可以是字段(如 $1, $2 等)或其他变量。
  • 默认情况下,print 会将表达式的结果按空格分隔输出。

2. 输出字段

在 awk 中,字段是由空格或制表符分隔的文本部分,可以通过 $1, $2 等变量来引用这些字段。例如:

echo "Hello World" | awk '{ print $1, $2 }'

输出结果:

Hello World

在上面的例子中,$1 和 $2 分别代表输入文本中的第一个和第二个字段,print 函数将它们按空格分隔打印出来。

3. 使用 print 进行字符串拼接

虽然 print 默认会将表达式间用空格分隔,但我们可以通过在表达式中加入字符串运算符来拼接字符串。

echo "John 25" | awk '{ print $1 " is " $2 " years old" }'

输出结果:

John is 25 years old

在上面的示例中,$1 和 $2 被拼接成一个完整的句子。注意,字符串拼接时不需要使用显式的运算符(如 +)。只需要通过将字符串和字段或其他字符串直接写在一起,awk 会自动将它们连接。

4. 使用 print 输出换行符

print 默认在每次输出后会自动加上一个换行符。如果我们不希望输出换行符,可以使用 ORS(Output Record Separator)来控制。

echo "apple banana cherry" | awk '{ print $1; print $2; print $3 }'

输出结果:

apple
banana
cherry

若想避免换行,可以修改 ORS:

echo "apple banana cherry" | awk 'BEGIN { ORS=" " } { print $1; print $2; print $3 }'

输出结果:

apple banana cherry

5. 易混易错辨析:print、print x 和 print $0

在 awk 中,print、print x 和 print $0 都是输出命令,但它们的含义有所不同:

  1. print
    当使用 print 时,awk 默认会打印当前记录的整个内容,即打印整行,等同于 print $0。这种写法通常用于简单的输出当前行的所有字段。

    示例:

    awk '{print}' file

    这会打印文件中的每一行。

  2. print x
    这里的x代表一个未定义的变量。处理未定义变量时,awk 会默认将其值视为一个空字符串或者数字 0。0 是一个常量,它会被直接输出,而不是打印整行或字段。

    示例:

    awk '{print xxoo}' file

    这会在每一行的输出中打印数字 0。

  3. print $0
    print $0 会打印当前行的所有内容(即 awk 默认的行为)。$0 表示当前行的完整文本,所以这个命令与 print 的行为相同。

    示例:

    awk '{print $0}' file

    这会打印文件中的每一行,和 print 等价。


二、printf 函数

printf 函数是一个格式化输出函数,它与 C 语言中的 printf 类似,可以让我们更精细地控制输出格式。相比于 print,printf 提供了更多的选项来指定字段的宽度、对齐方式、精度等。

1. 基本语法

printf format, expr1, expr2, ..., exprN
  • format:指定输出格式的字符串,类似于 C 语言中的格式字符串。
  • expr1, expr2, ..., exprN:要输出的表达式。

与 print 不同的是,printf 结尾不会自动输出换行符。

2. 格式化字符串

printf 的一个重要特性是可以指定输出格式。常见的格式控制符包括:

  • %s:字符串
  • %d:整数
  • %f:浮动小数
  • %x:十六进制整数
  • %g:最简洁的浮动小数格式

例如,打印一个整数和浮动小数:

echo "3.14159 42" | awk '{ printf "Pi is %.2f, and the answer is %d\n", $1, $2 }'

输出结果:

Pi is 3.14, and the answer is 42

3. 使用 printf 控制输出宽度与对齐

printf 还支持对输出的宽度、对齐方式进行控制。我们可以指定输出字段的最小宽度,awk 会根据需要在字段内容前后填充空格来满足宽度要求。

  • %10s:输出宽度为 10 的字符串,默认右对齐。
  • %-10s:输出宽度为 10 的字符串,左对齐。

例如:

echo "apple banana cherry" | awk '{ printf "%-10s %-10s %-10s\n", $1, $2, $3 }'

输出结果:

apple      banana     cherry     

在这个例子中,%-10s 表示每个字段占据 10 个字符的宽度,且左对齐。

4. 字符串拼接与格式化输出

printf 还支持将字符串拼接并格式化输出。比如,打印一个拼接后的字符串并控制格式:

echo "John 25" | awk '{ printf "%s is %d years old\n", $1, $2 }'

输出结果:

John is 25 years old

此例中,我们通过 %s 和 %d 控制字符串和数字的输出格式。


三、print vs printf

  • print 更适合快速的输出,尤其是对于简单的文本打印,print 是一个简洁而有效的选择。
  • printf 更强大,适用于需要复杂格式化输出的场景,比如表格、对齐和数值格式化。

使用场景对比

  • 简单输出:如果只需要输出文本或字段,不关心格式,可以使用 print。
  • 复杂格式输出:如果需要控制输出的精确格式,尤其是在数值、日期、表格等方面,使用 printf 更为合适。

四、总结

awk 中的 print 和 printf 都是非常有用的输出函数,但它们各自有不同的特点。print 适合于快速的输出,而 printf 提供了更多的格式化控制,适用于复杂的输出需求。通过掌握这两个函数的使用,您可以更加灵活地处理和输出文本数据,满足各种格式化输出的需求。

原文 https://blog.csdn.net/2301_79518550/article/details/145267795