文档章节

运维利器之AWK

蔡佳娃
 蔡佳娃
发布于 2017/09/04 21:54
字数 1107
阅读 21
收藏 0
点赞 0
评论 0

功能

    一个行文本处理工具,可以逐行处理文件中的数据。

语法

    本文中提到的cjw.txt内容大致如下:

Installing fontpackages-filesystem-1.41-1.1.el6.noarch
warning: fontpackages-filesystem-1.41-1.1.el6.noarch: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Installing liberation-fonts-common-1.05.1.20090721-5.el6.noarch
Installing xml-common-0.6.3-32.el6.noarch
Installing iso-codes-3.16-2.el6.noarch
Installing setup-2.8.14-20.el6.noarch
Installing filesystem-2.4.30-3.el6.i686
Installing dejavu-fonts-common-2.30-2.el6.noarch
Installing xkeyboard-config-2.6-6.el6.noarch
Installing control-center-filesystem-2.28.1-38.el6.i686
Installing paktype-fonts-common-2.0-8.el6.noarch

语法说明

awk 'pattern + {action}'

desc:
1. 单引号''是为了和shell命令区分开
2. 大括号{}表示一个命令分组
3. pattern是一个过滤器,表示符合pattern的行才进行action处理
4. action是处理动作
5. 使用#作为注释

eg.
#显示cjw.txt中的第三行到第五行
awk 'NR==3,NR==5{print}' cjw.txt

#输出
Installing liberation-fonts-common-1.05.1.20090721-5.el6.noarch
Installing xml-common-0.6.3-32.el6.noarch
Installing iso-codes-3.16-2.el6.noarch

常用命令选项

-F fs   fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:

-v var=value   赋值一个用户定义变量,将外部变量传递给awk

-f scripfile  从脚本文件中读取awk命令

-m[fr] val   对val值设置内在限制

pattern说明

    pattern参数可以是grep正则中的一个,正则使用/pattern/。

#显示cjw.txt中,正则匹配Install的行
awk '/Install/' cjw.txt

#输出
Installing fontpackages-filesystem-1.41-1.1.el6.noarch
Installing liberation-fonts-common-1.05.1.20090721-5.el6.noarch
Installing xml-common-0.6.3-32.el6.noarch
Installing iso-codes-3.16-2.el6.noarch
...

    pattern和action可以只有其一,但不能两者都没有,默认的action是print。

#显示cjw.txt中,长度大于80行的内容
awk 'length($0)>80' cjw.txt
#等价于
awk 'length($0)>80 {print $0}' cjw.txt


#显示cjw.txt中,长度大于80的行号和内容
awk 'length($0)>80 {print NR, $0}' cjw.txt

#输出
2 warning: fontpackages-filesystem-1.41-1.1.el6.noarch: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY

内置变量

FS 分隔符,默认是空格
NR 当前行数,从1开始
NF 当前记录字段个数
$0 当前记录
$1~$n 当前记录第n个字段
#显示cjw.txt中第3行到第5行的第一列与最后一列
awk 'NR==3,NR==5{print $1,$NF}' cjw.txt

#输出
Installing liberation-fonts-common-1.05.1.20090721-5.el6.noarch
Installing xml-common-0.6.3-32.el6.noarch
Installing iso-codes-3.16-2.el6.noarch


#按定界符"-"分割每行的内容,然后打印输出第一列和第二列
awk 'BEGIN{FS="-"}{print $1,$2}' cjw.txt

#输出
Installing fontpackages filesystem
warning: fontpackages filesystem
Installing liberation fonts
Installing xml common
Installing iso codes
Installing setup 2.8.14

内置函数

gsub(r, s) 在$0中用s代替r
index(s, t) 返回s中t的第一个位置
length(s) s的长度
match(s, r) s是否匹配r
split(s, a, fs) 在fs上将s分成序列a
substr(s, p) 返回s从p开始的子串
#将文本中的Installing替换为cjw,输出可以替换的行号以及替换后的内容
awk 'gsub("Installing", "cjw"){print NR, $0}' cjw.txt

#输出
1 cjw fontpackages-filesystem-1.41-1.1.el6.noarch
3 cjw liberation-fonts-common-1.05.1.20090721-5.el6.noarch
4 cjw xml-common-0.6.3-32.el6.noarch
5 cjw iso-codes-3.16-2.el6.noarch
...


#输出cjw.txt文本中的包含common的行号及其行内容
awk 'match($0,"common") {print NR, $0}' cjw.txt

#输出
3 Installing liberation-fonts-common-1.05.1.20090721-5.el6.noarch
4 Installing xml-common-0.6.3-32.el6.noarch
8 Installing dejavu-fonts-common-2.30-2.el6.noarch
11 Installing paktype-fonts-common-2.0-8.el6.noarch
...

