• linux每天一小步---awk命令详解


    1 命令功能

        awk是linux环境下的一个强大的文本工具,由于awk天生提供对文件中文本分列进行处理,所以如果一个文件中的每行都被特定的分隔符(默认为空格)隔开,我们就可以将这个文件看成是有很多列的文本组成,这样的文件最适合用awk进行处理,其实awk在工作中多用于处理log文件。awk在处理庞大文件时不会出现内存溢出或是处理缓慢的问题。

        awk有3个不同的版本:awk、nawk、gawk,未做特别说明的,一般指gawk,gawk是awk的GNU版本。

    2 命令语法

        awk 【选项】  '{pattern + action}'  【filename】 #pattern表示awk在文件中要查找的内容,而action指在找到匹配内容时所执行的一系列命令

        awk  [options]  'BEGIN{ commands } pattern{ command1;commandn } END{ commands }'  filename  

        # options表示awk的可选命令选项,

        # BEGIN 初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符

        # pattern  匹配代码块,可以是字符串或正则表达式

        # {} 命令代码块,包含一条或多条命令

        # ; 多条命令使用分号分隔

        #  结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息ech

    3 命令参数

        -F   指定输入文本的分隔符,默认为空格,其分隔符可以是一个字符串也可以是一个正则表达式。-F还可指定多个分隔符,如‘’[ ,]‘’即指定空格和逗号作为分隔符,在指定分隔符时最好加引号。[ ,]+ 表示将空号中在匹配时出现连续的分隔符看成一个,如echo ---1:---2 | awk -F "[-:]+" '{print $2}' 打印出1,echo ---1:---2 | awk -F "[-:]+" '{print $3}' 打印出2.

        -v  var=value 赋值一个用户定义变量

        -f   从脚本文件中读取awk命令

        $0   表示整个当前行

        $1   表示每行的第一个字段

        NF   当前输入记录中的字段数

        $NF   表示最后一个列

        NR   表示文件行数的记录号,处理多文件时记录数递增

        FNR   处理单文件时与NR类似,不过多文件时,每个文件的记录号都从1开始

          制表符

          换行符

        FS   BEGIN时定义文本字段分隔符,即列与列之间的分隔符,默认是空格 

        OFS   输出字段分隔符,默认也是空格

        RS   定义输入记录分隔符,即行与行之间的分隔符,默认换行符

        ORS   输出记录分隔符,默认为换行符

        ==   等于,精确比较

        !=   不等于

        &&   逻辑与

        ||   逻辑或

    4 使用范例

    【1】awk -F: '{print $1 $3}' /etc/passwd  #$1与$3内容相连输出,不分隔。

    【2】awk -F: '{print $1,$3}'  /etc/passwd  #$1与$3中间多一个逗号,使之输出内容间以空格分隔

    【3】awk -F: '{print "username:" $1 " Uid:" $3}' /etc/passwd  #自定义输出

    【4】awk '/mysql/{print }' /etc/passwd  #从文件中找出匹配字符串的行

    【5】awk '!/root/{print $0}' /etc/passwd #从文件中找出不匹配字符创的行

    【6】awk -F: '/mail/,/mysql/{print}' /etc/passwd  #区间匹配,匹配包含字符串与字符串的行内容

    【7】awk -F: '$1~/mail/{print $1}' /etc/passwd  #$1与指定内容匹配才显示

    【8】awk '/[6][9][7]*/{print $0}' /etc/passwd #匹配包含69为数字开头的行,如69,697,6977等

    【9】awk -F: '$1~/mail/ && $3>8 {print }' /etc/passwd  #逻辑与,匹配$1匹配mail,并且$3》8的内容

    【10】awk -F: '{if($1~/mail/) {print $1} else {print $2}}' /etc/passwd  #找到匹配的行,输出该行第一个字段内容,不匹配的行输出第二个字段的内容

    【11】netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-3s %-10s %-10s %-10s ",NR,$1,$2,$3}'  #匹配$6=="LISTEN"或者NR==1的行,并且格式化输出显示内容。

                  #printf表示格式输出

                  #%格式化输出分隔符

                  #-3长度为8个字符

                  #s表示字符串类型

    【12】awk -F: 'BEGIN{A=0;B=0} {if($3>100) {A++; print "large"} else {B++; print "small"}} END{print A," ",B}' /etc/passwd  #自定义变量,若$3>100,则A+1,否则B+1,最后输出A和B的值。

    作者:linux每天一小步 

    出处:http://www.cnblogs.com/westoslinux

    如果你真心觉得文章写得不错,而且对你有所帮助,不妨帮忙“推荐"一下,您的“推荐”将是我最大的写作动力!

    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接!

  • 相关阅读:
    二进制,八进制,十进制,十六进制之间的转换
    using关键字的使用
    简单工厂和单例设计模式
    面向对象的七种设计原则
    第六章 初始继承和多态
    第五章项目:体检套餐管理系统
    第二章《深入C#数据类型》项目经理评分
    <<MySchool数据库设计优化>> 内部测试
    Python 日志处理(一) 按Nginx log_format 分割日志记录
    Python 爬虫练习(一) 爬取国内代理ip
  • 原文地址:https://www.cnblogs.com/westoslinux/p/6434080.html
Copyright © 2020-2023  润新知