awk

1- awk是什么

awk是linux环境下的一个命令行工具,但是由于awk强大的能力,我们可以为awk工具传递一个字符串,该字符串的内容类似一种编程语言的语法,我们可以称其为Awk语言,而awk工具本身则可以看作是Awk语言的解析器。就好比python解析器与Python语言的关系。我们一般使用awk来做什么,awk又适合做什么工作呢。由于awk天生提供对文件中文本分列进行处理,所以如果一个文件中的每行都被特定的分隔符(常见的是空格)隔开,我们可以将这个文件看成是由很多列的文本组成,这样的文件最适合用awk进行处理,其实awk在工作中很多时候被用来处理log文件,进行一些统计工作等。

2 - awk命令的一般组成

awk最常用的工作一般是遍历一个文件中的每一行,然后分别对文件的每一行进行处理,一个完整的awk命令形式如下:

awk [options]  'BEGIN{ commands }  pattern{ commands }  END{ commands }' file
  • options: 表示awk的可选的命令行选项, -F -f -v 。-F指定将文件中每一行分隔成列的分隔符
  • 单引号后面的内容就是整个的awk程序脚本,awk需要对文件每一行分割后的每一列做处理
  • file则是awk要处理的文件名称
  • -F: 指定分隔符
  • -f: 调用脚本
  • -v: 定义变量
  • ‘’: 引用代码块
  • BEGIN: 初始化代码块
  • //: 匹配代码块,可以是字符串或正则表达式
  • {}: 命令代码块,包含一条或多条命令
  • : 多条命令使用分号分隔
  • END: 结尾代码块

特殊用法:
$0 表示整个当前行
NF 字段数量变量
NR 每行的记录号,多文件记录递增
\t 制表符
\n 换行符
~ 匹配,与==相比不是精确比较
!~ 不匹配,不精确比较
-F'[:#/]' 定义三个分隔符

awk对每一行进行分割处理
[root@datanode1 ~]# echo -e '1 2 3 4\n 5 6 7 8 9' | awk '{print $3 " " $2 " " $1}'
3 2 1
7 6 5
  1. 将字符串 1 2 3 4 通过管道传递给awk命令,相当于awk处理一个文件,内容就是 1 2 3 4
  2. 上面的命令并没有添加 -F 指定分割符号,实际上默认情况下awk使用空格分割每一行
  3. 如果需要指定别的字符则使用-F显示指定
  4. 上面的命令是将 1 2 3 4 通过空格(不管列之间有多少个空格都将当作一个空格处理)分割成4列
  5. 在awk中有一种通过$数字引用的变量,引用的是当前行中分割的每一列的内容,数字的序号从1开始。例如$1表示第1列的内容,$2表示第二列,以此类推。$0 表示当前整行的内容。
  6. print是awk的内置函数,用于打印出变量的值。 而我们在$3 $2 $1 之间添加了用双引号引起来的空格,如果没有,则这些变量的值打印出来会连在一起。
  7. 这里的awk命令中{}里面的内容实际上是我们上面完整模式的中间部分,我们省略了上面的BEGIN块,END块,并且中间的程序块我们也省略掉了pattern部分,也就是如果不添加BEGIN或者END说明那么该程序块就是上面完整模式中的中间的那个程序块,该中间的程序块所执行的操作就是循环处理文件内容的每一行,如果文件有10行,那么中间的程序块要运行10次,每一次处理一行的内容,并且处理完当前行之后,下次循环会自动依次处理接下来的行内容。

3 - 使用pattern部分

[root@datanode1 ~]# echo -e '1 2 3 4\n 5 6 7 8 9' | awk '$1 > 2{print $3 " " $2 " " $1}'
7 6 5

$1 > 2{print $3 " " $2 " " $1} => pattern{ commands }

  • $1 > 2: 第一行大于2, 否则不处理这一行
  • pattern部分用来从文件中筛选出需要处理的行进行处理,如果没有则循环处理文件中的所有行

pattern部分可以是任何条件表达式的判断结果,例如>,<,==,>=,<=,!= 同时还可以使用+,-,*,/运算与条件表达式相结合的复合表达式,逻辑 &&,||,! 同样也可以使用进来。另外pattern部分还可以使用 /正则/ 选择需要处理的行。

4 - BEGIN语句块

BEGIN语句块是在匹配文件第一行之前运行的语句块。由于是匹配第一行之前运行,实际上在BEGIN语句块中 $n 是不可用的。一般情况下可以在BEGIN语句块中做一些变量(awk中可以自定义变量,直接为一个变量赋值就定义了一个变量,awk中没有专门定义变量的关键字)初始化的工作,以及一些只需要在开始仅打印一次的输出信息(例如输出表的表头)

[root@datanode1 ~]# echo -e 'words in file\nthe second line' | awk 'BEGIN{print "this is begin"; print ""} {print $1 " " $2 " " $3 " "}'
this is begin

words in file 
the second line 
  1. BEGIN必须为大写
  2. BEGIN中多个语句块用;分隔
  3. 如果需要单独打印空行,需要使用 print ""

5 - END语句块

END语句块是在awk循环执行完所有行的处理之后才执行的,与BEGIN一样,END语句块也只执行一次,我们看看完整的例子。

