linux awk 命令实用手册

linux awk 命令实用手册,第1张

概述0,简介 Linux 是一个实用的 ,它不仅是一款工具软件,也是一门 。`awk Alfred Aho Peter Weinberger Brian Kernighan`。 如果你在linux 系统中

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 中内置了很多变量,来方便使用,这里介绍一些常用的:

$nNRawk
awk 内置变量含义
FS表示分隔符,类似-F 参数的功能
一行的完整内容
分隔符n隔开的第列,比如filename 表示第一列
当前文件名
当前行当前行数,即NF是第几行
当前行当前行的列数,即分割符IGnorECASE分成了几列
如果为真,表示忽略大小写进行匹配
3,awk 内建函数

函数 常用函数如下:

tolower()toupper()length()split()systime()strftime()sin()cos()sqrt()exp()awk
含义
字符串转小写
字符串转大写
计算字符串长度
字符串分割
Unix 时间戳
C语言时间格式化,用法同strftime中的rand() 函数
随机数
正弦
余弦
平方根
求幂
4,awk 运算符

运算符 支持如下常用运算符:

+ - * / &!~姓名
含义
加,减,乘,除,求余= += -= *= /= %= ^= **=
赋值< <= > >= != ==运算符
比较空格运算符
字符串用于连接||,使用较多
逻辑&&
逻辑!
逻辑~
匹配
不匹配
5,awk 使用案例

假如,我们有如下文件,分别为性别年龄成绩等级省份>>> cat log.txt _________________小明,男,23,550^优秀---北京小丽,女,22,560^优秀---河北小磊,24,530^良好---河南小召,540^优良---山东小欣,545^优良---山西

,
5.1 使用-F

以逗号分隔符>>> awk -F,'{print ,,}' log.txt ______________________________________小明 男 23小丽 女 22小磊 男 24小召 男 23小欣 女 23,并将第1列,第2列和第3列输出,如下:

分隔符

一个字符只有分割符时,-F可以紧挨awk -F,}' log.txt #`分隔符`与`-F`之间有一个空格awk -F',' '{print ,}' log.txt #`分隔符`用单引号引住,并且紧挨`-F`awk -F"," '{print ,}' log.txt #`分隔符`用双引号引住,并且紧挨`-F`awk -F ',}' log.txt #`分隔符`用单引号引住,与`-F`之间有空格awk -F ",}' log.txt #`分隔符`用双引号引住,与`-F`之间有空格,还有如下几种写法:

分隔符

多个连续字符双引号时,必须用单引号或者分割符引住-F,可以紧挨空格,也可以有awk -F '---' '{print }' log.txt #`分隔符`用单引号引住,与`-F`之间有空格awk -F"---" '{print }' log.txt #`分隔符`用双引号引住,与`-F`之间没有空格

分隔符

以上两个命令输出的内容一样,此时---小明,550^优秀 北京小丽,560^优秀 河北小磊,530^良好 河南小召,540^优良 山东小欣,545^优良 山西,每一行都被分成了两列,如下:

单独的分割符

当有多个中括号[]时,将多个分隔符写在,中,如下,表示以--- 或者以>>> awk -F "[,^]" '{print ,,,}' log.txt ________________________小明 男 23 550 优秀---北京小丽 女 22 560 优秀---河北小磊 男 24 530 良好---河南小召 男 23 540 优良---山东小欣 女 23 545 优良---山西 为分隔符:

NR
5.2 使用内置变量

我们用变量当前行号输出NF,变量列数输出当前行的filename,变量文件名输出当前>>> awk -F"---" '{print NR,,NF,filename}' log.txt__________________________________________________________1 小明,550^优秀 北京 2 log.txt2 小丽,560^优秀 河北 2 log.txt3 小磊,530^良好 河南 2 log.txt4 小召,540^优良 山东 2 log.txt5 小欣,545^优良 山西 2 log.txt,如下:

|
5.3 如何连接字符串

