awk概述
1 2 3 |
awk是一种编程语言,主要用于linux/unix下对文本和数据进行处理,是linux/unix下的一个工具。数据可以来自标准输入、一个或多个文件,或其它命令的输出。 awk的处理文本和数据的方式:逐行扫描文件,默认从第一行到最后一行,寻找匹配的特定模式的行,并在这些行上进行你想要的操作。 awk分别代表其作者姓氏的第一个字母。因为它的作者是三个人,分别是Alfred Aho、Brian Kernighan、Peter Weinberger。 |
语法:
1 2 3 4 |
awk [options] 'commands' filename 特别说明: 引用shell变量需用双引号引起 |
相关内部变量
1 2 3 4 5 |
$0: 保存当前行的内容 NR: 记录号,每处理完一条记录,NR值加1 NF: 保存记录的字段数,$1,$2...$100 FS: 输入字段分隔符,默认空格 OFS:输出字段分隔符 |
关系运算符
运算符 | 含义 | 示例 |
---|---|---|
< | 小于 | x<y |
<= | 小于或等于 | x<=y |
== | 等于 | x==y |
!= | 不等于 | x!=y |
>= | 大于等于 | x>=y |
> | 大于 | x>y |
~ | 正则表达式匹配 | x~/y/ |
!~ | 正则表达式不匹配 | x!~/y/ |
算数运算
1 2 3 4 |
+ - * / %(模) ^(幂2^3) 可以在模式中执行计算,awk都将按浮点数方式执行算术运算 # awk -F: '$3 * 10 > 500' /etc/passwd |
逻辑运算和复合模式
1 2 3 4 5 6 7 8 9 |
&& 逻辑与 a&&b || 逻辑或 a||b ! 逻辑非 !a 示例: # awk '$2 > 5 && $2 <= 15' filename # awk '$3 == 100 || $4 > 50' filename # awk '!($2 < 100 && $3 < 20)' filename |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#大于十行且小于十六行 [root@clf ~]# awk 'NR>10 && NR<16' passwd #小于三行或大于十五行 [root@clf ~]# awk 'NR<3 || NR>15' passwd #打印整个文件内容 [root@clf ~]# awk '{print $0}' passwd #给文件内容加上行号 [root@clf ~]# awk '{print NR,$0}' passwd #取反 排除 [root@clf ~]# awk '!/sbin/' passwd [root@clf ~]# awk 'NR!=1' passwd #排除了第5行到第15行 [root@clf ~]# awk 'NR<5 || NR >15' passwd # 取列 [root@clf ~]# awk -F: '{print $1}' passwd [root@clf ~]# awk -F: '{print $1,$2}' passwd [root@clf ~]# awk -F: '{print $NF}' passwd #默认分隔符为 空白字符 [root@clf ~]# ifconfig eth0 | awk 'NR==2{print $2}' #指定多个分隔符 [root@clf ~]# ip a s eth0 | awk 'NR==3' | awk -F '[ /]' '{print $6}' #指定分隔符 使用双引号引起来 [root@clf ~]# awk -F: '{print $1":"$2}' passwd #将/etc/passwd文件中的第一列和第七列位置进行调换 [root@clf ~]# awk -F '[:]' -vOFS=":" '{a=$1;$1=$NF;$NF=a;print}' passwd #排除空行和注释行 #号开头的 [root@clf ~]# awk '!/^\s*$|^#/' sshd_config #排除空行 存在空格和tab键的空行 [root@clf ~]# awk '!/^$/' sshd_config |