Linux文本处理
Linux文本处理:文本分析工具awk
- AWK是一种处理文本文件的语言,是一个强大的文本分析工具。 - 之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的Family Name的首字符。 - 和 sed 命令类似,awk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理。 - 语法 awk [选项参数] 'script' var=value file(s) awk [选项参数] -f scriptfile var=value file(s) - 选项参数说明: - -F fs :指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。 - -v var=value :赋值一个用户定义变量。 - -f scripfile :从脚本文件中读取awk命令。 - -mf nnn 对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。 - -W compact :在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。 - -W copyleft :打印简短的版权信息。 - -W help :打印全部awk选项和每个选项的简短说明。 - -W lint :打印不能向传统unix平台移植的结构的警告。 - -W lint-old :打印关于不能向传统unix平台移植的结构的警告。 - -W posix:打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。 - -W re-interval :允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。 - -W source program-text :使用program-text作为源代码,可与-f命令混用。 - 内建变量 - \$n 当前记录的第n个字段,字段间由FS分隔 - \$0 完整的输入记录 - ARGC 命令行参数的数目 - ARGIND 命令行中当前文件的位置(从0开始算) - ARGV 包含命令行参数的数组 - CONVFMT 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 - ERRNO 最后一个系统错误的描述 - FIELDWIDTHS 字段宽度列表(用空格键分隔) - FILENAME 当前文件名 - FNR 同NR,但相对于当前文件 - FS 字段分隔符(默认是任何空格) - IGNORECASE 如果为真,则进行忽略大小写的匹配 - NF 当前记录中的字段数 - NR 当前记录数 - OFMT 数字的输出格式(默认值是%.6g) - OFS 输出字段分隔符(默认值是一个空格) - ORS 输出记录分隔符(默认值是一个换行符) - RLENGTH 由match函数所匹配的字符串的长度 - RS 记录分隔符(默认是一个换行符) - RSTART 由match函数所匹配的字符串的第一个位置 - SUBSEP 数组下标分隔符(默认值是/034) - 基本用法 - 用法一: awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号 awk '{print $1,$4}' log.txt #每行按空格或TAB分割,输出文本中的1、4项 - 用法二: awk -F #-F相当于内置变量FS, 指定分割字符 awk -F, '{print $1,$2}' log.txt #使用","分割 - 用法三: awk -v # 设置变量 awk -va=1 '{print $1,$1+a}' log.txt - 用法四: awk -f {awk脚本} {文件名} awk -f cal.awk log.txt - awk脚本 - 关于awk脚本,我们需要注意两个关键词BEGIN和END - BEGIN{ 这里面放的是执行前的语句 } - END {这里面放的是处理完所有的行后要执行的语句 } - {这里面放的是处理每一行时要执行的语句} - 假设有这么一个文件(学生成绩表): ```shell $ cat score.txt Marry 2143 78 84 77 Jack 2321 66 78 45 Tom 2122 48 77 71 Mike 2537 87 97 95 Bob 2415 40 57 62 ``` - 我们的awk脚本如下: ```shell $ cat cal.awk #!/bin/awk -f #运行前 BEGIN { math = 0 english = 0 computer = 0 printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n" printf "---------------------------------------------\n" } #运行中 { math+=$3 english+=$4 computer+=$5 printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5 } #运行后 END { printf "---------------------------------------------\n" printf " TOTAL:%10d %8d %8d \n", math, english, computer printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR } ``` - 我们来看一下执行结果: ```shell $ awk -f cal.awk score.txt NAME NO. MATH ENGLISH COMPUTER TOTAL \--------------------------------------------- Marry 2143 78 84 77 239 Jack 2321 66 78 45 189 Tom 2122 48 77 71 196 Mike 2537 87 97 95 279 Bob 2415 40 57 62 159 \--------------------------------------------- TOTAL: 319 393 350 AVERAGE: 63.80 78.60 70.00 ``` - 实例 ```shell 过滤第一列大于2的行 awk '$1>2' log.txt 过滤第一列等于2的行 awk '$1==2 {print $1,$3}' log.txt 过滤第一列大于2并且第二列等于'Are'的行 awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt 忽略大小写 awk 'BEGIN{IGNORECASE=1} /this/' log.txt 计算文件大小 $ ls -l *.txt | awk '{sum+=$6} END {print sum}' 从文件中找出长度大于80的行 awk 'lenght>80' log.txt 打印九九乘法表 seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}' 使用正则,字符串匹配 # 输出第二列包含 "th",并打印第二列与第四列。~ 表示模式开始。// 中是模式。 awk '$2 ~ /th/ {print $2,$4}' log.txt # 输出包含"re" 的行 awk '/re/ ' log.txt awk '$2 !~ /th/ {print $2,$4}' log.txt 模式取反 ```
顶部
收展
底部
[TOC]
目录
Linux文本处理:查看文本内容
Linux文本处理:vim编辑器
Linux文本处理:输入输出重定向
Linux文本处理:文本查找命令grep
Linux文本处理:数据处理命令sed
Linux文本处理:文本分析工具awk
相关推荐
Linux文件目录管理
Linux打包压缩
Linux软件安装
Linux用户和用户组管理
Linux文件系统管理
Linux系统管理