最有用系列:

《Linux生产环境上,最常用的一套“vim“技巧》

《Linux生产环境上,最常用的一套“Sed“技巧》

《Linux生产环境上,最常用的一套“AWK“技巧》

《"Sed" 高级功能:我这小脑瓜都快绕晕了》

敢用自己的名字做软件名字的,都有非常强大的自信。比如,垠语言什么的。

awk的命名得自于它的三个创始人姓别的首字母,都是80来岁的老爷爷了。当然也有四个人的组合:流行的GoF设计模式。但对于我这游戏爱好者来说,想到的竟然是三位一体,果然是不争气啊。

它长的很像C,为什么这么有名,除了它强大的功能,我们姑且认为a这个字母比较靠前吧。awksed简单,它更像一门编程语言。

打印某一列

下面,这几行代码的效果基本是相同的:打印文件中的第一列。

#Java
System.out.println(aStr.split(" ")[0]); #Python
print(aString.split(" ")[0]) #cut 命令
cut -d " " -f1 file #awk命令
awk '{print $1}' file
复制代码

这可能是awk最常用的功能了:打印文件中的某一列。它智能的去切分你的数据,不管是空格,还是TAB,大概率是你想要的。

对于csv这种文件来说,分隔的字符是,。AWK使用-F参数去指定。以下代码打印csv文件中的第1和第2列。

awk -F ","  '{print $1,$2}' file
复制代码

由此,我们可以看出一个基本的awk命令的组成部分。

一般的开发语言,数组下标是以0开始的,但awk的列$是以1开始的,而0指的是原始字符串。

网络状态统计

本小节,采用awk统计netstat命令的一些网络状态,来看一下awk语言的基本要素。netstat的输出类似于:

其中,第6列,标明了网络连接所处于的网络状态。我们先给出awk命令,看一下统计结果。

netstat  -ant |
awk ' \
BEGIN{print "State","Count" } \
/^tcp/ \
{ rt[$6]++ } \
END{ for(i in rt){print i,rt[i]} }'
复制代码

输出结果为:

State Count
LAST_ACK 1
LISTEN 64
CLOSE_WAIT 43
ESTABLISHED 719
SYN_SENT 5
TIME_WAIT 146
复制代码

下面这张图会配合以上命令详细说明,希望你能了解awk的精髓。

乍一看,好吓人的命令,但是很简单。awk和我们通常的程序不太一样,它分为四个部分。

1、BEGIN 开头部分,可选的。用来设置一些参数,输出一些表头,定义一些变量等。上面的命令仅打印了一行信息而已。

2、END 结尾部分,可选的。用来计算一些汇总逻辑,或者输出这些内容。上面的命令,使用简单的for循环,输出了数组rt中的内容。

3、Pattern 匹配部分,依然可选。用来匹配一些需要处理的行。上面的命令,只匹配tcp开头的行,其他的不进入处理。

4、Action 模块。主要逻辑体,按行处理,统计打印,都可以。

注意点

1、awk的主程序部分使用单引号‘包围,而不能是双引号 2、awk的列开始的index是0,而不是1

例子

我们从几个简单的例子,来看下awk的作用。

1、输出Recv-Q不为0的记录

netstat -ant | awk '$2 > 0 {print}'
复制代码

2、外网连接数,根据ip分组

netstat -ant | awk '/^tcp/{print $4}' | awk -F: '!/^:/{print $1}' | sort | uniq -c
复制代码

3、打印RSS物理内存占用

top -b -n 1 | awk 'NR>7{rss+=$6}END{print rss}
复制代码

4、过滤(去掉)空白行

awk 'NF' file
复制代码

5、打印奇数行

awk 'a=!a' file
复制代码

6、输出行数

awk 'END{print NR}' file
复制代码

这些命令,是需要了解awk的一些内部变量的,接下来我们来介绍。

内置变量

FS

下面的两个命令是等价的 。

