awk命令用法教程:30个文本处理示例

2021年9月15日23:44:04 发表评论 1,254 次浏览

在上一篇文章中,我们谈到了sed 命令用法示例,我们看到了很多在文本处理中使用它的例子,我们看到了它在这方面的好处,但它有一些局限性。有时你需要一些功能强大的东西,让你可以更好地控制处理数据。这就是awk 命令的用武之地。

在这篇awk命令用法教程中,我们可以看到30个处理文本的awk命令用法示例,还可以看到awk 命令或特定的 GNU awk 提供了一种用于文本处理的脚本语言。使用 awk 脚本语言,你可以进行以下操作:

  • 定义变量。
  • 使用字符串和算术运算符。
  • 使用控制流和循环。
  • 生成格式化报告。

如何使用awk命令?实际上,使用awk命令文本处理你可以处理可能包含数百万行的日志文件,以输出你可以从中受益的可读报告。

目录

  • awk 选项
  • 阅读 AWK 脚本
  • 使用变量
  • 使用多个命令
  • 从文件中读取脚本
  • awk 预处理
  • awk 后处理
  • 内置变量
  • 更多变量
  • 用户定义的变量
  • 结构化命令
    • While 循环
    • for 循环
  • 格式化打印
  • 内置函数
    • 数学函数
  • 字符串函数
  • 用户定义函数

awk 选项

awk 命令的用法如下:

$ awk options program file

awk 可以采用以下选项:

-F fs指定文件分隔符。

-f file指定包含 awk 脚本的文件。

-v var=value声明一个变量。

我们将看到如何使用 awk 处理文件和打印结果。

阅读 AWK 脚本

要定义 awk 脚本,请使用由单引号括起来的大括号,如下所示:

$ awk '{print "Welcome to awk command tutorial "}'
awk命令用法教程:30个文本处理示例

如果你输入任何内容,它会返回我们提供的相同欢迎字符串。

要终止程序,请按 Ctrl+D。看起来很棘手,不要惊慌,最好的还在后面。

使用变量

使用 awk,你可以处理文本文件。awk 为找到的每个数据字段分配一些变量:

  • 整行 $0。
  • 第一个字段 $1。
  • $2 用于第二个字段。
  • $n 用于第 n 个字段。

空格或制表符等空白字符是 awk 中字段之间的默认分隔符。

检查这个例子,看看 awk 如何处理它:

$ awk '{print $1}' myfile
awk命令用法教程:30个文本处理示例

上面的例子打印每一行的第一个单词。

有时,某些文件中的分隔符不是空格或制表符,而是其他东西。你可以使用 –F 选项指定它:

$ awk -F: '{print $1}' /etc/passwd
awk命令用法教程:30个文本处理示例

此命令打印 passwd 文件中的第一个字段。我们使用冒号作为分隔符,因为 passwd 文件使用它。

使用多个命令

要运行多个命令,请用分号分隔它们,如下所示:

$ echo "Hello Tom" | awk '{$2="Adam"; print $0}'
awk命令用法教程:30个文本处理示例

第一个命令使 $2 字段等于 Adam。第二个命令打印整行。

从文件中读取脚本

你可以在文件中键入 awk 脚本并使用 -f 选项指定该文件。

我们的文件包含这个脚本:

{print $1 " home at " $6}
$ awk -F: -f testfile /etc/passwd
awk命令用法教程:30个文本处理示例

这里我们从 /etc/passwd 打印用户名和他的主路径,当然分隔符是用大写的 -F 指定的,它是冒号。

你可以像这样编写 awk 脚本文件:

{
 
text = $1 " home at " $6
 
print text  
 
}
$ awk -F: -f testfile /etc/passwd
awk命令用法教程:30个文本处理示例

awk 预处理

如果你需要为结果创建标题或标题。你可以使用 BEGIN 关键字来实现此目的。它在处理数据之前运行:

$ awk 'BEGIN {print "Report Title"}'

让我们把它应用到我们可以看到结果的东西上:

$ awk 'BEGIN {print "The File Contents:"}

{print $0}' myfile
awk命令用法教程:30个文本处理示例

awk 后处理

要在处理数据后运行脚本,请使用 END 关键字:

$ awk 'BEGIN {print "The File Contents:"}

