AWK
Posted seeet
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AWK相关的知识,希望对你有一定的参考价值。
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‘ ‘BEGINprint test‘
awk ‘BEGINtest="hello,gawk";print test‘
awk -F: ‘sex=“male”;print $1,sex,age;age=18’ /etc/passwd
cat awkscriptprint 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 == 2print $4‘ 空格和:为分隔符 取第二行第四列
(5) BEGIN/END模式
BEGIN:仅在开始处理文件中的文本之前执行一次
END: 仅在文本处理完成之后执行一次
awk -F: ‘BEGINprint "username\t |uid\n------------------------"printf "%-22s| %-11d\n",$1, $3‘ /etc/passwd
awk -F: ‘BEGINprint "username\t |uid |\n----------------------------"printf "%-20s| %-5d \n-----------------------------\n",$1,$3‘ /etc/passwd
awk -F: ‘ENDprint "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 ‘BEGINsum=0;for(i=1;i<=100;i++)sum+=i;print "sum="sum‘ 1加到100
time awk ‘BEGINsum=0;for(i=1;i<=100000000i++)sum+=i;print "sum="sum‘
time seq -s + 10000000 |bc
awk 控制语句 switch 语句
awk数组 awk ‘BEGINtitle["ceo"]="mage";title["cto"]="wang";print title["cto"]‘
取以tcp开头NF(最后一列) ,进行相加,处理好后打印出来
netstat -tan|awk ‘/^tcp/hh[$NF]++ENDfor(i in hh)print i,hh[i]‘
取第一列相加
awk ‘ip[$1]++ENDfor(i in ip)print ip[i],i‘ access_log |sort -nr|head -n4
取IP地址
ss -nt| awk -F"[[:space:]]+|:" ‘/ESTAB/[ip$(NF-2)]++ENDfor(i in ip)print ip[i],i‘
awk 函数
awk ‘BEGINsrand();print int(rand()*100)‘ 生成随机数
以上是关于AWK的主要内容,如果未能解决你的问题,请参考以下文章