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的主要内容,如果未能解决你的问题,请参考以下文章

AWK

AWK用法详解

linux awk

Linux-AWK

新awk整理

awk编程