{print $0}' myfile
awk命令用法教程:30个文本处理示例

这很有用,例如,你可以使用它来添加页脚。

让我们将它们组合在一个脚本文件中,如下awk命令用法示例:

BEGIN {

print "Users and thier corresponding home"

print " UserName \t HomePath"

print "___________ \t __________"

FS=":"

}

{

print $1 "  \t  " $6

}

END {

print "The end"

}

首先,顶部部分是使用 BEGIN 关键字创建的。然后我们定义 FS 并在最后打印页脚。

$ awk -f myscript /etc/passwd
awk命令用法教程:30个文本处理示例

awk命令用法教程:内置变量

我们看到数据字段变量$1、$2、$3等用于提取数据字段,我们还处理了字段分隔符FS。

但这些并不是唯一的变量,还有更多的内置变量。

以下列表显示了一些内置变量:

FIELDWIDTHS指定字段宽度。

RS指定记录分隔符。

FS指定字段分隔符。

OFS指定输出分隔符。

ORS指定输出分隔符。

awk命令文本处理:默认情况下,OFS变量是空格,你可以设置OFS变量来指定你需要的分隔符:

$ awk 'BEGIN{FS=":"; OFS="-"} {print $1,$6,$7}' /etc/passwd
awk命令用法教程:30个文本处理示例

有时,字段的分布没有固定的分隔符。在这些情况下, FIELDWIDTHS 变量解决了这个问题。

假设我们有这样的内容:

1235.96521

927-8.3652

36257.8157
$ awk 'BEGIN{FIELDWIDTHS="3 4 3"}{print $1,$2,$3}' testfile
awk命令用法教程:30个文本处理示例

看看输出。输出字段为每行 3 个,每个字段长度完全基于我们由 FIELDWIDTH 分配的内容。

假设你的数据分布在不同的行上,如下所示:

Person Name
123 High Street
(222) 466-1234

Another person
487 High Street
(523) 643-8754

在上面的示例中,awk 无法正确处理字段,因为字段由换行符而不是空格分隔。

你需要将 FS 设置为换行符 (\n),将 RS 设置为空白文本,因此空行将被视为分隔符。

$ awk 'BEGIN{FS="\n"; RS=""} {print $1,$3}' addresses
awk命令用法教程:30个文本处理示例

惊人的!我们可以正确读取记录和字段。

如何使用awk命令?更多变量

还有一些其他变量可以帮助你获取更多信息:

ARGC检索传递参数的数量。

ARGV检索命令行参数。

ENVIRON外壳环境变量和相应值的数组。

FILENAME awk 处理的文件名。

正在处理的行的NF字段计数。

NR检索已处理记录的总数。

FNR 处理的记录。

IGNORECASE忽略字符大小写。

你可以查看之前发布的shell 脚本以了解有关这些变量的更多信息。

让我们测试一下。

$ awk 'BEGIN{print ARGC,ARGV[1]}' myfile
awk命令用法教程:30个文本处理示例

ENVIRON 变量像这样检索 shell 环境变量:

$ awk '

BEGIN{

print ENVIRON["PATH"]

}'
awk命令用法教程:30个文本处理示例

你可以使用没有 ENVIRON 变量的 bash 变量,如下所示:

$  echo | awk -v home=$HOME '{print "My home is " home}'
awk命令用法教程:30个文本处理示例

NF 变量在不知道其位置的情况下指定记录中的最后一个字段:

$ awk 'BEGIN{FS=":"; OFS=":"} {print $1,$NF}' /etc/passwd
awk命令用法教程:30个文本处理示例

如果你像这样键入 NF 变量,则它可以用作数据字段变量:$NF。

下面我们通过这两个例子来了解FNR和NR变量的区别:

$ awk 'BEGIN{FS=","}{print $1,"FNR="FNR}' myfile myfile
awk命令用法教程:30个文本处理示例

在本例中,awk 命令定义了两个输入文件。同一个文件,但处理了两次。输出是第一个字段值和 FNR 变量。

现在,检查 NR 变量并查看差异:

$ awk '

BEGIN {FS=","}

{print $1,"FNR="FNR,"NR="NR}

END{print "Total",NR,"processed lines"}' myfile myfile
awk命令用法教程:30个文本处理示例

