文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

提升效率必备!学习 awk 命令,轻松搞定数据

2024-11-29 18:48

关注

awk选项

awk 命令的使用方式如下:

awk options program file

awk 可以采用以下选项:

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

读取AWK脚本

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

awk '{print "Welcome to awk command tutorial "}'

如果您键入任何内容,它将返回我们提供的相同欢迎字符串。如下图所示:

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

使用变量

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

在awk中,空格或制表符等空白字符是字段之间的默认分隔符。看看这个例子,看看awk是如何处理它的:

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

有时某些文件中的分隔符不是空格或tab,而是其他内容。您可以使用–F选项指定它:

awk -F ':' '{print $1}' /etc/passwd

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

使用多个命令

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

root@didiplus:~# echo "Hello Tom" | awk '{$2="Adam"; print $0}'
Hello Adam

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

从文件中读取脚本

您可以在文件中键入awk脚本,并使用 -f 选项指定该文件。我们的文件包含以下脚本:

{print $1 " home at " $6}
 awk -F: -f testfile /etc/passwd

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

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

{
text = $1 " home at " $6
print t

awk预处理

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

awk 'BEGIN {print "this Title"} {print $0}' myfile

执行上述代码输入如下图的结果:

awk后处理

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

awk 'BEGIN {print "this Title"} {print $0} END {print "this footer"}' myfile

执行上述代码输出如下图的结果:

这很有用,例如,您可以使用它来添加页脚。让我们将它们组合到一个脚本文件中:

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

内置变量

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

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

下面列出了一些内置变量:

默认情况下,OFS变量是空格,你可以设置OFS变量来指定你需要的分隔符:

awk 'BEGIN {FS=":";OFS="---"} {print $1,$6,$7}' /etc/passwd

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

假设我们有以下内容:

1235.96521
927-8.3652
36257.8157
awk 'BEGIN{FIELDWIDTHS="3 4 3"}{print $1,$2,$3}' testfile

查看输出。输出字段为每行3个,每个字段长度都基于我们由FIELDWIDTH分配的字段。

更多的变量

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

IGNORECASE:忽略字符的大小写。

让我们测试一下。

root@didiplus:~#  awk 'BEGIN{print ARGC,ARGV[1]}' myfile
2 myfile

ENVIRON变量检索shell环境变量,如下所示:

root@didiplus:~# awk 'BEGIN {print ENVIRON["PATH"]}'
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

您可以使用不带ENVIRON变量的 bash 变量,如下所示:

root@didiplus:~# echo | awk -v home=$HOME '{print "My home is" home}'
My home is/root

NF变量指定记录中的最后一个字段,但不知道其位置:

awk 'BEGIN{FS=":"; OFS=":"} {print $1,$NF}' /etc/passwd

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

让我们看一下这两个例子来了解FNR和NR变量之间的区别:

awk 'BEGIN{FS=","}{print $1,"FNR="FNR}' myfile myfile

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

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

$ awk '
BEGIN {FS=","}
{print $1,"FNR="FNR,"NR="NR}
END{print "Total",NR,"processed lines"}' myfile myfile

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

用户自定义变量

变量名称可以是任何内容,但不能以数字开头。您可以像在shell脚本中一样分配变量,如下所示:

awk '
BEGIN{
test="Welcome to LikeGeeks website"
print test
}'

执行上述命令后,输出如下结果:

结构化命令

1.if循环

awk脚本语言支持if条件语句。testfile包含以下内容:

10
15
6
33
45
root@didiplus:~# awk '{if ($1 > 30) print $1}' testfile
33
45

如果要运行多个语句,则应使用大括号:

root@didiplus:~# awk '{
if ($1 > 30)
{
x = $1 * 3
print x
}
}' testfile
99

您可以使用如下所示的else语句:

root@didiplus:~# awk '{
if ($1 > 30)
{
x = $1 * 3
print x
} else
{
x = $1 / 2
print x
}}' testfile
5
7.5
3
99
135

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

root@didiplus:~# awk '{ if ($1>20) print $1*2;else print $1/2}' testfile
5
7.5
3
66
90

2.while循环

您可以使用while循环遍历具有条件的数据。

awk '{
sum = 0
i = 1
while (i < 5)
{
sum += $i
i++
}

average = sum / 3
print "Average:",average
}' testfile

您可以使用break命令退出循环,如下所示:

awk '{
sum = 0
i = 1
while (i < 5)
{
sum += $i
if (i == 3) 
break
i++
}
average = sum / 3
print "Average:",average
}' testfile

结果还是和上面的输出的一样。

3.for循环

awk脚本语言支持for循环:

awk '{
total = 0
for (var = 1; var < 5; var++)
{
total += $var
}
avg = total / 3
print "Average:",avg

}' testfile

格式化打印

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

格式说明符如下所示:

%[modifier]control-letter

下面列出了可用于printf的格式说明符:

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

awk 'BEGIN{
x = 100 * 100
printf "The result is: %e\n", x
}'

内置函数

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

1.数学函数

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

而且它们可以正常使用:

root@didiplus:~# awk 'BEGIN{x=exp(5); print x}'
148.413

2.字符串函数

有很多字符串函数,你可以查看列表,但我们将其中一个作为示例来研究,其余的都是一样的:

root@didiplus:~# awk 'BEGIN{x = "likegeeks"; print toupper(x)}'
LIKEGEEKS

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

3.用户自定义函数

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

awk '
function myfunc()
{
printf "The user %s has home path at %s\n", $1,$6
}

BEGIN{FS=":"}
{
myfunc()
}' /etc/passwd

在这里,我们定义了一个名为myprint的函数,然后在脚本中使用它通过printf函数打印输出。

总结

AWK是一款功能强大的数据处理工具,它能够高效地处理复杂的文本文件和数据集。无论你是需要处理日志、统计数据,还是生成格式化的报表,AWK都能轻松胜任。通过熟练掌握AWK命令,你可以极大提升工作效率,轻松应对各种数据处理任务。

来源:攻城狮成长日记内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