本文共 2788 字,大约阅读时间需要 9 分钟。
目录
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.逗号分隔符
- 输出的各item可以字符串,也可以是数值;当前记录的字段、 变量或awk的表达式
- 如省略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, xy, 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
转载于:https://blog.51cto.com/13572749/2093460