操作符

    支持+、-、*、、、%、++、-、+=等运算操作。支持==、!=、>、~等判断操作。

控制语句

    BEGIN和END本质是一个pattern。BEGIN用于awk程序开始开始前,做一些初始化的工作;END用于awk程序结束前,做一些收尾的工作。

    流程控制语句与其他语言几乎相同,就不在此赘述。

#使用空格将info进行切割,输出切割后数组的长度以及函数split的返回值
awk 'BEGIN{info="it is a test";lens=split(info,tA," "); print length(tA),lens;}'

#输出
4 4


#控制流的使用
awk 'BEGIN { 
    test=100; 
    if (test>90) { 
        print "very good"; 
    } else if (test>60) { 
        print "good"; } 
    else { 
        print "no pass"; 
    } 
}'

#输出
very good

 

© 著作权归作者所有

共有 人打赏支持
蔡佳娃
粉丝 16
博文 54
码字总数 48865
作品 0
海淀
程序员
awk分组求和分组统计次数

awk分组求和分组统计次数 运维生存时间 - 运维生存时间2017-12-037 阅读 Linux命令awk 发表评论 A+ 所属分类: Linux命令 分组求和 以第一列 为变量名 第一列为变量,将相同第一列的第二列数...

运维生存时间 - 运维生存时间 ⋅ 2017/12/03 ⋅ 0

Linux运维处理及监控脚本【Linux运维之道之脚本案例】

Linux运维处理及监控脚本【Linux运维之道之脚本案例】 Linux日常运维工作一个一个命令搞是一件苦事情,作为新一代IT运维工作者,在工作中不断探索提升效率方法和经验,摸索出不少脚本,减轻日...

yaabb163 ⋅ 2014/01/10 ⋅ 0

【安全牛学习笔记】基本工具-tcpdump

一.简介 No-GUI的抓包工具 Linux 、Unix 系统默认安装 二.抓包使用 默认值抓68个字节 抓包指令 tcpdump -i eth0 -s 0 -w file.pcap 0表示直接抓取整个包 tcpdump -i eth0 port 读取抓包文件 ...

安全牛课堂 ⋅ 2017/11/09 ⋅ 0

用shell脚本实现增加,删除用户,查询更改UID和GID以及统计用户数

学习linux是从基础的命令开始的,当熟悉命令后,我们就得学习shell脚本的编写。在实际运维中,我们不可能一直盯着服务器看,机器式的维护,而是通过脚本,实现自动化运维,这也是运维的一种趋...

lyj19911101 ⋅ 2014/05/14 ⋅ 0

linux系统计算从1加到100之和思路风暴

原题:通过shell编程或命令行方式求1+2+3...+100=?的和来活学活用shell及linux命令。 阅读完本博文,你将熟悉shell编程中的for语句、while语句及until等语句的使用语法和应用方法。在linux的...

李长春 ⋅ 2012/02/02 ⋅ 0

【安全牛学习笔记】kali TOP10 安全工具:

kali TOP10 安全工具: burpsuite截断信息 maltego收集信息 metasploit framework渗透测试框架,有许多安全工具 nmap网络发现扫描器 owasp-zap 渗透、拦截、扫描工具 sqlmap web注入探测 wi...

安全牛课堂 ⋅ 2017/11/20 ⋅ 0

运维利器万能的 strace

运维利器万能的 strace 运维生存时间 - 运维生存时间2017-12-022 阅读 straceLinux命令 发表评论 A+ 所属分类: Linux命令 strace是什么? 按照strace官网的描述, strace是一个可用于诊断、调...

运维生存时间 - 运维生存时间 ⋅ 2017/12/02 ⋅ 0

我的友情链接

51CTO博客开发 虫子 寒.枫 lab-net 微软IT技术准备营 虚拟的现实 yahoon的小屋 sery 王春海的博客 赵劼 叶伟(魔教教主) 喻勇的博客 IT图书策划 “非主流”程序员的大陆 下里巴人的家 淡淡 ...

holy2009 ⋅ 2017/11/22 ⋅ 0

高级运维工程师的打怪升级之路

运维工程师在前期是一个很苦逼的工作,在这期间可能干着修电脑、掐网线、搬机器的活,显得没地位!时间也很碎片化,各种零碎的琐事围绕着你,很难体现个人价值,渐渐的对行业很迷茫,觉得没什...

顶风走千里 ⋅ 2017/12/19 ⋅ 0

运维自动化之路---------一直在路上

运维工程师在前期是一个很苦逼的工作,在这期间可能干着修电脑、掐网线、搬机器的活,显得没地位!时间也很碎片化,各种零碎的琐事围绕着你,很难体现个人价值,渐渐的对行业很迷茫,觉得没什...

邱月涛 ⋅ 2017/12/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部