shell之文本过滤(awk)
如果要格式化报文或从一个大的文本文件中抽取数据包,那么awk可以完成这些任务。
为了获取所需信息,文本必须格式化,也就是说要使用域分隔符来划分抽取域,分隔符可以使任意字符。
awk语言的最基本功能是在文件或字符串中基于指定规格浏览和抽取信息。awk抽取信息后,才能进行其他文本操作。awk脚本通常用来格式化文本文件中的信息。
1.调用awk
①命令行的方式:
- awk [-F field-separator] 'commands' input-file(s) //‘commands’是真正的awk命令
[-F 域分隔符]是可选的,awk使用空格作为缺省的域分隔符
②将所有awk命令插入到一个文件,是awk程序可执行,然后使用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用。
③将所有的awk命令插入到一个单独文件,然后调用。
- awk -f awk-script-file input-files(s)
2.awk脚本
在命令中调用awk时,awk脚本由各种操作和模式组成。
awk每次读一条记录或一行,并使用指定的分隔符分隔指定域。
①模式和动作
任何awk语句都是由模式和动作组成。模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式,动作将时刻保持执行状态。
模式可以使任何条件语句或复合表达式或正则表达式。
模式包含两个特殊字符BEGIN和END。
BEGIN语句设置计数和打印头。使用在任何文本浏览动作之前。
END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志,不特别指明模式,awk总是匹配或打印行数。
3.域和记录
awk执行时,其浏览域标记为$1,$2,...$n。$n表示参照第n域,$0表示所有域,用逗号来做域分隔。
打印一个或所有域,使用print命令。这是一个awk动作,动作语法用'{ }'括起来。
①抽取域
例:
- M.Tansley 05/99 48311 Green 8 40 44
- J.Lulu 06/99 48317 green 9 24 26
- P.Bunny 02/99 48 Yellow 12 35 28
- J.Troll 07/99 4842 Brown-3 12 26 26
- L.Tansley 05/99 4712 Brown-2 12 30 28
首先要抽取文件中的信息,将它们划分成域的形式。
②保存awk输出
有两种方式保存shell提示符下的awk脚本输出。
其一是使用输出重定向符号 >文件名
- awk '{print $0}' readfile > savefile
第二种方法是使用tee命令,在输出到文件的同时输出到屏幕。
- awk '{print $0}' readfile | tee savefile
③使用标准输入
实际上任何脚本都是从标准输入中接受输入的。
- 方式一:$awkscript readfile
- 方式二(重定向):$awkscript < radfile
- 方式三(管道):$readfile | awkscript
④打印所有记录
- awk '{print $0}' readfile //打印整个文件
⑤打印单独记录
使用$1,$2...$n,域标示之间用逗号隔开
- awk '{print $1,$4}' readfile //打印域1和域4
⑥打印报告头
- awk 'BEGIN {print "xxxx"}{print $1"\t"$4}' readfile
⑦打印信息尾
- awk 'BEGIN {print "xxx"} {print $1} END {print "end"}' readfile
4.awk中的正则表达式
这里正则表达式用斜线括起来, /字符串/
①匹配
使域号匹配表达式,使用符号'~'后紧跟正则表达式,也可以使用if语句。awk中if语句后面的条件用()括起来。
- awk '{if($4~/字符串/) print $0}' readfile //如果域4包含匹配的字符串,打印整句
- awk '{$0 ~ /字符串/'} readfile //如果记录包含匹配的字符串,打印整句
②精确匹配
- awk '{if($3 ~ /字符串/) print $0}' readfile //包含字符串的所有记录都匹配,不精确
- awk '$3 == "字符串" {print $0}' readfile //确保只有字符串得以匹配,精确匹配
③不匹配
- awk '{if($4 !~ /匹配字符串/) print $0}' readfile
④小于
- awk '{if($6<$7) print "xxx"}' readfile
⑤小于等于
- awk '{if($6<=$7) print "xxx"}' readfile
⑥大于
- awk '{if($6》$7) print "xxx"}' readfile
⑦设置大小写
为查询大小写信息,可以使用[ ]符号
- awk '/[Gg]reen/' readfile //匹配green Green的行
⑧任意字符
- awk '$1 ~/^...a/' readfile //抽取域1,其记录第一域的第四个字符时a
⑨或关系匹配
使用或关系符时,语句必须用圆括号括起来
- awk '$0 ~ /(字符串1|字符串2)/' readfile //匹配|两边模式之一
⑩行首
- awk '/^字符串/' readfile
其他
&& AND:语句两边必须同时为真
|| OR:语句两边同时或其中一边匹配为真
! 非 求逆
shell之文本过滤(awk)的更多相关文章
- shell编程之awk命令详解
shell编程之awk命令详解 a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; out ...
- shell之文本过滤(正则表达式)
shell之文本过滤(正则表达式) 分类: linux shell脚本学习2012-09-14 12:59 213人阅读 评论(0) 收藏 举报 当从一个文件或命令输出中抽取或过滤文本时,可以使用正则 ...
- shell之文本过滤(grep)
shell之文本过滤(grep) 分类: linux shell脚本学习2012-09-14 14:17 588人阅读 评论(0) 收藏 举报 shell正则表达式扩展工具存储 grep(全局正则表达 ...
- shell 强大的awk
from here 小用法,使用awk来对文件随机抽取n行 awk 'BEGIN{srand()} {print rand()"\t"$0}' input_file | sort ...
- shell下的 awk/sed/grep/seq/tr
转自:实例手册 https://github.com/liquanzhou/ops_doc/blob/master/shell%E5%AE%9E%E4%BE%8B%E6%89%8B%E5%86%8C. ...
- shell 三剑客之 awk
awk 是shell 里的常用命令,非常强大!
- shell编程之awk
awk是一种用于处理数据和生成报告的编程语言 awk可以在命令行中进行一些简单的操作,也可以被写成脚本来处理较大的应用问题 awk与grep.sed结合使用,将使shell编程更加容易 awk工作模式 ...
- shell语句记录-awk
cat ./daily_uv/daily_uv_20140104 | awk '{fr[$1]+=$3; k=$1 "_" $2; av[k]+=$3;} END{for (k i ...
- SHELL脚本之awk妙用
对于一个sougou文本文件,解压后大概4G,要求在其基础上切出第一列时间年月日时分秒增加在列中,作为hive的一个索引.先将文件head一下展示格式: [root@Master date]# hea ...
随机推荐
- ATP检测 BAPI BAPI_MATERIAL_AVAILABILITY
*****ATP检测 DATA: END_RLT LIKE EBAN-LFDAT, NOT_AVAILABLE, AVAILABLE( ...
- 什么是 go vendor
go vendor 是golang引入管理包依赖的方式,1.5版本开始引进,1.6正式引进. 基本原理其实就是将依赖的包,特指外部包,复制到当前工程下的vendor目录下,这样go build的时候, ...
- Python学习之表的介绍
9.4 表的介绍 存储引擎 数据的存储方式就是存储引擎,引擎不同,数据的存储方式就不同 MySQL中比较重要的引擎: InnoDB:mysql5.6以上,默认的存储方式 支持 transactio ...
- windows OS安全配置【持续更新20190618】
https://www.52stu.org/?p=76 来源:5号暗区 5号黯区 五号黯区 5号暗区 windows系统的一些加固方法等 关闭445端口: REG ADD HKLM\SYSTEM\Cu ...
- linux netstat 查看端口
1. netstat命令用于显示系统的网络信息,包括网络连接 .路由表 .接口状态2. 一般我们使用 netstat 来查看本机开启了哪些端口,查看有哪些客户端连接 [root@localhost ~ ...
- JackRabbit的来源
题记 写这系列有点老调重弹的味道,比如ahuaxuan已经在他的博客里对于JackRabbit 1.0做了很详细的阐述.之所以再写,是因为JCR推出了JCR 2.0,个人觉得有必要将一些新的特性再罗列 ...
- [gym101981M][2018ICPC南京M题]Mediocre String Problem
题目链接 题目大意是问在$S$串中找区间$[i,j]$,在$T$串中找位置$k$,使得$S[i,j]$和$T[1,k]$可以组成回文串,并且$j-i+1>k$,求这样的三元组$(i,j,k)$的 ...
- Codeforces 1156F Card Bag(概率DP)
设dp[i][j]表示选到了第i张牌,牌号在j之前包括j的概率,cnt[i]表示有i张牌,inv[i]表示i在mod下的逆元,那我们可以考虑转移,dp[i][j]=dp[i-1][j-1]*cnt[j ...
- 插入数据库失败([Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version)
报错信息如下: , ) 原因,read是数据库的关键字, 牢记,如果一个词是数据库的关键字,那么在写数据库语句的时候,这个词一定是蓝色的(关键字颜色)!!
- PHP中时区(timezone)设置的三种方法(转)
方法1: (最好的方法)在php.ini里加上找到date.timezone项,设置date.timezone = "Asia/Shanghai",重启环境就ok了. 方法2: 在 ...