Linux的awk命令

简介:awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

使用方法:awk  'pattern {action}'  {filenames}

pattern: 查找的内容;action 执行的命令;pattern:正则表达式,要用斜杠‘/’括起来。(pattern不是必须的,你要用的时候才写上)

awk是以文件的一行为处理单位。awk每接收文件的一行,然后执行相应的命令,来处理文本。

例1:输入last -n 5  (注:就是取出前五个登陆账户的一些信息)

PS:still logged in 是这个账户还登陆着


但是如果我只想看最近登陆的的账户,我就可以输入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输出第二列)

如果想看到登录的账户跟对应的日期并且中间用符号“-”隔开:

PS:换了一个服务器,出现的内容跟之前有出入,所以重新截一次

输入 last -n 5| awk '{print $1"\t"$5"-"$6}'

PS:账户跟日期之间用【Tab】隔开,月份与日子之间用“-“隔开

如果想用“,“逗号隔开,并且在第一行输出"[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

PS: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

PS:日志内容太多啦!【Ctrl】+c 停下来后就到900多行了

print还可以用printf替,这样的代码更加简洁,易读,

输入  awk '{printf("filename:%s ,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}‘    /home/test/2016_07_20_scserver.log

PS:跟上图的输出结果一致的

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}

PS:这里的2316667就是上图第5列数字的总和



为什么说是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中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。

只学了这点皮毛~ 下次学了继续改~~~


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • awk将一行内容称为一条记录,将用指定分隔符分隔的列称为域;awk一般以空格作为域分隔符,以\n作为记录分隔符;a...
    北山学者阅读 143评论 0 1
  • 转载 原文的排版和内容都更加友好,并且详细,我只是在这里贴出了一部分留作自己以后参考和学习,如希望更详细了解AWK...
    XKirk阅读 3,276评论 2 25
  • 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤...
    ad085d162310阅读 1,135评论 0 1
  • linux awk命令详解 来源:ggjucheng 链接:http://www.cnblogs.com/ggju...
    meng_philip123阅读 877评论 0 1
  • 一直下 一刻不停 从云端落到地面再渗入地底 到处湿漉漉的 就像我想你 可是 你 感觉到了吗 雨水 落在花草上 雨滴...
    ys枕边书阅读 112评论 0 2