awk从入门到入土(12)awk也可以写脚本,替代shell(代码片段)

奇妙之二进制 奇妙之二进制     2022-11-29     292

关键词:

概述

和写 shell 脚本差不多,首先第一行声明解释器路径,例如在我的系统上,awk 工具安装在 /user/bin/awk 目录,所以我的 awk 脚本以如下内容作为开头:

#! /usr/bin/awk -f

上面一行的解释如下:

  • #! ,称为释伴,指明使用那个解释器来执行脚本中的命令;
  • /usr/bin/awk ,即解释器;
  • -f ,解释器选项,用来指定读取的程序文件;

说是这么说,现在从下面的简单例子开始,让我们深入研究一些可执行的 awk 脚本。使用你最喜欢的编辑器创建一个新文件,像下面这样:

$ vi script.awk

然后把下面代码粘贴到文件中:

#!/usr/bin/awk -f
BEGIN  printf "%s\\n","Writing my first awk executable script!" 

保存文件后退出,然后执行下面命令,使得脚本可执行:

$ chmod +x script.awk

然后,执行它:

$ ./script.awk

输出样例:

Writing my first awk executable script!

添加注释

一个严格的程序员一定会问:“注释呢?”。是的,你可以在 awk 脚本中包含注释。在代码中写注释是一种良好的编程习惯。它有利于其它程序员阅读你的代码,理解程序文件或者脚本中每一部分的功能。所以,你可以像下面这样在脚本中增加注释:

#!/usr/bin/awk -f
# 这是如何在 awk 中写注释的示例
# 使用特殊模式 BEGIN 来输出一句话
BEGIN  printf "%s\\n","Writing my first awk executable script!" 

接下来我们看一个读文件的例子。我们想从帐号文件 /etc/passwd 中查找一个叫 aaronkilik 的用户,然后像下面这样打印用户名、用户的 ID、用户的 GID :

下面是我们脚本文件的内容,文件名为 second.awk。

#! /usr/bin/awk -f
# 使用 BEGIN 指定字符来设定 FS 内置变量
BEGIN  FS=":" 
# 搜索用户名 aaronkilik 并输出账号细节
/aaronkilik/  print "Username :",$1,"User ID :",$3,"User GID :",$4 

保存文件后退出,使得脚本可执行,然后像下面这样执行它:

$ chmod +x second.awk
$ ./second.awk /etc/passwd

输出样例:

Username : aaronkilik User ID : 1000 User GID : 1000

在下面最后一个例子中,我们将使用 do while 语句来打印数字 0-10:

下面是我们脚本文件的内容,文件名为 do.awk。

#! /usr/bin/awk -f
#printing from 0-10 using a do while statement
#do while statement
BEGIN 
#initialize a counter
	x=0
	do 
		print x;
		x+=1;
	while(x<=10)

保存文件后,像之前操作一样使得脚本可执行。然后,运行它:

$ chmod +x do.awk
$ ./do.awk

输出样例

0
1
2
3
4
5
6
7
8
9
10

总结

我们已经到达这个精彩的 awk 系列的最后,我希望你从过往的文章中学到了很多知识,把这些当作你 awk 编程语言的入门指导。从一开始就提到过,awk 是一个完整的文本处理语言,所以你可以学习很多 awk 编程语言的其它方面,例如环境变量、数组、函数(内置的或者用户自定义的),等等。

awk从入门到入土(17)awk多行写法(代码片段)

当awk的脚本比较复杂,导致一行写不下或者你想格式优美一些时,可以采用多行写法。1、一条语句战一行,直接回车即可victory@ubuntu:~$ls-l|awk'>print1>'awk识别到’时会自动结束。2、一条独立的语句,需... 查看详情

awk从入门到入土(20)awk解析命令行参数(代码片段)

shell脚本提供了getopt函数可以解析命令行参数,awk自然也不例外。需要@include“getopt”,表示将该getopt.awk文件include进来,这个文件是gawk提供的。victory@victory-ThinkPad-T490:/usr/local/share/awk$ls-altotal120drwxr-xr-x2rootroot40967月2417:18.drwxr-xr-x1... 查看详情

awk从入门到入土(21)awk脚本调试(代码片段)

awk支持调试模式,像gdb一样设置断点、单步调试awk脚本。cmakecommandsDesktopDownloadsetcFlameGraphg.hk.ccllibmain.ccMusicperf.data.oldpolscript.awksnaptest2Videosvictory@victory-ThinkPad-T490:~$catscript.awk#!/usr/bin/awk-fBEGIN for(i=1;i<=5;++i) printivictory@victory-ThinkPad... 查看详情

awk从入门到入土(21)awk脚本调试(代码片段)

awk支持调试模式,像gdb一样设置断点、单步调试awk脚本。cmakecommandsDesktopDownloadsetcFlameGraphg.hk.ccllibmain.ccMusicperf.data.oldpolscript.awksnaptest2Videosvictory@victory-ThinkPad-T490:~$catscript.awk#!/usr/bin/awk-fBEGIN for(i=1;i<=5;++i) printivictory@victory-ThinkPad... 查看详情