awk -F ':'  '{print $3}' file
awk 'BEGIN{FS=":"}{print $3}' file
复制代码

**BEGIN块中的FS,就是内部变量,可以直接指定或者输出。**如果你的文件既有用,分隔的,也有用:分割的,FS甚至可以指定多个分隔符同时起作用。

FS="[,:|]"
复制代码

其他

OFS 指定输出内容的分割符,列数非常多的时候,简化操作。相似命令:

awk -F ':' '{print $1,"-",$2,"-",$4}' file
awk 'BEGIN{FS=":";OFS="-"}{print $1,$2,$4}' file
复制代码

NF 列数。非常有用,比如,过滤一些列数不满足条件的内容。

awk -F, '{if(NF==3){print}}' file
复制代码

NR 行号,例如,下面两个命令是等价的。

cat -n file
awk '{print NR,$0}' file
复制代码

RS 记录分隔标志 ORS 指定记录输出的分隔标志

FILENAME 当前处理的文件名称,在一次性处理多个文件时非常有用

编程语言特性

数学运算

从上面的代码可以看出,awk可以做一些简单的运算。它的语言简洁,不需要显示的定义变量的类型。

比如上面的rt[$6]++,就已经默认定义了一个叫做rt的hash(array?),里面的key是网络状态,而value是可以进行运算的(+-*/%)。

包含一些内置的数学运算(有限)

int
log
sqrt
exp
sin
cos
atan2
rand
srand
复制代码

字符串操作

类似其他语言,awk也内置了很多字符串操作函数。它本来就是处理字符串的,所以必须强大。

length(str) #获取字符串长度
split(input-string,output-array,separator)
substr(input-string, location, length)
复制代码

语言特性

awk是个小型的编程语言,看它的基本语法,如果你需要复杂一点的逻辑,请自行深入了解,包括一些时间处理函数:

# logic
if(x=a){}
if(x=a){}else{}
while(x=a){break;continue;}
do{}while(x=a)
for(;;){} # array
arr[key] = value
for(key in arr){arr[key]}
delete arr[key] asort(arr) #简单排序
复制代码

据说,awk可以胜任所有的文本操作。因为它本身就是一门语言啊。

End

曾经使用awk编写过复杂的日志处理和统计程序。虽然比写sed舒畅了很多,但还是备受煎熬。更加上现在有各种nawk,gawk版本之间的区别,所以业务复杂度一增长,就习惯性的转向更加简洁、工具更全的python。

awk处理一些简单的文本还是极其方便的,最常用的还是打印某一列之类的,包括一些格式化输出。对于awk,要简单的滚瓜烂熟,复杂的耳熟能详,毕竟有些大牛,就喜欢写这种脚本呢。

