awk(一)

xiaoxiao2021-02-28  111

awk 一种编程语言、文本编辑器、也是一种非交互式的编辑器

功能:对文本数据进行汇总和处理,是一个报告的生成器,能够对数据进行排版

一、awk的语法

awk [选项] '/模式匹配(定址)/{处理动作1;处理动作2;... ...; 处理动作n}' 文件列表 要点: 1)逗号分隔,print item1,item2 2)输出的item可以是字符串,变量,数值,字段,自己的表达式 3)省略item(对象),相当于执行print$0

1、设定输入分隔符 -F

分隔符可以是数字、字母、符号和空白 可以同时指定多个分隔符 : / , -F "" 以空为分隔符 -F : 单个符号的分隔符 -F :/ 复合分隔符,多个字符组成一个分隔符 对pass.txt(取/etc/passwd文件前十行)文件以:/为分隔符,打印第一个字段,如下: [root@bogon ~]# awk -F :/ '{print $1}' pass.txt root:x:0:0:root bin:x:1:1:bin daemon:x:2:2:daemon adm:x:3:4:adm lp:x:4:7:lp sync:x:5:0:sync shutdown:x:6:0:shutdown halt:x:7:0:halt mail:x:8:12:mail operator:x:11:0:operator

2、awk输出

1)print
打印内容的,内容可以是文件中的内容,也可以跟文件内容毫无关系 [root@bogon ~]# awk '{print "hello"}' pass.txt hello hello hello hello hello hello hello hello hello hello //打印内容和文件不相关,只是借用了pass文件的行,有多少行内容,hello就会被打印多少次 print要点: a、各个输出字段之间用逗号分隔,而输出的时候默认是以空白为分隔符的 b、print后面如果不跟字段,那么默认打印整行 c、print输出时默认是有换行的
2)printf 可以格式化输出的,默认没有换行
使用格式 printf format,item1,item2,... ...,itemn format的指示符都是以%开头的,后面跟一个字符,如: %s:表示是字符串 %d:表示十进制数 %f:表示浮点数,其实就是小数 float %%:表示%本身 %x:表示十六进制数 %o:表示八进制数 %c:表示字符 修饰符:N(数字) 表示显示宽度 s - 表示左对齐,默认是右对齐 %-10s 对于浮点数: %5.2f : 其中5表示总的显示宽度(整数位+小数位),2表示小数位的位数 %.2f :表示整数位全部保留,小数位保留两位 [root@bogon ~]# awk -F : '{printf "s]",$1,$3}' pass.txt //默认printf是没有换行的 root 0 bin 1 daemon 2 adm 3 lp 4 sync 5 shutdown 6 halt 7 mail 8 operator 11 printf要点: a、与print不同的是,printf需要指定格式 b、格式其实是用来指定后面每个条目的输出格式的 c、printf默认不会自动打印换行符的,有需要时候手动指定”\n” d、默认没有输出分隔符

3、awk的操作符

1)算数运算符
-x:表示负数 +x(x):表示正数 x+y x-y x*y x/y x%y x**y 等价于 x^y(x的y次幂)
2)关系运算符
a、数值之间的关系运算符 > < >= <= == != 打印uid小于等于5的行 [root@bogon ~]# awk -F: '$3<=5{print $0}' pass.txt root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync awk -F: '$3<=5{print}' pass.txt //打印uid小于等于5的行 awk -F: '$3<=5' pass.txt //打印uid小于等于5的行 b、字符串之间的关系运算符 == != x ~ /y/ 匹配正则 其中y可以是正则表达式 打印用户名中含有o的用户的名字 [root@bogon ~]# awk -F: '$1 ~ /o/{print $1}' pass.txt root daemon shutdown operator x !~ /y/ 不匹配正则 [root@bogon ~]# awk -F: '$1 !~ /o/{print $1}' pass.txt bin adm lp sync halt mail
3)逻辑运算符
&& 与  || 或  ! 非 打印uid在5到8之间的用户的用户名,UID [root@bogon ~]# awk -F: '$3>=5 && $3<=10{print $1,$3}' pass.txt sync 5 shutdown 6 halt 7 mail 8 打印uid大于7或者uid小于5的用户名,UID [root@bogon ~]# awk -F: '$3>7 || $3<5{print $1,$3}' pass.txt root 0 bin 1 daemon 2 adm 3 lp 4 mail 8 operator 11 打印uid不大于4的用户名,UID [root@bogon ~]# awk -F: '! ($3>4){print $1,$3}' pass.txt root 0 bin 1 daemon 2 adm 3 lp 4

4)赋值运算符

常见的模式 1)空模式:也就是每一行都要做处理的模式 [root@bogon ~]# awk -F: '{print $1}' pass.txt root bin daemon adm lp sync shutdown halt mail operator 2)正则表达式 a、固定定址 [root@bogon ~]# awk -F: '/^ro/{print $1}' pass.txt root b、范围定址 [root@bogon ~]# awk -F: '/^ro/,/^lp/{print $1}' pass.txt root bin daemon adm lp 3)赋值运算 -= *= /= %= ^= a++ (先引用a原来的值然后再自增1) ++a(先自增1然后再引用a的值) a-- (先引用a原来的值然后再自减1) --a(先自减1然后再引用a的值)

4、awk的变量

种类:内置变量、自定义的变量 1.内置变量(內建变量) (1)$0 表示一整行的内容 (2)$1 ~ $100 $1:第一列 (3)与记录相关的变量(记录就是行) FS(field separator):输入字段分隔符,默认是空白 FS=":" OFS(Output):输出字段分隔符 RS(record):记录的分隔符,即行的分隔符,输入行分隔 (4)与数据相关的变量 NR(Number of Record):记录数,awk的处理的行的总数,NR在很多情况下可以看成行号 FNR:行号,不会叠加 NF(Number of Field):当前行的字段数 $NF:当前行的最后一个字段的值 $(NF-1):当前行的倒数第二个字段 [root@bogon ~]# awk -F : '{print NR":"NF":"$NF}' pass.txt 1:7:/bin/bash 2:7:/sbin/nologin 3:7:/sbin/nologin 4:7:/sbin/nologin 5:7:/sbin/nologin 6:7:/bin/sync 7:7:/sbin/shutdown 8:7:/sbin/halt 9:7:/sbin/nologin 10:7:/sbin/nologin [root@bogon ~]# awk 'NR==2' pass.txt //打印pass.txt文件的第2行 bin:x:1:1:bin:/bin:/sbin/nologin 2.自定义变量 命名:由字母、数字、下划线组成,不能以数字开头,不能使用关键字,最好见名知意 变量名区分大小写 变量可以先定义再使用,也可以直接使用 给变量赋值 变量名=数值 a=5 变量名="字符串" //注意:此处一定有引号 username="root" [root@bogon ~]# echo hello | awk '{num=2;pass="loyal";print num,pass}' 2 loyal
转载请注明原文地址: https://www.6miu.com/read-41240.html

最新回复(0)