当涉及到第二个文件时,FNR 变量变为 1,但 NR 变量保持其值。

用户定义的变量

变量名可以是任何东西,但不能以数字开头。

你可以像在 shell 脚本中一样分配一个变量,如下awk命令用法示例:

$ awk '

BEGIN{

test="Welcome to LikeGeeks website"

print test

}'
awk命令用法教程:30个文本处理示例

结构化命令

awk 脚本语言支持 if 条件语句。

测试文件包含以下内容:

10

15

6

33

45
$ awk '{if ($1 > 30) print $1}' testfile
awk命令用法教程:30个文本处理示例

就这么简单。

如果你想运行多个语句,你应该使用大括号:

$ awk '{

if ($1 > 30)

{

x = $1 * 3

print x

}

}' testfile
awk命令用法教程:30个文本处理示例

你可以使用 else 语句,如下所示:

$ awk '{

if ($1 > 30)

{

x = $1 * 3

print x

} else

{

x = $1 / 2

print x

}}' testfile
awk命令用法教程:30个文本处理示例

或者在同一行输入它们并用分号分隔 if 语句,如下所示:

awk命令用法教程:30个文本处理示例

While 循环

如何使用awk命令?你可以使用 while 循环来迭代具有条件的数据。

cat myfile

124 127 130

112 142 135

175 158 245

118 231 147

$ awk '{

sum = 0

i = 1

while (i < 5)

{

sum += $i

i++

}

average = sum / 3

print "Average:",average

}' testfile
awk命令用法教程:30个文本处理示例

while 循环运行,每次将 sum 变量加 1,直到变量 i 变为 4。

你可以使用 break 命令退出循环,如下awk命令用法示例:

 $ awk '{

tot = 0

i = 1

while (i < 5)

{

tot += $i

if (i == 3)

break

i++

}

average = tot / 3

print "Average is:",average

}' testfile

awk命令用法教程:30个文本处理示例

for 循环

awk命令文本处理:awk 脚本语言支持 for 循环:

$ awk '{

total = 0

for (var = 1; var < 5; var++)

{

total += $var

}

avg = total / 3

print "Average:",avg

}' testfile
awk命令用法教程:30个文本处理示例

awk命令用法教程:格式化打印

awk 中的 printf 命令允许你使用格式说明符打印格式化输出。

格式说明符是这样写的:

%[修饰符]控制字母

此列表显示了可以与 printf 一起使用的格式说明符:

c 将数字输出打印为字符串。

d 打印一个整数值。

e 打印科学数字。

f 打印浮点值。

o 打印一个八进制值。

s 打印文本字符串。

这里我们使用 printf 来格式化我们的输出:

$ awk 'BEGIN{

x = 100 * 100

printf "The result is: %e\n", x

}'
awk命令用法教程:30个文本处理示例

这是打印科学数字的示例。

我们不会尝试每个格式说明符。你知道这个概念。

内置函数

awk 提供了几个内置函数,例如:

数学函数

如果你喜欢数学,你可以在你的 awk 脚本中使用这些函数:

sin(x) | cos(x) | sqrt(x) | exp(x) |log(x) | rand()

它们可以正常使用:

$ awk 'BEGIN{x=exp(5); print x}'

awk命令用法教程:30个文本处理示例

字符串函数

awk命令文本处理:有很多字符串函数,你可以查看列表,但我们将以其中一个为例进行分析,其余的都是一样的:

$ awk 'BEGIN{x = "likegeeks"; print toupper(x)}'
awk命令用法教程:30个文本处理示例

函数 toupper 将传递的字符串的字符大小写转换为大写。

awk命令用法示例:用户定义函数

你可以定义你的函数并像这样使用它们:

$ awk '

function myfunc()

{

printf "The user %s has home path at %s\n", $1,$6

}

BEGIN{FS=":"}

{

myfunc()

}' /etc/passwd
awk命令用法教程:30个文本处理示例

如何使用awk命令?这里我们定义了一个名为 myprint 的函数,然后我们在脚本中使用它来使用 printf 函数打印输出。

我希望你喜欢这篇awk命令用法教程,希望以上内容可以帮助到你,若有任何问题,请在下方评论和分享。

谢谢阅读。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: