linux awk 命令实用手册

0,简介
Linux awk 是一个实用的文本处理工具,它不仅是一款工具软件,也是一门编程语言。awk 的名称来源于其三位作者的姓氏缩写,其作者分别是Alfred Aho,Peter Weinberger 和 Brian Kernighan。
如果你在linux 系统中追踪awk,可以看到其最终指向的是/usr/bin/gawk,也就是gawk 命令。其GNU官方手册 权威且全面,但对于初学者并不是很友好,因为内容非常多,你可能不知从何看起。对于普通用户,一般也用不到非常复杂的功能。
如果一个文件由规则的多个列组成,则非常适合使用awk 来处理。本文介绍awk 常用方法,对于普通使用者应该是足够了。
1,基本概念
awk 命令会对文本文件的每一行进行处理,其语法格式如下:
awk `参数` `pattern {action}` `filename`
pattern 是要匹配的规则,action 是要执行的动作,只有匹配了pattern 的行,才会执行动作action。
这句命令的含义是:对于文件filename 的每一行,如果能够符合条件pattern,则执行动作action。如果不写pattern,则表示对于文件filename的每一行,都进行action 处理。
1.1,参数
awk 最常使用的参数是-F,其后跟一个分隔符或者正则表达式,其表示的意思是以怎样的规则对每一行进行分割。 默认是空格或Tab键。
1.2,pattern
pattern 可以是下表中的任意一项:
| pattern | 说明 |
|---|---|
/正则表达式/ |
正则写在两个/ 之间 |
关系表达式 |
由awk 中支持的关系运算符组成 |
模式匹配表达式 |
由 ~(匹配)和!~(不匹配)组成 |
BEGIN{语句} |
在处理第一行文本之前,执行BEGIN 块中的语句,可以在这里进行一些变量初始化等操作 |
END{语句} |
在处理完最后一行文本之后,执行END 块中的语句 |
/规则1/,/规则2/ |
这是一个范围模板,只处理规则1第一次出现与规则2第一次出现之间的行 |
1.3,action
action 由awk 语句组成,比如print,用于输出。
2,awk 内置变量
awk 中内置了很多变量,来方便使用,这里介绍一些常用的:
awk 内置变量 |
含义 |
|---|---|
FS |
表示分隔符,类似-F 参数的功能 |
$0 |
一行的完整内容 |
$n |
用分隔符隔开的第n列,比如$1 表示第一列 |
FILENAME |
当前文件名 |
NR |
当前行数,即当前行是第几行 |
NF |
当前行的列数,即当前行被分割符分成了几列 |
IGNORECASE |
如果为真,表示忽略大小写进行匹配 |
3,awk 内建函数
awk 常用函数如下:
| 函数 | 含义 |
|---|---|
tolower() |
字符串转小写 |
toupper() |
字符串转大写 |
length() |
计算字符串长度 |
split() |
字符串分割 |
systime() |
Unix 时间戳 |
strftime() |
时间格式化,用法同C语言中的strftime 函数 |
rand() |
随机数 |
sin() |
正弦 |
cos() |
余弦 |
sqrt() |
平方根 |
exp() |
求幂 |
4,awk 运算符
awk 支持如下常用运算符:
| 运算符 | 含义 |
|---|---|
+ - * / & |
加,减,乘,除,求余 |
= += -= *= /= %= ^= **= |
赋值运算符 |
< <= > >= != == |
比较运算符 |
空格 |
用于连接字符串,使用较多 |
|| |
逻辑或 |
&& |
逻辑与 |
! |
逻辑非 |
~ |
匹配 |
!~ |
不匹配 |
5,awk 使用案例
假如,我们有如下文件,分别为姓名,性别,年龄,成绩,等级和省份:
>>> cat log.txt
_________________
小明,男,23,550^优秀---北京
小丽,女,22,560^优秀---河北
小磊,男,24,530^良好---河南
小召,男,23,540^优良---山东
小欣,女,23,545^优良---山西
5.1 使用-F
以逗号, 为分隔符,并将第1列,第2列和第3列输出,如下:
>>> awk -F, '{print $1,$2,$3}' log.txt
______________________________________
小明 男 23
小丽 女 22
小磊 男 24
小召 男 23
小欣 女 23
当分隔符只有一个字符时,分割符可以紧挨-F,还有如下几种写法:
awk -F , '{print $1,$2,$3}' log.txt #`分隔符`与`-F`之间有一个空格
awk -F',' '{print $1,$2,$3}' log.txt #`分隔符`用单引号引住,并且紧挨`-F`
awk -F"," '{print $1,$2,$3}' log.txt #`分隔符`用双引号引住,并且紧挨`-F`
awk -F ',' '{print $1,$2,$3}' log.txt #`分隔符`用单引号引住,与`-F`之间有空格
awk -F "," '{print $1,$2,$3}' log.txt #`分隔符`用双引号引住,与`-F`之间有空格
当分隔符有多个连续字符时,必须用双引号或者单引号引住分割符,可以紧挨-F,也可以有空格:
awk -F '---' '{print $2}' log.txt #`分隔符`用单引号引住,与`-F`之间有空格
awk -F"---" '{print $5}' log.txt #`分隔符`用双引号引住,与`-F`之间没有空格
以上两个命令输出的内容一样,此时分隔符为---,每一行都被分成了两列,如下:
小明,男,23,550^优秀 北京
小丽,女,22,560^优秀 河北
小磊,男,24,530^良好 河南
小召,男,23,540^优良 山东
小欣,女,23,545^优良 山西
当有多个单独的分割符时,将多个分隔符写在中括号[]中,如下,表示以, 或者以--- 为分隔符:
>>> awk -F "[,^]" '{print $1, $2, $3, $4, $5}' log.txt
________________________
小明 男 23 550 优秀---北京
小丽 女 22 560 优秀---河北
小磊 男 24 530 良好---河南
小召 男 23 540 优良---山东
小欣 女 23 545 优良---山西
5.2 使用内置变量
我们用变量NR输出当前行号,变量NF输出当前行的列数,变量FILENAME输出当前文件名,如下:
>>> awk -F"---" '{print NR, $1, $2, NF, FILENAME}' log.txt
__________________________________________________________
1 小明,男,23,550^优秀 北京 2 log.txt
2 小丽,女,22,560^优秀 河北 2 log.txt
3 小磊,男,24,530^良好 河南 2 log.txt
4 小召,男,23,540^优良 山东 2 log.txt
5 小欣,女,23,545^优良 山西 2 log.txt
5.3 如何连接字符串
我们将每一列使用竖线| 分割,方法是将分隔符用双引号引住,然后紧挨变量,如下:
>>> awk -F"---" '{print NR"|"$1"|"$2"|"NF"|"FILENAME}' log.txt
__________________________________
1|小明,男,23,550^优秀|北京|2|log.txt
2|小丽,女,22,560^优秀|河北|2|log.txt
3|小磊,男,24,530^良好|河南|2|log.txt
4|小召,男,23,540^优良|山东|2|log.txt
5|小欣,女,23,545^优良|山西|2|log.txt
5.3 使用内置函数
使用内置函数systime() 输出时间戳,如下:
>>> awk -F"---" '{print NR"|"$1"|"$2"|"NF"|"FILENAME"|"systime()}' log.txt
—————————————————————————————————————————————
1|小明,男,23,550^优秀|北京|2|log.txt|1587022443
2|小丽,女,22,560^优秀|河北|2|log.txt|1587022443
3|小磊,男,24,530^良好|河南|2|log.txt|1587022443
4|小召,男,23,540^优良|山东|2|log.txt|1587022443
5|小欣,女,23,545^优良|山西|2|log.txt|1587022443
使用length 输出行长度大于5 的行:
>>> awk 'length>5' log.txt
——————————————————————————
小明,男,23,550^优秀---北京
小丽,女,22,560^优秀---河北
小磊,男,24,530^良好---河南
小召,男,23,540^优良---山东
小欣,女,23,545^优良---山西
5.4 使用pattern
使用pattern 只输出男 同学信息,$0 表示每一行的原始内容,如下:
>>> awk '/男/ {print NR"|"$0}' log.txt
__________________________
1|小明,男,23,550^优秀---北京
3|小磊,男,24,530^良好---河南
4|小召,男,23,540^优良---山东
5.5 使用逻辑非!
使用逻辑非!,输出不为男的学生信息:
>>> awk '!/男/ {print NR"|"$0}' log.txt
__________________________
2|小丽,女,22,560^优秀---河北
5|小欣,女,23,545^优良---山西
5.6 使用关系表达式
使用关系表达式,输出年龄为23 的学生信息:
# 以逗号分割后的第三列为年龄
>>> awk -F, '$3==23 {print $3, $0}' log.txt
____________________________
23 小明,男,23,550^优秀---北京
23 小召,男,23,540^优良---山东
23 小欣,女,23,545^优良---山西
也可以写成如下方式,输出年龄为23或25 的学生信息:
>>> awk -F, '$3==23 || $3==25' log.txt
________________________
小明,男,23,550^优秀---北京
小召,男,23,540^优良---山东
小欣,女,23,545^优良---山西
5.7 使用模式匹配表达式
使用模式匹配表达式,输出年龄为24 的学生信息:
awk -F, '$3 ~/24/ {print $3, $0}' log.txt
24 小磊,男,24,530^良好---河南
5.8 使用if 语句
awk 也支持if 语句,输出年龄为22 的学生信息,if 语句写在大括号{}内:
>>> awk -F, '{if($3==22) print $3, $0}' log.txt
___________________________
22 小丽,女,22,560^优秀---河北
5.9 使用NR 输出基数行
# `NR % 2 == 1` 为基数行
>>> awk -F, 'NR % 2 == 1 {print NR, $0}' log.txt
——————————————————————————
1 小明,男,23,550^优秀---北京
3 小磊,男,24,530^良好---河南
5 小欣,女,23,545^优良---山西
5.10 使用NF 输出倒数第一列
$(NF) 为倒数第1列,$(NF-1) 为倒数第2列,$(NF-2) 为倒数第3列,依次类推。
如下输出倒数第1列:
>>> awk -F, '{print $(NF)}' log.txt
______________
550^优秀---北京
560^优秀---河北
530^良好---河南
540^优良---山东
545^优良---山西
5.11 使用BEGIN 块
BEGIN 块中可以是任意多个合法的awk 语句。
>>> awk -F, 'BEGIN{print "姓名", "性别", "年龄"} {print $1, $2, $3}' log.txt
____________
姓名 性别 年龄
小明 男 23
小丽 女 22
小磊 男 24
小召 男 23
小欣 女 23
5.12 使用END 块
END 块中可以是任意多个合法的awk 语句,BEGIN 块与END 块可以一起使用。
>>> awk -F, 'BEGIN{print "姓名", "性别", "年龄"} {print $1, $2, $3} END{print "共有"NR"行信息"}' log.txt
____________
姓名 性别 年龄
小明 男 23
小丽 女 22
小磊 男 24
小召 男 23
小欣 女 23
共有5行信息
5.13 使用范围模板
输出小丽和小欣之间的行数据:
>>> awk '/小丽/,/小欣/' log.txt
______________________________
小丽,女,22,560^优秀---河北
小磊,男,24,530^良好---河南
小召,男,23,540^优良---山东
小欣,女,23,545^优良---山西
(完。)
linux awk 命令实用手册的更多相关文章
- linux uniq 命令实用手册
Linux uniq 命令用于处理文本内容中的重复行. 这里我们只介绍其常用参数,其完整用法可参见man uniq. 例如,我们有如下文件内容: >>> cat log.txt __ ...
- linux sort 命令实用手册
Linux 中的sort 命令是一个很实用的工具,用于对文本内容以行为单位进行ASCII 码排序,默认按照升序进行排序(当然也可以按照降序). sort 命令的格式如下: sort `参数` `文件名 ...
- linux awk命令详解
linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...
- Linux awk命令常见使用方法介绍
Linux awk命令常见使用方法介绍 By:授客 QQ:1033553122 awk运行方式有三种,其中常用的为命令行方式 awk [-F field_separator] '{patter ...
- Linux awk命令 --三剑客老大
Linux awk命令 --三剑客老大 基本用法: awk [参数] ['找谁{干啥}'] 文件 参数: -F 分隔符 -v 创建或修改awk变量 OFS 输出分割符 awk显示每一列的时候分隔 ...
- linux awk命令详解,使用system来内嵌系统命令, awk合并两列
linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...
- linux awk命令详解--转载
awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 awk命令形式: awk [-F ...
- [转]linux awk命令详解
原文链接 : http://blog.chinaunix.net/uid-23302288-id-3785105.html awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢 ...
- Linux awk命令详解??????????(研究)
http://blog.chinaunix.net/uid-25120309-id-3801250.html 一. AWK 说明 awk是一种编程语言,用于在linux/unix下对文本和数据进行 ...
随机推荐
- Windows 7 NVMe补丁(包括官网下载链接)
随着NVMe固态硬盘的普遍,很多想使用Windows 7,又想使用NVMe固态硬盘的,不得不打两个NVMe补丁 这两个补丁主要是:KB2990941和KB3087873 32位 百度网盘 64位 百度 ...
- Python中的编码及操作文件
------------恢复内容开始------------ 1,字符编码 ASCII 用1个字符来表示所有的英文字母和特殊符号 GB2313(GBK)用2个字符来表示英文字母及中文字符,且决定如果 ...
- Django-on_delete
一.外键的删除 关于on_delete的总结 1.常见的使用方式(设置为null) class BookModel(models.Model): """ 书籍表 &quo ...
- Lisp-02: 函数
函数(functions) 在 Lisp 中,函数分两种:有名函数和匿名函数(lambda函数). 有名函数 defun 有名函数的标准定义格式为: (defun <name> (list ...
- 实践指路明灯,源码剖析flink-metrics
1. 通过上期的分享,我们对 Metrics 类库有了较深入的认识,并对指标监控的几个度量类型了如指掌. 本期,我们将走进当下最火的流式处理框架 flink 的源码,一同深入并学习一下别人家的代码. ...
- 记python 链式比较的坑
前两天,python交流群里有人问: “x”<"y"==True 这个表达式输出的是什么,脑子都没动,就觉得应该是True 居然被否定了!立马在命令行里敲了一下,准备用事实打 ...
- 开启sftp服务日志并限制sftp访问目录
目录导航 目录导航 开启sftp日志 修改sshd_config 修改syslogs 重启服务查看日志 限制sftp用户操作目录 前提说明 1. home目录做根目录 2. 单独创建目录做根目录 方法 ...
- tf.nn.conv2d 卷积
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None) 第一个参数input:指需要做卷积的输入 ...
- paddlehub Test on win10
conda 构建虚拟环境 1)虚拟环境下安装paddlepaddle 1.7 2)pip install paddlehub 3)添加环境变量hub_home,以免模型把c盘撑爆 4)下载的模型在.p ...
- 用pip install不能成功安装时的处理方法
解决办法: pip install pymysql -i http://pypi.douban.com/simple --trusted-host pypi.douban.com