Linux的awk命令

作者: 请叫我毒舌小公举 | 来源:发表于2016-07-25 13:40 被阅读0次

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

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

    相关文章

      网友评论

        本文标题:Linux的awk命令

        本文链接:https://www.haomeiwen.com/subject/bzxvjttx.html