0,简介

Linux awk 是一个实用的文本处理工具,它不仅是一款工具软件,也是一门编程语言awk 的名称来源于其三位作者的姓氏缩写,其作者分别是Alfred AhoPeter WeinbergerBrian 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

actionawk 语句组成,比如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 命令实用手册的更多相关文章

  1. linux uniq 命令实用手册

    Linux uniq 命令用于处理文本内容中的重复行. 这里我们只介绍其常用参数,其完整用法可参见man uniq. 例如,我们有如下文件内容: >>> cat log.txt __ ...

  2. linux sort 命令实用手册

    Linux 中的sort 命令是一个很实用的工具,用于对文本内容以行为单位进行ASCII 码排序,默认按照升序进行排序(当然也可以按照降序). sort 命令的格式如下: sort `参数` `文件名 ...

  3. linux awk命令详解

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  4. Linux awk命令常见使用方法介绍

    Linux awk命令常见使用方法介绍 By:授客 QQ:1033553122   awk运行方式有三种,其中常用的为命令行方式 awk [-F  field_separator]  '{patter ...

  5. Linux awk命令 --三剑客老大

    Linux awk命令 --三剑客老大 基本用法: awk  [参数]  ['找谁{干啥}']  文件 参数: -F 分隔符 -v 创建或修改awk变量 OFS 输出分割符 awk显示每一列的时候分隔 ...

  6. linux awk命令详解,使用system来内嵌系统命令, awk合并两列

    linux awk命令详解 简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分 ...

  7. linux awk命令详解--转载

    awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理,然后输出 awk命令形式: awk [-F ...

  8. [转]linux awk命令详解

    原文链接 : http://blog.chinaunix.net/uid-23302288-id-3785105.html   awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢 ...

  9. Linux awk命令详解??????????(研究)

    http://blog.chinaunix.net/uid-25120309-id-3801250.html 一.  AWK 说明  awk是一种编程语言,用于在linux/unix下对文本和数据进行 ...

随机推荐

  1. Python——五分钟理解函数式编程与闭包

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第9篇文章,我们来聊聊Python的函数式编程与闭包. 函数式编程 函数式编程这个概念我们可能或多或少都听说过,刚听 ...

  2. HDU 2147kiki's game(巴什博弈变形)

    题目链接 思路如下 P : 必胜点,那个人先走到 含P的点,那个这个人一定会输, N:必败点,谁走到这个点谁输! 在这一个题中: 某个点是P还是 N,之与 ⬅️左边第一个点.⬇️下边第一个点.↙️左下 ...

  3. 1061 Dating (20分)

    Sherlock Holmes received a note with some strange strings: Let's date! 3485djDkxh4hhGE 2984akDfkkkkg ...

  4. 1035 Password (20分)(水)

    To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem ...

  5. 1027 Colors in Mars (20 分)

    People in Mars represent the colors in their computers in a similar way as the Earth people. That is ...

  6. 数据挖掘-K-近邻算法

    数据挖掘-K-近邻算法 目录 数据挖掘-K-近邻算法 1. K-近邻算法概述 1.1 K-近邻算法介绍 1.1.1 KNN算法作用 1.1.2 KNN 算法思想 1.1.3 KNN算法特点 1.2 K ...

  7. 微信小程序wx:for隐藏遍历的最后一个元素

    微信小程序开发时有时会需要从wx:for遍历的元素中选取最后一个来进行相关操作,以下方法以隐藏最后一个元素为例 index==list.length-1 通过获取列表的总长度减一来得到最后一个元素是最 ...

  8. IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试

    IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试 目的不是为了编写TSC2007驱动,是为了学习IIC驱动的编写,读一下TSC2007的ADC数据进行练习,, Linux主机驱动和外设驱 ...

  9. 【php】文件系统

    一. 了解文件: a) 我们在Windows当中已知众多种文件类型:png.jpeg.jpg.gif.mp3.mp4.avi.rmvb.txt.doc.exl.ppt.php.exe b) 无论我们w ...

  10. Golang微信支付跳过X509验证

    游戏支付提交到微信的post: 微信: https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=23_4 错误信息: err:Post ...