awk是一个编程工具,他有完整的语法和命令。在bash中,awk更多的用于处理列内容(我是这么认为的,仅供参考)正则表达式
awk程序的执行逻辑shell
首先将文本内容读入到内存中,根据字段分隔符,在读取文本内容的过程当中把读入的内容分段,第一个字段对应$1,第二个字段对应$2,依次类推,$0表明全部的字段。express
注意:编程
一、在awk程序中,变量的使用不须要带$符号,由于$符号表示字段。数组
二、整个执行语句必须被'{}'包裹。bash
三、awk程序,在处理文本的时候是一次处理一行内容。ide
先简单演示一下函数
这个例子中,awk程序将文本内容中的第二列和第四列进行了输出。工具
这个例子主要是证实,awk每次处理一行内容。在例子中,awk处理了两行内容,因此hello输出的两次。字段之间用逗号隔开。spa
这个例子中,hello与$2之间没有逗号,因此输出的内容中hello与$2所表明的的内容连在一块儿。
这个例子中print后面没有跟任何参数,因此这个例子证实,print默认是输出全部内容
选项:
-F 指明输入时用到的字段分隔符
这个例子中-F 指定了分隔符是:
变量
若是要使用变量就要使用-v这个选项
内建变量FS 这个等价于-F 读入文件时的分隔符 默认使用空白字符做为分隔符
内建变量 OFS awk在输出时默认使用空白字符做为分隔符,也能够经过OFS进行指定
本来空白的地方被@替换了
内建变量RS,awk的在读入内容是的换行符,遇到这个符号就换行。默认使用\n做为换行符
本来一行的内容被拆分红了若干行
内建变量ORS,awk在输出内容时默认使用\n做为换行符,也能够进行改变
这个例子中,须要注意的是每个变量以前必须有一个-v的选项,否则系统会报错。
本来须要换行的输出,因为换行符改成#号,因此#号代替了换行。
内建变量NF 表示每一行字段的数量
awk默认以空白符做为分隔符,/etc/passwd的每行内容基本上没有空白字符,因此一行就是一个分段。
在读入文本内容时,以冒号做为分隔符,每一行被分为7段,那么NF就等于7
内建变量NR 打印读入内容的行编号
若是有多个文件,那么awk默认会把全部内容看作一个文件
内建变量FNR 可让awk分别对每一个文件进行处理
内建变量FILENAME 每处理一行就输出内容所在文件的文件名
内建变量ARGC 命令行参数的个数 输入的执行命令
2表示执行的命令中有两个参数,更准确的说法是执行命令的字符串的个数是2:一、awk 二、/etc/issue
内建变量ARGV 这是个数组名,数组用来保存命令行中的参数
自定义变量
awk自己就是一个编程工具,因此它支持自定义变量,
这种变量赋值算一种提早赋值的方式,由于赋值的动做在执行命令以前。
这种变量赋值算另外一种赋值方式,赋值的动做在执行命令过程当中
printf
这个命令的主要功能就是对输出内容进行制表操做,让输出的内容看起来更加美观
printf FORMAT,item1,item2
注意:一、printf没有默认格式,FORMAT必须给出。 二、printf不会自动换行,须要输出换行符 三、FORMAT须要为后面每个须要输出的字段指定格式化符号(是以整数输出,仍是字符串输出)
格式符:
%c 显示为字符的ASCII码
%d,%i 显示为十进制整数
%f 显示为浮点数
%g %G 以科学计数法或浮点形式显示数值
%s 显示字符串
%u显示为无符号整数
%% 显示%自身
printf 须要输出的内容须要用双引号引发来。
$1的内容须要用%s(字符串格式显示)
如今换一个显示格式
相同的内容,显示格式不同,输出就可能不同
为了让输出内容更有可读性,我再改改
$1以%s的格式输出,$3以%d的格式输出,这是语法。
修饰符
#[.#] 第一个#号控制显示的宽度,第二个#号表示小数点后的精度
%7s:默认表示右对齐,7表示$1输出的字符串的长度,
%-7s:负号表示左对齐,若是有+号表示的不是右对齐,+号表示数值的正负属性。
操做符
awk支持算术运算。
x+y加法 x-y减法 x*y 乘法 x/y 除法 x^y 幂 x%y余运算
-x 把数值变成负数
+x 把字符串转换为数值
字符串操做符
没有符号的操做符,表示字符串链接
赋值操做符
=
+= sum=sum+i sum+=i
-= sum=sum-I sum-=i
*= sum*=y sum=sum*y
/= sum/=y sum=sum/y
%= sum%=y sum=sum%y
^= sum^=y sum=sum^y
++i 是参与运算以前先让i+1
i++ 是参与运算以后再让i+1
- - 同理
比较操做符
> >= < <= != ==
模式匹配符
~ 左侧的字符串是否被右侧的模式(关键字)所匹配
!~ 左侧的字符串是否不能被右侧的模式(关键字)所匹配
逻辑操做符
&& 与
|| 或
! 非
由于awk自己就是一个编程工具,因此其余编程工具备的功能,它基本都有
函数调用
内置函数rand ()
这里不是要解释rand()函数,而仅仅是演示函数的调用
内置函数length() 返回指定字符串的长度
内置函数split(s,a,[r]) 以r为分隔符切割s字符串,并将切割后的结果保存在a所表示的数组中。
条件表达式
selector?if-true-expression:if-false-expression
selector表达式是否为真,真的话执行true语句,假的话执行false语句
PATTERN
相似于地址定界的功能
一、empty 空模式 匹配任意行,全内容处理
二、/regular expression/ 使用正则表达式匹配文件中的行,仅处理匹配到的行
三、relational expression 关系表达式,结果有真 有假。结果为真才会被处理。真:结果为非0值,非空字符串为真,空字符串为假。
四、line ranges 行范围 指定起始和结束行,可使用匹配方式指定,还可使用数字,不过要借用NR变量。
五、BEGIN\END
BEGIN{命令行}:仅在处理文件中的文本以前执行一次
END{命令行}:仅在处理文件中的文本以后执行一次
经常使用的action
1、expressions awk本身的语句
2、Control statements 好比 if while 控制语句
3、Compound statements组合语句
4、input statements 输入语句
5、output statements 输出语句
控制语句
if(condition){statements}
if(condition){statements} else {statements}
while(condition){statements}
do{statements}while(condition)
for(expr1;expr2) {statements}
switch(expr1) {case VALUE1 or /REGEXP1/:statement;case VALUE2 or /REGEXP2/:statement;default:statement}
switch相似于case 多分支 能够匹配值也能够模式匹配
break [n] 跳出n层循环
continue 中止本轮循环,继续下轮循环
next awk是对文件中的每一行进行处理,next是让awk提早结束当前行的处理,继续进行下一行的处理。
delete array[index]
delete array
exit
数组
array[index-expression]
index-expression
1、可以使用任意字符串
2、若是某数组元素事先不存在,在引用时,awk会自动建立此元素,并将其值初始化为空串。
若要判断数组中是否存在某元素,要使用”index in array”格式进行
Weekdays[“mon”]=”Monday”
若要遍历数组中的元素,须要使用for循环
来练习练习
一、将用户的ID作比较,UID大于1000的就是普通用户,小于1000的就是系统管理员或者系统用户
二、仅处理/etc/fstab中以UUID开头的行
三、仅处理不以UUID开头的行
四、将用户ID做比较,UID大于1000的用户显示出来
五、将/etc/passwd中bash为/bin/bash的用户显示出来
六、显示/etc/passwd的前10行的username和UID的行
七、第6个例子使用printf来作
八、第4个例子用awk if语句实现
九、练习if else语句
十、若是用户的shell为/bin/bash,那么就输出用户名
十一、若是分区的使用率大于40,就显示该分区
十二、为指定行计算每一行的每个字段的字符数
1三、在第12个例子上加个难度。小于7个字符的字符串不须要输出
1四、使用for再写第12例子
1五、输出UID为偶数的用户信息
另外一个种方法,使用next命令,
1六、在awk中使用数组
1七、使用for遍历数组
1八、统计端口监听状态的数量与种类
1九、统计/etc/fstab中文件系统类型出现的次数
20、统计/etc/fstab中单子的种类和个数
2一、统计创建链接的客户端的IP及个数
经过多个管道把须要的内容先切割出来,其实能够在特定的位置使用内建函数split