九、shell编程之awk 上

本文详细介绍了awk命令的工作流程,包括自动读取文本行、更新内置变量、执行匹配模式和操作。awk的执行方式包括命令行执行、脚本执行和可执行脚本文件。awk的输出主要涉及print和printf命令,分别用于简单输出和格式化输出。此外,文章还涵盖了awk的各种操作符,包括算术、赋值、条件、逻辑和关系运算符。最后,文中举例展示了如何使用awk进行数据处理和过滤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.  awk的工作流程 :
        awk命令的基本语法如下:
awk  pattern  { actions }
        在上面的语法中,pattern表示匹配模式,actions表示要执行的操作。以上语法表示,当某个文本行符合pattern指定的匹配规则时,执行actions所执行的操作。在上面的语法中,patternactions都是可选的,但是两者必须保证至少有一个。如果省略匹配模式pattern,则表示对所有的文本行执行actions所表示的操作;如果省略actions,则表示将匹配成功的行输出到屏幕。
        在awk处理数据时,它会反复执行以下4个步骤:
                1>.  自动从指定的数据文件中读取行文本。
                2>.  自动更新awk的内置系统变量的值,例如列数变量NF、行数变量NR、行变量$0以及各个列变量$1、$2等等。
                3>.  依次执行程序中所有的匹配模式及其操作。
                4>.  当执行完程序中所有的匹配模式及其操作之后,如果数据文件中仍然还有未读取的数据行,则返回到第(1)步,重复执行(1)~(4)的操作。
2.  awk程序执行方式:
        1>.通过命令行执行awk程序,语法如下:
awk 'program-text' datafile
        2>.执行awk脚本。在awk程序语句比较多的情况下,用户可以将所有的语句写在一个脚本文件中,然后通过awk命令来解释并执行其中的语句。awk调用脚本的语法如下:
awk  -f  program-file  file ..
        在上面的语法中,-f选项表示从脚本文件中读取awk程序语句,program-file表示awk脚本文件名称,file表示要处理的数据文件。
        3>.可执行脚本文件。在上面介绍的两种方式中,用户都需要输入awk命令才能执行程序。除此之外,用户还可以通过类似于Shell脚本的方式来执行awk程序。在这种方式中,需要在awk程序中指定命令解释器,并且赋予脚本文件的可执行权限。其中指定命令解释器的语法如下:
#!/bin/awk -f
以上语句必须位于脚本文件的第一行。然后用户就可以通过以下命令执行awk程序:
awk-script file
其中,awk-scriptawk脚本文件名称,file为要处理的文本数据文件。
3.  awk的输出
        1>.  print的使用格式:
 print item1,item2,...                       
                要点:
                        1. 各项目之间使用逗号隔开,而输出时则以空白字符分隔;
                        2. 输出的item可以为字符串或数值、当前记录的字段($1)、变量或awk的表达式;数值会先转换为字符串,而后再输出;
                        3. print命令后面的item可以省略,此时其功能相当于print $0, 因此,如果想输出空白行,则需要使用print “”。
示例:
[root@localhost ~]# awk 'BEGIN{print "This","is","test"}'
This is test
        2>.  printf命令的使用格式:
                      
  printf(format, [arguments])
                其中圆括号是可选的,第1个参数format是一个用来描述输出格式的字符串,通常以引号括起来的字符串常量的形式提供。arguments为一个参数列表,表示用来显示的数据,可以是变量名等,多个参数之间用逗号隔开。参数列表的项是有顺序的,与前面的格式化字符串中的格式说明相对应。printf语句不会自动打印换行符。
                1、其与print命令的最大不同是,printf需要指定format
                2format用于指定后面的每个item的输出格式;
                3printf语句不会自动打印换行符;\n
                format格式的指示符都以%开头,后跟一个字符;如下:
                        %c: 显示字符的ASCII码;
                        %d, %i:十进制整数;
                        %e, %E:科学计数法显示数值;
                        %f: 显示浮点数;
                        %g, %G: 以科学计数法的格式或浮点数的格式显示数值;
                        %s: 显示字符串;
                        %u: 无符号整数;
                        %%: 显示%自身;
                修饰符:
                        N: 显示宽度;
                        -: 左对齐;
                        +:显示数值符号;
示例:
[root@localhost ~]# awk -F: '{printf "%-15s %i\n",$1,$3}' /etc/passwd |head -n 3
root                 0
bin                  1
daemon          2

 4.  awk操作符

               1>.  awk支持常用的算术运算,这一点与其他的程序设计语言基本相同。
运算符
举例
+
1+2表示计算12的和
-
82-2表示计算822的差
*
2*5表示计算25的积
/
6/3表示计算62的商
%
5/2表示计算5除以2的余数
^
2^3表示计算23次方

示例:

[root@localhost ~]# awk 'BEGIN{x=2;y=3;print x**y,x^y,x*y,x/y,x+y,x-y,x%y}'
8 8 6 0.666667 5 -1 2

                2>.  赋值运算符

说明
=
赋值运算
+=
复合赋值运算,表示将前后两个数值相加后的和赋给前面的变量
-=
复合赋值运算,表示将前后两个数值相减后的值赋给前面的变量
*=
复合赋值运算,表示前后两个数的乘积赋给前面的变量
/=
复合赋值运算,表示前后两个数值的商赋给前面的变量
%=
复合赋值运算,表示将前面的数值除以后面的数值所得的余数赋给前面的变量
^=
复合运算符,表示将前面的数值的后面数值次方赋给前面的变量

                3>.  条件运算符:

                        awk中的条件运算符只有一个,其语法如下:
expression?value1:value2
        这是一个三目运算符,当表达式expression的值为真时,返回值为value1;否则,返回值为value2。
                4>.  逻辑运算符
说明
&&
逻辑与,当前后两个表达式的值全部为真时,其运算结果才为真
| |
逻辑或,前后两个表达式只要有一个为真,则其运算结果为真。当两个表达式的值都为假时,其运算结果才为假
逻辑非,当表达式的值为真时,其运算结果为假;当表达式的值为假时,其运算结果为真

                5>.  关系运算符:

运算符
说明
>
大于
>=
大于或者等于
<
小于
<=
小于或者等于
==
等于
!=
不等于
~
匹配运算符
!~
不匹配运算符

示例:

[root@localhost ~]# awk -F: 'BEGIN {printf "%-10s %-5s %-15s\n","user","uid","shell"} $3==0,$7~"nologin" {printf "%-10s %-5s%-15s\n",$1,$3,$7}'  /etc/passwd
user         uid         shell
root          0            /bin/bash
bin           1            /sbin/nologin

                6>.   其他运算符:

        awk还支持其他的一些运算符,例如正号+、负号-、自增++以及自减--等,这些运算符的使用方法与其他的语言的使用方法完全相同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值