目录 1.awk的基本格式 2.awk中的变量 3.操作符
一.awk的基本格式
-
awk [options] 'program' file…
-
program:pattern{action statements;..}
-
pattern和action:
-
•pattern部分决定动作语句何时触发及触发事件 BEGIN,END
-
• action statements对数据进行处理,放在{}内指明 print, printf
-
** 分割符、域和记录** awk执行时,由分隔符分隔的字段(域)标记$1,$2..$n称 为域标识。$0为所有域。 文件的每一行称为记录。 省略action,则默认执行 print $0 的操作。
-
** 工作原理**
-
第一步:执行BEGIN{action;… }语句块中的语句
-
第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它逐行扫描文件,从第一行到最后一行重复这 个过程,直到文件全部被读取完毕。
-
第三步:当读至输入流末尾时,执行END{action;…}语句块 ** print格式:** print item1, item2, ... 要点 1.逗号分隔符 2. 输出的各item可以字符串,也可以是数值;当前记录的字段、 变量或awk的表达式 3. 如省略item,相当于print $0 ** printf** 格式化输出:printf “FORMAT”, item1, item2, ... (1) 必须指定FORMAT (2) 不会自动换行,需要显式给出换行控制符,\n (3) FORMAT中需要分别为后面每个item指定格式符 **格式符:与item一一对应** %c: 显示字符的ASCII码 %d, %i: 显示十进制整数 %e, %E:显示科学计数法数值 %f:显示为浮点数 %g, %G:以科学计数法或浮点形式显示数值 %s:显示字符串 %u:无符号整数 %%: 显示%自身 **修饰符** : #[.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f -: 左对齐(默认右对齐) %-15s +:显示数值的正负符号 %+d
二.awk中的变量
-
1.内置变量
-
FS:输入字段分隔符,默认为空白字符
-
OFS:输出字段分隔符,默认为空白字符
-
RS:输入记录分隔符,指定输入时的换行符,原换行符仍有效
-
ORS:输出记录分隔符,输出时用指定符号代替换行符
-
NF:字段数量
-
NR:行号
-
FNR:各文件分别计数,行号
-
FILENAME:当前文件名
-
ARGC:命令行参数的个数 2.自定义变量 -v var=value 在program中直接定义
三.操作符
* 算术操作符: *
x+y, x-y, x*y, x/y, x^y, x%y
-x: 转换为负数
+x: 转换为数值
字符串操作符:没有符号的操作符,字符串连接
** 赋值操作符** ++ 变量加1 -- 变量减1 +=将加的结果赋给变量 -= 将减的结果赋给变量 *= 将乘的结果赋给变量 /+ 将除的结果赋给变量 %= 将取模的结果赋给量 ^= 将取幂的结果赋给变量
比较操作符:
-
== 等于
-
!= 不等于
-
> 大于
-
> = 大于等于
-
< 小于
-
<= 小于等于
模式匹配符: ~:左边是否和右边匹配包含 !~:是否不匹配
例子
[root@centos6 ~]# cat /etc/passwd
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
-
只取前三行
[root@centos6 ~]# cat /etc/passwd | awk 'NR<=3{print}'
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologi
-
只取出用户名 格式为 name 用户名 [root@centos6 ~]# cat /etc/passwd | awk -F: ' NR<=3{ print "name", $1 }' name root name bin name daemon
-
取出用户名及其uid 格式为 name:用户名 uid:XXX [root@centos6 ~]# cat /etc/passwd | awk -F: ' NR<=3{ printf "name: %-10s uid: %s\n", $1,$3}‘ name: root uid: 0 name: bin uid: 1 name: daemon uid: 2
-
取出用户root的信息 [root@centos6 ~]# cat /etc/passwd | awk -F: ' $1~"root"{ print $0}' root:x:0:0:root:/root:/bin/bash