AWK
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理
awk内置变量
------------------------------------------------------------------------------------------------
ARGC 命令行参数个数
awk '{print ARGC}' /etc/fstab /etc/issue
(awk、/etc/fstab、/etc/issue )
------------------------------------------------------------------------------------------------
ARGV 命令行参数排列
------------------------------------------------------------------------------------------------
ENVIRON 支持队列中系统环境变量的使用
------------------------------------------------------------------------------------------------
FILENAME awk浏览的文件名
------------------------------------------------------------------------------------------------
FNR 浏览文件的记录数
------------------------------------------------------------------------------------------------
FS 设置输入域分隔符,等价于命令行 -F选项
awk -v FS=':' '{print $1,FS,$3}’ /etc/passwd
awk –F: '{print $1,$3,$7}’ /etc/passwd
------------------------------------------------------------------------------------------------
NF 浏览记录的域的个数
------------------------------------------------------------------------------------------------
NR 已读的记录数 NR==1 第几行
------------------------------------------------------------------------------------------------
OFS 输出域分隔符
------------------------------------------------------------------------------------------------
ORS 输出记录分隔符
------------------------------------------------------------------------------------------------
RS 控制记录分隔符
------------------------------------------------------------------------------------------------
$0 变量整条记录
$1,$2 变量第一条记录,变量第二天记录以此类推
$NF是number finally,表示最后一列的信息,跟变量NF是有区别的,变量NF统计的是每行列的总数
插入制表符
\t 类似tab键,可用于制表符空格分隔
OFS指定输出分隔符
RS:输入记录分隔符,输出时用指定符号替换行符
取$1第一列冒号分隔和逗号分隔
ORS :输出记录分隔符,输出时的记录
awk -F, -v RS=":" -V OPS"===" '{print $2}' f1.txt 输出内容用===做分隔
NR:awk -F: '{print $NF}' /etc/passwd: 最后一列的冒号分隔
统计.分隔到处第二个队列统计个
统计空格分隔第一列参数 排序统计
awk -F" " '{print NR$1}' access.log 查询的内容用NR加行号
FNR每个文件独立编号
ARGV 命令行参数的个数
-V自定义变量
awk -v test='hello gawk' '{print test}' /etc/fstab
awk -v test='hello gawk' 'BEGIN{print test}'
awk 'BEGIN{test="hello,gawk";print test}'
awk -F: ‘{sex=“male”;print $1,sex,age;age=18}’ /etc/passwd
cat awkscript{print script,$1,$2}
awk -F: -f awkscript script=“awk” /etc/passwd
awk -F"[ .]" '{print $2}' ex.txt>> ex.txt 将文件追加至文本
awk -F "[ .]" '{print $0,$2}' 文件追加显示
正则定义多个参数变量以空格或者百分号作为分隔符 取第5列
df |grep '^\/dev\/sd'|awk -F"[[:space:]]+|%" '{print $1,$5}'
ss -nt |grep "ESTAB"|awk -F"[[:space:]]+|:" '{print $6}'
printf:格式化输出:printf “FORMAT”, item1, item2,
格式化输出: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 -F: '{printf "haha:%10s\t\t\tuuid:%10d\n",$1,$3}' /etc/passwd
操作符:算术运算
操作符
比较操作符:
==, !=, >, >=, <, <=
模式匹配符: ~:左边是否和右边匹配,包含
!~:是否不匹配
示例:
awk -F: '$0 ~ /root/{print $1}‘ /etc/passwd
awk '$0~“^root"' /etc/passwd
awk '$0 !~ /root/‘ /etc/passwd
awk -F: ‘$3==0’ /etc/passwd
df |awk -F"[[:space:]]+|%" '$0 ~ /^\/dev\/sd/{print $1,$3}' 当左右两边匹配满足再匹配
ss -nt |awk -F"[[:space:]]+|:" 'NR == 2{print $4}' 空格和:为分隔符 取第二行第四列
(5) BEGIN/END模式
BEGIN{}:仅在开始处理文件中的文本之前执行一次
END{}: 仅在文本处理完成之后执行一次
awk -F: 'BEGIN{print "username\t |uid\n------------------------"}{printf "%-22s| %-11d\n",$1, $3}' /etc/passwd
awk -F: 'BEGIN{print "username\t |uid |\n----------------------------"}{printf "%-20s| %-5d \n-----------------------------\n",$1,$3}' /etc/passwd
awk -F: ‘END{print "END wahahaha"}{print $1"="$3}' /etc/passwd
end打印结束符
============================================== AWK 高级用法
awk -F: '{if($3>=1000)print $1,$3}' /etc/passwd
df |awk -F"[[:space:]]+|%" '/^\/dev\/sd/ {if($5>10)print $1,$5}' 判断大于10则打印
计算
循环++
awk -F: '/^root/{i=1;while(i<=NF){print $i length($i);i++}}' /etc/passwd
awk 'BEGIN{sum=0;for(i=1;i<=100;i++)sum+=i;print "sum="sum}' 1加到100
time awk 'BEGIN{sum=0;for(i=1;i<=100000000i++)sum+=i;print "sum="sum}'
time seq -s + 10000000 |bc
awk 控制语句 switch 语句
awk数组 awk 'BEGIN{title["ceo"]="mage";title["cto"]="wang";print title["cto"]}'
取以tcp开头NF(最后一列) ,进行相加,处理好后打印出来
netstat -tan|awk '/^tcp/{hh[$NF]++}END{for(i in hh){print i,hh[i]}}'
取第一列相加
awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' access_log |sort -nr|head -n4
取IP地址
ss -nt| awk -F"[[:space:]]+|:" '/ESTAB/{[ip$(NF-2)]++}END{for(i in ip){print ip[i],i}}'
awk 函数
awk 'BEGIN{srand();print int(rand()*100)}' 生成随机数