[root@datanode1 ~]# echo -e 'words in file\n the second line' | awk 'BEGIN{print "this is begin"; print ""} {print $1 " " $2 " " $3 " "} END{print "end"}'
this is begin

words in file 
the second line 
end

小例子,计算和:

[root@datanode1 ~]# echo -e "11 22 33\n44 55 66\n77 88 99" > test.log
[root@datanode1 ~]# cat test.log 
11 22 33
44 55 66
77 88 99
[root@datanode1 ~]# awk 'BEGIN{sum=0} {sum+=$1} END{print sum}' test.log 
132

6 - awk内置函数

awk定义了很多内置函数,下面我们根据函数类型列出常用的函数,下面的函数只是一部分,完整的函数列表则需要查阅awk的官方文档

6.1 - 算术:

  1. atan2(y,x) 返回 y/x 的反正切
  2. cos(x) 返回 x 的余弦;x 是弧度
  3. sin(x) 返回 x 的正弦;x 是弧度
  4. exp(x) 返回 x 幂函数
  5. log(x) 返回 x 的自然对数
  6. sqrt(x) 返回 x 平方根
  7. int(x) 返回 x 的截断至整数的值
  8. rand() 返回任意数字 n,其中 0 <= n < 1
  9. srand([expr]) 将 rand 函数的种子值设置为 Expr 参数的值,或如果省略 Expr 参数则使用某天的时间。返回先前的种子值

6.2 - 字符串

  1. gsub(reg,str1,str2) 使用str1替换所有str2中符合正则表达式reg的子串
  2. sub(reg,str1,str2) 含义与gsub相同,只不过gsub是替换所有匹配,sub只替换第一个匹配
  3. index(str,substr) 返回substr在str中第一次出现的索引,注意索引从1开始计算,如果没有则返回0
  4. length(str) 返回str字符串的长度,length函数还可以返回数组元素的个数
  5. blength(str) 返回字符串的字节数
  6. match(str,reg) 与index函数一样,只不过reg使用正则表达式,例如match("hello",/lo/)
  7. split(str,array,reg)将str分隔成数组保存到array中,分隔使用正则reg,或者字符串都可以,返回数组长度
  8. tolower(str) 转换为小写
  9. toupper(str) 转换为大写
  10. substr(str,start,length) 截取字符串,从start索引开始的length个字符,如不指定length则截取到末尾,索引从1开始

6.3 - 其他:

  1. system(command) 执行系统命令,返回退出码
  2. mktime( YYYY MM dd HH MM ss[ DST]) 生成时间格式
  3. strftime(format,timestamp) 格式化时间输出,将时间戳转换为时间字符串
  4. systime() 得到时间戳,返回从1970年1月1日开始到当前时间(不计闰年)的整秒数

6.4 - awk的内置变量

awk中同样定义了很多内置变量,我们可以直接像使用普通变量一样使用他们,由于awk的版本众多,有些内置变量并不是得到所有awk版本的支持。

说明:[A][N][P][G]表示支持该变量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawk

  1. $n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段
  2. $0 这个变量包含执行过程中当前行的文本内容
  3. [N] ARGC 命令行参数的数目
  4. [G] ARGIND 命令行中当前文件的位置(从0开始算)
  5. [N] ARGV 包含命令行参数的数组
  6. [G] CONVFMT 数字转换格式(默认值为%.6g)
  7. [P] ENVIRON 环境变量关联数组
  8. [N] ERRNO 最后一个系统错误的描述
  9. [G] FIELDWIDTHS 字段宽度列表(用空格键分隔)
  10. [A] FILENAME 当前输入文件的名
  11. [P] FNR 同NR,但相对于当前文件
  12. [A] FS 字段分隔符(默认是任何空格)
  13. [G] IGNORECASE 如果为真,则进行忽略大小写的匹配
  14. [A] NF 表示字段数,在执行过程中对应于当前的字段数
  15. [A] NR 表示记录数,在执行过程中对应于当前的行号
  16. [A] OFMT 数字的输出格式(默认值是%.6g)
  17. [A] OFS 输出字段分隔符(默认值是一个空格)
  18. [A] ORS 输出记录分隔符(默认值是一个换行符)
  19. [A] RS 记录分隔符(默认是一个换行符)
  20. [N] RSTART 由match函数所匹配的字符串的第一个位置
  21. [N] RLENGTH 由match函数所匹配的字符串的长度
  22. [N] SUBSEP 数组下标分隔符(默认值是34)

awk官方文档:
https://www.gnu.org/software/gawk/manual/gawk.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容

  • 转载 原文的排版和内容都更加友好,并且详细,我只是在这里贴出了一部分留作自己以后参考和学习,如希望更详细了解AWK...
    XKirk阅读 3,196评论 2 25
  • awk介绍awk变量printf命令:实现格式化输出操作符awk patternawk actionawk数组aw...
    哈喽别样阅读 1,560评论 0 4
  • 本章主要学习内容awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 awk条件判断 a...
    楠人帮阅读 1,260评论 0 8
  • awk命令的基本使用 [root@shellscript ~]# head -n 3 /etc/passwd | ...
    古寒飞阅读 1,062评论 0 2
  • awk:报告生成器,格式化文本输出 内容: awk介绍 awk基本用法 awk变量 awk格式化 awk操作符 a...
    BossHuang阅读 1,453评论 0 9