shell 文本处理之 awk
Posted Kangjier
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell 文本处理之 awk相关的知识,希望对你有一定的参考价值。
awk是一个处理文本的编程语言工具,能用简短的程序处理标准输入或文件、数据排序、计算以及生成报表等等。 基本的命令语法:awk option ‘pattern {action}‘ file 其中pattern表示AWK在数据中查找的内容,而action是在找到匹配内容时所执行的一系列命令。花括号用于根据特定的模式对一系列指令进行分组。 awk处理的工作方式与数据库类似,支持对记录和字段处理,这也是grep和sed不能实现的。 在awk中,缺省的情况下将文本文件中的一行视为一个记录,逐行放到内存中处理,而将一行中的某一部分作为记录中的一个字段。用1,2,3...数字的方式顺序的表示行(记录)中的不同字段。用$后跟数字,引用对应的字段,以逗号分隔,0表示整个行。 在Linux系统下默认awk是gawk,它是awk的GNU版本。可以通过命令查看应用的版本:ls -l /bin/awk 选项 描述 -f program-file 从文件中读取awk程序源文件 -F fs 指定fs为输入字段分隔符 -v var=value 变量赋值 --posix 兼容POSIX正则表达式 --dump-variables=[file] 把awk命令时的全局变量写入文件, 默认文件是awkvars.out --profile=[file] 格式化awk语句到文件,默认是awkprof.out 模式 常用模式有: Pattern Description BEGIN{ } 给程序赋予初始状态,先执行的工作 END{ } 程序结束之后执行的一些扫尾工作 /regular expression/ 为每个输入记录匹配正则表达式 pattern && pattern 逻辑and,满足两个模式 pattern || pattern 逻辑or,满足其中一个模式 ! pattern 逻辑not,不满足模式 pattern1, pattern2 范围模式,匹配所有模式1的记录,直到匹配到模式2 而动作呢,就是下面所讲的print、流程控制、I/O语句等。 示例: 1)从文件读取awk程序处理文件 # vi test.awk {print$2} # tail -n3 /etc/services |awk -f test.awk 48049/tcp 48128/tcp 49000/tcp 2)指定分隔符,打印指定字段 打印第二字段,默认以空格分隔: # tail -n3 /etc/services |awk ‘{print $2}‘ 48049/tcp 48128/tcp 48128/udp 指定冒号为分隔符打印第一字段: # awk-F ‘:‘ ‘{print $1}‘ /etc/passwd root bin daemon adm lp sync ...... 还可以指定多个分隔符,作为同一个分隔符处理: # tail -n3 /etc/services |awk -F‘[/#]‘ ‘{print $3}‘ iqobject iqobject MatahariBroker # tail -n3 /etc/services |awk -F‘[/#]‘ ‘{print $1}‘ iqobject 48619 iqobject 48619 matahari 49000 # tail -n3 /etc/services |awk -F‘[/#]‘ ‘{print $2}‘ tcp udp tcp # tail -n3 /etc/services |awk -F‘[/#]‘ ‘{print $3}‘ iqobject iqobject MatahariBroker # tail -n3 /etc/services |awk -F‘[ /]+‘ ‘{print $2}‘ 48619 48619 49000 []元字符的意思是符号其中任意一个字符,也就是说每遇到一个/或#时就分隔一个字段,当用多个分隔符时,就能更方面处理字段了。 3)变量赋值 # awk-v a=123 ‘BEGIN{print a}‘ 123 系统变量作为awk变量的值: #a=123 # awk-v a=$a ‘BEGIN{print a}‘ 123 或使用单引号 # awk‘BEGIN{print ‘$a‘}‘ 123 4)输出awk全局变量到文件 # seq 5|awk --dump-variables ‘{print $0}‘ 1 2 3 4 5 # cat awkvars.out ARGC:number (1) ARGIND:number (0) ARGV:array, 1 elements BINMODE:number (0) CONVFMT:string ("%.6g") ERRNO:number (0) FIELDWIDTHS:string ("") FILENAME:string ("-") FNR:number (5) FS:string (" ") IGNORECASE:number (0) LINT:number (0) NF:number (1) NR:number (5) OFMT:string ("%.6g") OFS:string (" ") ORS:string (" ") RLENGTH:number (0) RS:string (" ") RSTART:number (0) RT:string (" ") SUBSEP:string ("