博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell之文本过滤(awk)
阅读量:5279 次
发布时间:2019-06-14

本文共 2576 字,大约阅读时间需要 8 分钟。

 

分类: 

如果要格式化报文或从一个大的文本文件中抽取数据包,那么awk可以完成这些任务。

为了获取所需信息,文本必须格式化,也就是说要使用域分隔符来划分抽取域,分隔符可以使任意字符。

awk语言的最基本功能是在文件或字符串中基于指定规格浏览和抽取信息。awk抽取信息后,才能进行其他文本操作。awk脚本通常用来格式化文本文件中的信息。

1.调用awk

①命令行的方式:

[python] 
 
  1. awk [-F field-separator] 'commands' input-file(s)  //‘commands’是真正的awk命令  

[-F 域分隔符]是可选的,awk使用空格作为缺省的域分隔符

②将所有awk命令插入到一个文件,是awk程序可执行,然后使用awk命令解释器作为脚本的首行,以便通过键入脚本名称来调用。

③将所有的awk命令插入到一个单独文件,然后调用。

[python] 
 
  1. 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动作,动作语法用'{  }'括起来。

①抽取域

例:

[python] 
 
  1. M.Tansley     05/99   48311   Green   8   40  44  
  2. J.Lulu     06/99   48317   green   9   24  26  
  3. P.Bunny    02/99   48      Yellow  12  35  28  
  4. J.Troll    07/99   4842    Brown-12  26  26  
  5. L.Tansley  05/99   4712    Brown-12  30  28  

首先要抽取文件中的信息,将它们划分成域的形式。

②保存awk输出

有两种方式保存shell提示符下的awk脚本输出。

其一是使用输出重定向符号 >文件名

[python] 
 
  1. awk '{print $0}' readfile > savefile  

第二种方法是使用tee命令,在输出到文件的同时输出到屏幕。

[python] 
 
  1. awk '{print $0}' readfile | tee savefile  

③使用标准输入

实际上任何脚本都是从标准输入中接受输入的。

[python] 
 
  1. 方式一:$awkscript readfile  
  2. 方式二(重定向):$awkscript < radfile  
  3. 方式三(管道):$readfile | awkscript  

④打印所有记录

[python] 
 
  1. awk '{print $0}' readfile   //打印整个文件  

⑤打印单独记录

使用$1,$2...$n,域标示之间用逗号隔开

[python] 
 
  1. awk '{print $1,$4}' readfile    //打印域1和域4  

⑥打印报告头

[python] 
 
  1. awk 'BEGIN {print "xxxx"}{print $1"\t"$4}' readfile  

⑦打印信息尾

[python] 
 
  1. awk 'BEGIN {print "xxx"} {print $1} END {print "end"}' readfile  

 

4.awk中的正则表达式

这里正则表达式用斜线括起来, /字符串/

①匹配

使域号匹配表达式,使用符号'~'后紧跟正则表达式,也可以使用if语句。awk中if语句后面的条件用()括起来。

[python] 
 
  1. awk '{if($4~/字符串/) print $0}' readfile  //如果域4包含匹配的字符串,打印整句  
  2. awk '{$0 ~ /字符串/'} readfile //如果记录包含匹配的字符串,打印整句  

②精确匹配

[python] 
 
  1. awk '{if($3 ~ /字符串/) print $0}' readfile    //包含字符串的所有记录都匹配,不精确  
[python] 
 
  1. awk '$3 == "字符串" {print $0}' readfile   //确保只有字符串得以匹配,精确匹配  

③不匹配

[python] 
 
  1. awk '{if($4 !~ /匹配字符串/) print $0}' readfile  

④小于

[python] 
 
  1. awk '{if($6<$7) print "xxx"}' readfile  

⑤小于等于

[python] 
 
  1. awk '{if($6<=$7) print "xxx"}' readfile  

⑥大于

[python] 
 
  1. awk '{if($6》$7) print "xxx"}' readfile  

⑦设置大小写

为查询大小写信息,可以使用[ ]符号

[python] 
 
  1. awk '/[Gg]reen/' readfile   //匹配green Green的行  

⑧任意字符

[python] 
 
  1. awk '$1 ~/^...a/' readfile  //抽取域1,其记录第一域的第四个字符时a  

⑨或关系匹配

使用或关系符时,语句必须用圆括号括起来

[python] 
 
  1. awk '$0 ~ /(字符串1|字符串2)/' readfile   //匹配|两边模式之一  

⑩行首

[python] 
 
  1. awk '/^字符串/' readfile  

 

其他

&&   AND:语句两边必须同时为真

||  OR:语句两边同时或其中一边匹配为真

! 非 求逆

 

 

转载于:https://www.cnblogs.com/L-H-R-X-hehe/p/3816190.html

你可能感兴趣的文章
C#测试题若干,都是基础阿
查看>>
NetWork——关于TCP协议的三次握手和四次挥手
查看>>
如果TCP采用两次握手
查看>>
An easy problem
查看>>
MauiMETA工具的使用(一)
查看>>
LeetCode: Anagrams 解题报告
查看>>
用cookie登录慕课网络教学中心刷评论
查看>>
牛腩新闻视频 回车键的疑惑
查看>>
poj 2965 The Pilots Brothers' refrigerator
查看>>
Mybatis分页插件
查看>>
初学者编程实战指南 (2)- 避免逻辑的重复
查看>>
java技术基础
查看>>
QA系统Match-LSTM代码研读
查看>>
typedef与define宏定义用于声明新的类型之间的区别
查看>>
idea前后端分离搭建 JavaWeb项目
查看>>
python学习笔记 day44 mysql练习题(三)
查看>>
c# 使用ICSharpCode.SharpZipLib.dll实现文件压缩并返回
查看>>
【Laravel】 常用的artisan命令
查看>>
Qt 中获取本机IP地址
查看>>
基本数据类型(int, bool, str)
查看>>