我们将每一列使用竖线分隔符 分割,方法是将双引号变量引住,然后紧挨>>> awk -F"---" '{print NR"|""|""|"NF"|"filename}' log.txt__________________________________1|小明,550^优秀|北京|2|log.txt2|小丽,560^优秀|河北|2|log.txt3|小磊,530^良好|河南|2|log.txt4|小召,540^优良|山东|2|log.txt5|小欣,545^优良|山西|2|log.txt,如下:

systime()
5.3 使用内置函数

使用内置函数>>> awk -F"---" '{print NR"|""|""|"NF"|"filename"|"systime()}' log.txt—————————————————————————————————————————————1|小明,550^优秀|北京|2|log.txt|15870224432|小丽,560^优秀|河北|2|log.txt|15870224433|小磊,530^良好|河南|2|log.txt|15870224434|小召,540^优良|山东|2|log.txt|15870224435|小欣,545^优良|山西|2|log.txt|1587022443 输出时间戳,如下:

length

使用行长度 输出>>> awk 'length>5' log.txt——————————————————————————小明,545^优良---山西大于5 的行:

pattern
5.4 使用pattern

使用 只输出>>> awk '/男/ {print NR"|"!}' log.txt__________________________1|小明,550^优秀---北京3|小磊,530^良好---河南4|小召,540^优良---山东 同学信息, 表示每一行的原始内容,如下:

>>> awk '!/男/ {print NR"|"关系表达式}' log.txt__________________________2|小丽,560^优秀---河北5|小欣,545^优良---山西
5.5 使用逻辑非!

使用逻辑非# 以逗号分割后的第三列为年龄>>> awk -F,'==23 {print ,>>> awk -F,'==23 || ==25' log.txt________________________小明,550^优秀---北京小召,545^优良---山西}' log.txt____________________________23 小明,550^优秀---北京23 小召,540^优良---山东23 小欣,545^优良---山西,输出不为模式匹配表达式的学生信息:

awk -F,' ~/24/ {print ,awk}' log.txt24 小磊,530^良好---河南
5.6 使用关系表达式

使用if 语句,输出年龄为23 的学生信息:

if 语句

也可以写成如下方式,输出年龄为23或25 的学生信息:

大括号{}
5.7 使用模式匹配表达式

使用>>> awk -F,'{if(==22) print ,# `NR % 2 == 1` 为基数行>>> awk -F,'NR % 2 == 1 {print NR,$(NF)}' log.txt——————————————————————————1 小明,550^优秀---北京3 小磊,530^良好---河南5 小欣,545^优良---山西}' log.txt___________________________22 小丽,560^优秀---河北,输出年龄为24 的学生信息:

$(NF-1)
5.8 使用if 语句

$(NF-2) 也支持>>> awk -F,'{print $(NF)}' log.txt______________550^优秀---北京560^优秀---河北530^良好---河南540^优良---山东545^优良---山西,输出年龄为22 的学生信息,BEGIN 块写在awk 语句内:

>>> awk -F,'BEGIN{print "姓名","性别","年龄"} {print ,}' log.txt ____________姓名 性别 年龄小明 男 23小丽 女 22小磊 男 24小召 男 23小欣 女 23
5.9 使用NR 输出基数行
END 块
5.10 使用NF 输出倒数第一列

awk 语句 为倒数第1列,BEGIN 块 为倒数第2列,END 块 为倒数第3列,依次类推。

如下输出倒数第1列:

>>> awk -F,} END{print "共有"NR"行信息"}' log.txt ____________姓名 性别 年龄小明 男 23小丽 女 22小磊 男 24小召 男 23小欣 女 23共有5行信息
5.11 使用BEGIN 块

>>> awk '/小丽/,/小欣/' log.txt ______________________________小丽,545^优良---山西中可以是任意多个合法的。

5.12 使用END 块

中可以是任意多个合法的,与可以一起使用。

5.13 使用范围模板

输出小丽和小欣之间的行数据:

(完。)

总结

以上是内存溢出为你收集整理的linux awk 命令实用手册全部内容,希望文章能够帮你解决linux awk 命令实用手册所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1014096.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存