📜  Linux 中的 gawk 命令和示例(1)

📅  最后修改于: 2023-12-03 14:43:56.593000             🧑  作者: Mango

Linux 中的 gawk 命令和示例

gawk 是在 Unix 和 Linux 系统上一个非常常见的文本处理工具,它的全称是 GNU awk,是 GNU 项目的一部分,是 awk 的一个版本,awk 是处理文本的一种编程语言。gawk 命令行工具可以用于编写简单脚本或者命令行中直接使用,可用于快速处理和转化文本数据。本文将介绍 gawk 工具的常用方式和示例。

基础使用

gawk 命令的基础格式如下:

gawk [选项] [脚本] [文件...]

其中,[选项] 是可选的,[脚本] 是包含 awk 命令的程序,[文件] 是将要处理的文本文件的列表。

gawk 命令可以根据指定的程序来处理输入,也可以在命令行上直接使用 awk 语句来处理文本。下面的示例展示了通过 gawk 命令直接处理文本的方式。

假设我们有一个文本文件 file.txt,内容如下:

apple 100
orange 200
banana 150

我们想要把其中每行第二个单词的值加上 10,可以使用以下命令:

gawk '{ $2 += 10; print }' file.txt

输出结果为:

apple 110
orange 210
banana 160

在上面的命令中,{ $2 += 10; print } 是 awk 语句,$2 表示第二个单词,+= 表示加上一个数,print 表示输出行。

常用选项

gawk 命令提供多个选项来控制输入、输出以及处理方式,下面是常用的一些选项:

  • -F--field-separator:指定字段分隔符,默认是空格或制表符。
  • -f--file:指定存放 awk 程序的文件。
  • -v--assign:指定一个变量并赋值。
  • -o--pretty-print:输出整齐格式化的调试信息。

下面是一些常见的选项使用示例。

指定字段分隔符

假设我们有一个 CSV 文件 data.csv,内容如下:

name,age,gender
Tom,20,Male
Lucy,18,Female
Jerry,22,Male

我们想要输出每行的第二个单词,可以使用 -F 选项来指定逗号为字段分隔符:

gawk -F, '{ print $2 }' data.csv

输出结果为:

age
20
18
22
指定 awk 程序文件

我们也可以把 awk 程序存放到文件中,然后通过 -f 选项来指定文件名。假设我们有一个存放 awk 程序的文件 test.awk,内容如下:

{
  if ($2 > 100) {
    print $1 " passed the test."
  } else {
    print $1 " failed the test."
  }
}

我们可以使用以下命令来执行:

gawk -f test.awk file.txt

假设 file.txt 内容如下:

apple 100
orange 200
banana 150

则输出结果为:

apple failed the test.
orange passed the test.
banana passed the test.
指定变量赋值

我们可以使用 -v 选项来指定 awk 中变量赋值。下面的例子中,我们定义了变量 threshold 并赋值为 100,然后在 awk 程序中使用这个变量。

假设我们有一个文本文件 file.txt,内容如下:

apple 100
orange 200
banana 150

我们想要输出其中值大于 threshold 的行的第一个单词,可以使用以下命令:

gawk -v threshold=100 '$2 > threshold { print $1 }' file.txt

输出结果为:

orange
banana
更多示例
统计文件行数

统计文件行数是 awk 常见的用途之一。假设我们有一个文件 file.txt,我们可以使用以下命令来统计行数:

gawk 'END { print NR }' file.txt

其中,NR 是内置变量,表示处理的行数。上面的命令会输出 file.txt 中的行数。

计算文件总和

下面是一个计算文件总和的 awk 程序:

{
  sum += $1
}
END {
  print sum
}

在这个程序中,我们定义了变量 sum,然后逐行读取文件,把第一个单词的值加到 sum 中。在处理完所有行之后,awk 会输出 sum 的值。

如果我们有一个文件 data.txt,内容如下:

1
2
3

我们可以使用以下命令来计算这个文件中所有数字的和:

gawk -f sum.awk data.txt

其中,sum.awk 是存放上面 awk 程序的文件。

把格式化输出转换为 CSV 文件

假设我们有一个重定向到文件的 printf 命令的输出:

printf 'aaa bbb\nccc ddd\n'

输出结果为:

aaa bbb
ccc ddd

我们可以使用以下命令来把这个输出转换为 CSV 格式:

printf 'aaa bbb\nccc ddd\n' | gawk '{ print "\"" $1 "\",\"" $2 "\"" }'

输出结果为:

"aaa","bbb"
"ccc","ddd"

在上面的 awk 程序中," 表示双引号,\ 表示转义符,$1$2 分别表示行中的第一个单词和第二个单词。

结论

本文介绍了 gawk 命令的基础使用和常用选项,并提供了实用示例。gawk 是一个强大的文本处理工具,能够处理各种类型的文本数据,对于程序员而言非常有用。