• awk 分解行、字段


    1. 格式

    格式:	awk 'pattern {action} pattern {action}' filename
    注:多个文件时,读取从左到右,读完第一个再读取第二个
    pattern
    	1-/正则表达式/:使用通配符的扩展集。
    	2-关系表达式: 可以是字符串或数字的比较,如$2>$1选择第二个字段比第一个字段长的行。
    	3-模式匹配表达式:~ 匹配; ~! 不配置
    	4-BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。
    	5-END:让用户在最后一条输入记录被读取之后发生的动作。
    

    1.1 action

    //由一或多个命令、函数、表达式组成,之间由换行符或;分号隔开,并位于大括号内。主要有四部份:
    	变量或数组赋值
    	输出命令
    	内置函数
    	控制流命令
    	也可以调用外部shell,使用system指令(参见详解知识点)。
    
    -v var=val    变量, 可外部指定一个变量,在{}中使用
    

    1.2 awk内部变量名

    $0		完整的输入记录-即当期的完整行
    $n		当前记录的第n个字段,字段间由FS分隔。
    NF		每一行($0)拥有的字段数;
    NR		目前awk处理的是“总共第几行”数据;FNR 在当前文件的多少行!(多文件处理时用到)
    FS		指定被处理文件的分割字符,默认空格键,如  awk -F'[;:]'
    OFS		输出字段分隔符(默认值是一个空格)。awk  -F:'{print $1,$3}' OFS="	" passwd.dat
    FS 		目前的分割字符,默认空格键
    ARGC	命令行参数的数目。
    ARGIND	命令行中当前文件的位置(从0开始算)。
    ARGV	包含命令行参数的数组。
    CONVFMT	数字转换格式(默认值为%.6g)
    ENVIRON	环境变量关联数组。
    ERRNO	最后一个系统错误的描述。
    FIELDWIDTHS	字段宽度列表(用空格键分隔)。
    FILENAME	当前文件名。
    IGNORECASE	如果为真,则进行忽略大小写的匹配。
    NF		当前记录中的字段数。
    OFMT	数字的输出格式(默认值是%.6g)。
    ORS		输出记录分隔符(默认值是一个换行符)。
    RLENGTH	由match函数所匹配的字符串的长度。
    RS		记录分隔符(默认是一个换行符)。
    RSTART	由match函数所匹配的字符串的第一个位置。
    SUBSEP	数组下标分隔符(默认值是34)。
    

    1.3 awk内置函数

    //字符串相关
    gsub(r,s)	在整个$0中用s代替r
    gsub(r,s,t)	在整个t中用s替代r
    index(s,t)	返回s中字符串t的第一位置
    length(s)	返回s长度,如果未给出String参数,则返回整条记录的长度
    match(s,r)	测试s是否包含匹配r的字符串
    split(s,a,fs)	以fs为分隔符将s分成序列a
    sprint(fmt,exp)	返回经fmt格式化后的exp
    sub(r,s)		用$0中最左边最长的子串代替s
    substr(s,p)		返回字符串s中从p开始的后缀部分
    substr(s,p,n)	返回字符串s中从p开始长度为n的后缀部分
    tolower( String )
    toupper( String )
    
    //时间函数
    //示例 awk 'BEGIN{tstamp=mktime("2001 01 01 12 12 12");print strftime("%c",tstamp);}'     //2001年01月01日 星期一 12时12分12秒
    mktime( YYYY MM DD HH MM SS[ DST])	生成时间格式
    strftime([format [, timestamp]])	格式化时间输出,将时间戳转为时间字符串 
    systime()	得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数
    

    1.4 awk操作符-运算符

    in	是否数组成员	//{if ($2 in a)print $0}
    

    2. 使用示例

    awk -F '|' '$2>3 {print $1}' data.cvs	//打印指定字段 {print $1} 序号1开始
    
    ////指定分隔符 -F '|' (可多个分隔符)
    awk -F '|' '$2>3 {print $1}'	
    awk -F 'ms' '{print $1}'     //可使用字符串分割(不可多个字符串)
    awk -F"[@ /t]" '{print $2,$3}' test		//以@,空格,Tab键分割test文件的每一行,并输出第二、第三列。(不可多字符串)
    
    //只展示匹配的行
    $ awk '$4 ~/Technology/'	//只第4个字段匹配的行 (不匹配 ~!)
    $ awk '$1 ~/^root/' test	//将显示test文件第一列中以root开头的行。
    
    //调用外部shell
    ls -l |awk '$1~/^d/{system("du -s "$9)}'	//筛选出当前目录下的左右文件夹并显示大小。
    
    //过滤出两个文件中相同行
    awk -F'[/,]' 'NR==FNR{a[$1]=$1}NR>FNR{if ($2 in a) print $0}' b a >c		//推荐,先将记录放在数组中!
    
    //求平均值/求和
    awk '{sum+=$1} END {print "Average = ", sum/NR}'
    
    //删除特定文件外的所有其它文件
    rm -rf `ls -lrt|awk '{if(match($0,".bes.cm.")) print $9}' |awk '{if( !(match($0,"bes.cm.base.meta.object-") || match($0,"bes.cm.base.meta.sdk-") || match($0,".bes.cm.base.sdk-") )) print $0}'`
    
    * / % || && > >= == !=
  • 相关阅读:
    Linux查看程序端口占用情况
    jQuery冒泡事件阻止
    jQuery中.bind() .live() .delegate() .on()的区别
    Java四种线程池的使用
    JSON数据解析
    判断访问浏览器客户端类型(pc,mac,ipad,iphone,android)
    JAVA单线程和多线程的实现方式
    mysql利用st_distance函数查询附近的点的功能
    Redis缓存数据库常见操作
    JAVA获取CLASSPATH路径
  • 原文地址:https://www.cnblogs.com/Desneo/p/7212386.html
Copyright © 2020-2023  润新知