一、awk命令用法
在Linux中,awk 即 gawk , awk的二进制文件为gawk的链接文件;
gawk - pattern scanning and processing language / 模式扫描及处理语言;
用法: gawk [options] 'pattern{ACTION }' FILE...
1、options: -F: 定义输入字段分隔符,默认字符为空格;
-v var=val : 自定义变量;
2、常见的输出分隔符:
a.print :
格式: print item1,item2.....
注意: item之间用 逗号分割;item可以是字符串、数值;当前处理行的字段、变量或awk的表达式;
b.printf : 按照给定格式输出;
格式:printf FORMAT , item1,item2
注意:FORMAT必须项;如果换行需要手动给出\n;每一个输出的item都需要对应FORMAT中的格式化符号;
格式符有:
%d,%i : 显示十进制的整数;
%s : 显示字符串;
%f : 显示浮点数
%c : 显示字符串的ASCII码;
%e,%E : 科学计算法显示;
%u: 无符号整数;
%% : 显示%本身;
c. 修饰符,对输出进行修饰
#,[#] : 分别控制输出item的宽度和精度(小数);
- : 控制输出item 左对齐;
+ :控制输出item(数值) 的符号;
3、awk变量:
a. 内置变量
FS :输入字段分隔符
OFS: 输出字段分隔符
NF : number of fields /行字段数 ; $NF:最后一个字段的值;
NR : number of record/ 行数
FNR : file of number record /显示每个文件的行数
FILENAME : 显示当前正在处理的文件的名字
b.自定义变量
-v var_name=VALUE
eg1: ~]# awk -F: '/root\>/{print $1}' /etc/passwd
root
operator
oseroot
eg2: ~]# awk -v FS=":" '/root/{print $1}' /etc/passwd
root
operator
oseroot
eg3: 控制输出item的方式
eg4: 打印/etc/passwd 的 字段数及最后一个字段的值
~]# awk -F: '/root/{print NF,$NF}' /etc/passwd
7 /bin/bash
7 /sbin/nologin
7 /bin/bash
4、pattern:AWK patterns may be one of the following:
空模式 : 匹配每一行
/regular expression/ : 处理能够匹配到的行
relational expression :关系表达式,为真时才会被处理;
pattern && pattern
pattern || pattern
pattern ? pattern : pattern
(pattern)
! pattern
/pattern1/, /pattern2/
eg1: ~]# awk '/^root\>/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
eg2: ~]# awk -F: '$3==0{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
eg3: ~]# awk -F: '$1~"^root"{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
eg4: ~]# awk -F: '/^root\>/,/^bin\>/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
eg5: ~]# awk -F: '(NR>=1&&NR<=2){print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
eg6: ~]# awk -F: '!(NR>=2){print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
二、awk函数用法
awk 函数包括内置函数和自定义函数,内置函数比较常用;
a. rand() : Return a random number N, between 0 and 1, such that 0 ≤ N < 1
~]# awk 'BEGIN{print rand()}'
0.237788
b.length(string) : 显示字符串的长度
~]# awk -v tmp="helloworld" 'BEGIN{print length(tmp)}'
10
~]# awk -F: '/^root\>/{print length($1)}' /etc/passwd
4
c. split(s, a [, r ] ]) : 以r为分隔符分割s, 并将分割后的结果保存在数组a 中 ;
##统计外部IP连接的个数
~]# netstat -tan | awk '/tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count){print i,count[i]}}'
0.0.0.0 7
10.14.5.107 1