简介:awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
使用方法:awk 'pattern {action}' {filenames}
pattern: 查找的内容;action 执行的命令;pattern:正则表达式,要用斜杠‘/’括起来。(pattern不是必须的,你要用的时候才写上)
awk是以文件的一行为处理单位。awk每接收文件的一行,然后执行相应的命令,来处理文本。
例1:输入last -n 5 (注:就是取出前五个登陆账户的一些信息)
但是如果我只想看最近登陆的的账户,我就可以输入last -n 5| awk '{print $1}'
'|':管道,前一个命令的结果作为下一个命令的输出(啦啦啦啦啦我有时候偷懒,修改服务器时间的时候不想连续输两次就会:date -s 2016-7-19 |date -s 22:14 就像下面这样^_^)
$0表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。(注:$0就是输出全部,$1输出第一列,$2输出第二列)
如果想看到登录的账户跟对应的日期并且中间用符号“-”隔开:
输入 last -n 5| awk '{print $1"\t"$5"-"$6}'
如果想用“,“逗号隔开,并且在第一行输出"[start]HELLO WORLD"最后一行输出"[end]I am Strong "
输入 last -n 5|awk 'BEGIN{print"[start]HELLO WORLD"}{print $1","$5",‘’$6}END{print"[end]I am Strong"}'
awk工作流程:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。
例2:搜索关键字
想在日志文件里找到我刚注册的手机号00000000008的验证码,输入awk -F, '/00000000008/' /home/test/2016_07_20_scserver.log
这样就不怕一晃神就找不到验证码啦~上图中有两条命令,第一条域分隔符写作“ -F, ”第二条写作“ -F',' ” 其实就是差了一对单引号,但是结果都一样
如果既想知道验证码又想知道时间输入awk '/00000000008/{print$1$2} /home/test/2016_07_20_scserver.log
什么是按指定的域分隔符划分域?就是下图这样分
AWK常用内置变量:
统计一个文件的文件名,行号,列好,完整内容,输入
awk '{print"filename:"FILENAME ",linenumber: “NR “,columns:”NF ",linecontent:"$0}' /home/test/2016_07_20_scserver.log
print还可以用printf替,这样的代码更加简洁,易读,
输入 awk '{printf("filename:%s ,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}‘ /home/test/2016_07_20_scserver.log
AWK编程:
变量和赋值,类似于C语言,awk除了内置的变量还可以自定义变量;
例3:统计2016年7月20日的日志行数,输入
awk 'BEGIN{count=0;print"[start]number is:“,count}{count=count+1;print $0}END{print"[end]number is :",count}' /home/test/2016_07_20_scserver.log
上面的count是自定义变量,action{}里可以有多个语句,以;号隔开。
例4:统计某个文件夹下文件占用的字节数(注:这里就是root文件夹下的占用的字节数)
输入ls -l |awk 'BEGIN{size=0;print"[start]the size is:",size}{size=size+$5}END{print"the size is:",size}
为什么说是root文件夹的呢,因为输入pwd,服务器告诉我这些东西是root文件夹的
PS:这个pwd不是我们常用的密码的代名词,是Print Work Directory的缩写:输出工作目录,就是输出当前工作目录的意思啦~
例5:如果我们想统计某个文件夹下的文件占用的字节数,过滤1000000大小的文件(一般都是文件夹)输入
输入ls -l |awk 'BEGIN{size=0;print"[start]the size is:",size}{if($5!=1000000){size=size+$5;}}END{print"the size is:",size}
如果是想过滤比231667小的文件if条件语句就是if($5<231667)
例6:数组
awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。
只学了这点皮毛~ 下次学了继续改~~~