awk从入门到入土数组(代码片段)

数组AWK有关联数组这种数据结构,而这种数据结构最好的一个特点就是它的索引值不需要是连续的整数值。我们既可以使用数字也可以使用字符串作为数组的索引。除此之外,关联数组也不需要提前声明其大小,因为... 查看详情

awk从入门到入土awk初次会面(代码片段)

先给大家一个awk的简单实例,带大家了解awk命令的基本结构。1、首次体验先创建一个名为marks.txt的文件。其中包括序列号、学生名字、课程名称与所得分数。1)AmitPhysics802)RahulMaths903)ShyamBiology874)KedarEnglish855)HariHistory89接下来,我... 查看详情

awk从入门到入土(23)awk内置变量argcargc--命令行参数传递(代码片段)

awk可以通过-vvar=value的形式向awk脚本传递变量,除了这种方式之外,还可以直接在awk命令行上直接传递,如:$echoa|gawk\'BEGINfor(i=0;i<ARGC;i++)printARGV[i]\'xxgawkxxawk提供了两个内置变量,ARGC表示命令行参数个数,ARGV是个存放命令行参... 查看详情

文本三剑客之awk-从入门到入土(代码片段)

awk命令格式和选项语法形式awk[options]‘program‘file…Program:patternactionstatements;..命令选项-Ffs??fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:-vvar=value??赋值一个用户定义变量,将外部变量传递给awk-fscripfile?从脚本文件中... 查看详情

awk从入门到入土(14)awk输出重定向(代码片段)

到目前为止,我们的AWK程序都是把结果输出到标准输出上。虽然AWK程序没有打开文件/读写文件等相应的功能,但AWK程序同样支持重定向操作,也就是支持把数据输出到文件上。AWK的重定向操作一般出现在print或printf语... 查看详情

awk从入门到入土正则匹配(代码片段)

awk的pattern除了使用简单的条件表达式之外,还可以用正则表达式。AWK可以方便高效地处理正则表达式。大量复杂的任务都可以由极其简单的正则表达式来解决。每一个精通命令行的人都知道正则表达式真正的威力所在。这一... 查看详情

awk从入门到入土简单条件匹配(代码片段)

我们之前一直在提,awk的使用语法如下(我想你已经很熟悉了):awk[options]‘patternAction’file1file2···对于options(选项)而言,我们使用过-F选项,也使用过-v选项。对于Action(动作)而言,我们使用过print与printf,之后的文章中... 查看详情

awk从入门到入土(15)awk执行外部命令(代码片段)

这里的外部命令,是指shell命令。方法1如果不需要获取命令的输出而只是需要执行命令可以使用system()函数。#!/usr/bin/awk-fBEGINsystem("touchtest");命令字符串必须由“”括起来。甚至还能判断命令是否成功执行:BEGINfold&#... 查看详情

awk从入门到入土(16)awk综合案例(代码片段)

准备好以下log,xxx@tegra-ubuntu:~$catlog(1658413180.629040)can0047C0003[8]DC28846851E405F6(1658413180.729148)can0047C0003[8]30B0856851E405F7 查看详情

awk从入门到入土认识awk内置变量和变量的使用

学习任何一门语言都是从变量开始。内置变量表属性说明$0当前记录(作为单个变量)$1~$n当前记录的第n个字段,字段间由FS分隔FS输入字段分隔符默认是空格NF当前记录中的字段个数,就是有多少列NR已经读出的记录数,就是行... 查看详情

awk从入门到入土(23)awk内置变量argcargc--命令行参数传递(代码片段)

awk可以通过-vvar=value的形式向awk脚本传递变量,除了这种方式之外,还可以直接在awk命令行上直接传递,如:$echoa|gawk\'BEGINfor(i=0;i<ARGC;i++)printARGV[i]\'xxgawkxxawk提供了两个内置变量,ARGC表示命令行参数个数,ARGV是个存放命令行参... 查看详情

awk从入门到入土用户自定义变量(代码片段)

无类型BEGINnum=100;#先存个整数print("numis:"num);num=3.1415926;#再来存个浮点数print("numis:"num);num="I'mstring.";#最后看看字符串print("numis:"num);END$echo“”|awk-fchapter_2_2-1.awknumis:100numis:3.14159numis:I’mstring.awk... 查看详情

awk从入门到入土(19)awk扩展插件,让awk如虎添翼(代码片段)

文章目录1、时间插件2、文件读取3、字符和accsi码的相互转换4、编辑的结果直接更新到文件1、时间插件@load“time”gettimeofday()返回自1970-1-1至今的秒数result=sleep(seconds)seconds是个浮点数2、文件读取@load“readfile”result=readfile(“/some/... 查看详情

awk从入门到入土(11)awkgetline函数详解(代码片段)

**getline命令是我个人认为awk最强大的一个命令。因为它彻底改变了awk的运行逻辑。**awk本质上就是一个for循环,它每次对输入文件的一行进行处理,然后转而执行下一行,直到整个文件的每一行都被执行完毕。整个过... 查看详情