awk的简单用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了awk的简单用法相关的知识,希望对你有一定的参考价值。
目录1.awk的基本格式
2.awk中的变量
3.操作符
一.awd的基本格式
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
+=将加的结果赋给变量
-= 将减的结果赋给变量
*= 将乘的结果赋给变量
/+ 将除的结果赋给变量
%= 将取模的结果赋给量
^= 将取幂的结果赋给变量
- 算术操作符:
比较操作符:
== 等于
!= 不等于
大于
= 大于等于
< 小于
<= 小于等于
模式匹配符:
~:左边是否和右边匹配包含
!~:是否不匹配
例子
[[email protected] ~]# 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
只取前三行
[[email protected] ~]# 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 用户名
[[email protected] ~]# cat /etc/passwd | awk -F: ‘ NR<=3{ print "name", $1 }‘
name root
name bin
name daemon
取出用户名及其uid 格式为 name:用户名 uid:XXX
[[email protected] ~]# 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的信息
[[email protected] ~]# cat /etc/passwd | awk -F: ‘ $1~"root"{ print $0}‘
root:x:0:0:root:/root:/bin/bash
以上是关于awk的简单用法的主要内容,如果未能解决你的问题,请参考以下文章