作者:小姐姐味道
链接:https://juejin.im/post/5d0b4ca1f265da1bbc6fdb9e
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Linux生产环境上,最常用的一套“AWK“技巧【转】的更多相关文章

  1. Linux生产环境上,最常用的一套“Sed“技巧

    sed命令应用广泛,使用简单,是快速文本处理的利器.它其实没多少技巧,背诵.使用是最合适的学习渠道,属于硬技能.但它又很复杂,因为高级功能太多.本篇不去关注sed的高级功能,仅对常用的一些操作,进行说 ...

  2. (转)CentOS(5.8/6.4)linux生产环境若干优化实战

    CentOS(5.8/6.4)linux生产环境若干优化实战 原文:http://blog.51cto.com/oldboy/1336488 特别说明:本文来自老男孩linux培训VIP学生学习笔记. ...

  3. ASP.NET Core 发布至Linux生产环境 Ubuntu 系统

    ASP.NET Core 发布至Linux生产环境 Ubuntu 系统,之前跟大家讲解了 dotnet publish 发布,而没有将整个系统串起来. 今天就跟大家综合的讲一下ASP.NET Core ...

  4. 生产环境上shell的解读

    一直以来对shell都不是很熟悉,只停留在基本的linux上操作上,这周因为定位问题接触到了生产环境上的脚本,因此作为引子学习一下.很多命令只是点到,等真正需要独立完成的时候再去学习. #!/bin/ ...

  5. linux 生产环境搭建

    Linux基础命令杂记   今天又一次搞Linux生产环境搭建.这是种步骤很多,很繁琐而且又不得不做的事情.虽然做过很多次,但还是有很多步骤.命令不记得,每一次到处找资料很麻烦,于是将一些步骤记下,以 ...

  6. 如何一步步在生产环境上部署django和vue

    本文由云+社区发表 本文主要讲述了如何一步步在生产环境上部署django和vue,操作系统默认为centos 说明:后文中出现的以下字符串均表示具体的路径或者名称,含义如下: DJANGO_DIR-- ...

  7. 生产环境上,哨兵模式集群Redis版本升级应用实战

    背景: 由于生产环境上所使用的Redis版本并不一致,好久也没有更新,为了避免版本不同对Redis集群造成影响,从而升级为统一Redis版本! 1.集群架构 一主两从三哨兵: 2.升级方案 (1)升级 ...

  8. CentOS(5.8/6.7)linux生产环境若干优化实战

    CentOS系统安装之后并不能立即投入生产环境使用,往往需要先经过我们运维人员的优化才行.在此讲解几点关于Linux系统安装后的基础优化操作.注意:本次优化都是基于CentOS(5.8/6.7). 下 ...

  9. maven项目打包部署到虚拟机测试和生产环境上及查看日志操作

    调试通过后提交代码到gitlab,打包部署到相应环境(测试或生产环境)步骤一样1.打包在要打包的项目上右键run as maven clean 清除原来的包,然后run as maven instal ...

随机推荐

  1. Unknown column 'startname' in 'field list

    Unknown column 'startname' in 'field list  字段匹配不上 解决思路 1.检查数据库字段名与sql中的字段名是否一致 2.是否为关键字或中英文区别 ,(关键字可 ...

  2. keepalived haproxy 主备配置

    global_defs { router_id k8s_master} vrrp_script chk_http_port {script "/etc/keepalived/check_ha ...

  3. [Gamma阶段]第十次Scrum Meeting

    Scrum Meeting博客目录 [Gamma阶段]第十次Scrum Meeting 基本信息 名称 时间 地点 时长 第十次Scrum Meeting 19/06/06 大运村寝室6楼 30min ...

  4. Python快速入门教程【转】

    第一章 Python基础知识 1.1 介绍      1.1.1 特点      Python是一种面向对象.解释型计算机程序设计语言.语法简洁清晰,强制用空白符作为语句缩进.      Python ...

  5. Feign进行文件上传+表单调用

    Feigin默认是不支持文件上传和表单提交的,需要做一些配置才能支持. 1.feign依赖 图中红色为form支持必须的jar. 2.添加自定义Encoder类: import static java ...

  6. 003 docker安装nginx

    一:安装与运行nginx 1.查找镜像网站 https://c.163yun.com/hub#/m/home/ 2.pull 3.查看当前在运行的容器 docker ps 4.启动nginx 使用后台 ...

  7. 【C++】C++中explicity关键字的使用

    读者可以尝试预言一下这段代码的输出: #include <iostream> using namespace std; class Complex { private: double re ...

  8. [转]JS如何判断一个对象是否为空、是否有某个属性

    原文地址:https://www.cnblogs.com/crackedlove/p/10039105.html 一.js判断一个对象是否为空 方法一: let obj1 = {} let obj2 ...

  9. JS的base64编码解码

    Unicode问题解法 有个小坑是它只支持ASCII. 如果你调用btoa("中文")会报错: Uncaught DOMException: Failed to execute ' ...

  10. 查找算法(7)--Hash search--哈希查找

    1.哈希查找 (1)什么是哈希表(Hash) 我们使用一个下标范围比较大的数组来存储元素.可以设计一个函数(哈希函数, 也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标)相对应,于是用 ...