码迷,mamicode.com
首页 > 其他好文 > 详细

AWK

时间:2019-09-02 00:00:06      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:cti   ++   gawk   i++   form   相加   换行   对齐   模式匹配   

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)}‘   生成随机数

AWK

标签:cti   ++   gawk   i++   form   相加   换行   对齐   模式匹配   

原文地址:https://www.cnblogs.com/seeet/p/11444040.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!