最开始的时候我也是不会写脚本,也玩不明白awk这些东西,你仔细静下心来去看我这篇文章,你就会觉得其实这些东西真的没有那么难
在 awk 中,像其他编程语言一样,它也支持一些基本的数学运算操作
awk '{a = 12; b = 24; print a + b}' wanghaixiang.txt
输出的结果为:
36
36
36
36
上面这段脚本表示,先声明两个变量 a = 12 和 b = 24,然后用 print 打印出 a 加上 b 的结果
awk '$3 < 5500 {print $0}' wanghaixiang.txt
我来解释上面命令结果就是平均工资小于5500的公司名单,你可以这样来理解当$3 < 5500
表示当第 3 列字段
的内容小于 5500
的时候才会执行后面的 {print $0} 代码块
awk '$1 == "yahoo" {print $0}' wanghaixiang.txt
输出的结果是
yahoo 100 4500
如图所示:
awk不光可以这样玩
awk 还有一些其他的条件操作符如下
< 小于
<= 小于或等于
== 等于
!= 不等于
大于
大于或等于
~ 匹配正则表达式
!~ 不匹配正则表达式
awk '{if ($3 < 5500) print $0}' wanghaixiang.txt
如下图所示:
如何理解这个段呢?
你可以这样理解如果第 3 列字段小于 5500 的时候就会执行后面的 print $0
我们在说一下如何在在 awk 中使用正则表达式
在 awk 中支持正则表达式的使用
比如现在我们有这么一个文件wang.txt 里面是莎士比亚的诗。内容如下:
This above all: to thine self be true
There is nothing either good or bad, but thinking makes it so
There’s a special providence in the fall of a sparrow
No matter how dark long, may eventually in the day arrival
awk '/There/{print $0}' wang.txt
让你使用使用正则表达式匹配字符串 “There”
,将包含这个字符串的行打印并输出的效果
接下来让你在这段英语中使用正则表达式配一个包含字母 t 和字母 e ,并且 t 和 e 中间只能有任意单个字符的行,操作如下:
awk '/t.e/{print $0}' wang.txt
解释一下如果只想匹配单纯的字符串 “t.e”, 那正则表达式就是这样的 /t.e/ ,用反斜杠来转义 . 符号 因为 . 在正则表达式里面表示任意单个字符。
继续练习
使用正则表达式来匹配所有以 “The” 字符串开头的行
awk '/^The/{print $0}' wang.txt
如图所示:
^在正则表达式中 ^ 表示以某某字符或者字符串开头的
有开头必有结尾,在来看匹配结尾的行
使用正则表达式来匹配所有以 “true” 字符串结尾的行
awk '/true$/{print $0}' wang.txt
如图:
上面这个$是什么意思呢?
在正则表达式中 $ 表示以某某字符或者字符串结尾。
上面这些只是一些简单的基本操作
下面这个正则表达式 /m[a]t/ 表示匹配包含字符 m ,然后接着后面还要包含中间方括号中表示的单个字符 a ,最后还要包含字符 t 的行,输出结果中只有单词 “matter” 符合这个正则表达式的匹配。因为正则表达式 [a] 方括号中表示匹配里面的任意单个字符
awk '/m[a]t/{print $0}' wang.txt
正则表达式 /s[a-z]/ 表示匹配包含字符 s 然后后面跟着任意 a 到 z 之间的单个字符的字符串,比如 “se”, “so”, “sp” 等等。
awk '/s[a-z]/{print $0}' wang.txt
正则表达式 [] 方括号中还有一些其他用法比如下面这些
[a-zA-Z] 表示匹配小写的 a 到 z 之间的单个字符,或者大写的 A 到 Z 之间的单个字符
[^a-z] 符号 ^
在方括号里面表示取反,也就是非的意思,表示匹配任何非 a 到 z 之间的单个字符
正则表达式中的星号 * 和加号 + 的使用方法
awk '/go*d/{print $0}' wang.txt
上面这个表示匹配包含字符串 “god”,并且中间的字母 “o” 可以出现 0 次或者多次,比如单词 “good” 就符合这个要求。 正则表达式中的 + 和星号原理差不多,只是加号表示任意 1 个或者 1 个以上,也就是必须至少要出现一次。
awk '/ba?d/{print $0}' wang.txt
最后在来一个花括号和圆括号的用法吧
花括号 {} 表示规定它前面的字符必须出现的次数,像上面这个 /go{2}d/ 就表示只匹配字符串 “good”,也就是中间的字母 “o” 必须要出现 2 次
awk '/go{2}d/{print $0}' wang.txt
/go{2,3}d/ 表示字母 “o” 只能可以出现 2 次或者 3 次
/go{2,10}d/ 表示字母 “o” 只能可以出现 2次,3次,4次,5次,6次 … 一直到 10 次
/go{2,}d/ 表示字母 “o” 必须至少出现 2 次或着 2 次以上
正则表达式中的圆括号的用法
awk '/th(in){1}king/{print $0}' wang.txt
/th(in){1}king/ 就表示其中字符串 “in” 必须出现 1 次。而如果不加圆括号就变成了 /thin{1}king/ 这个就表示其中字符 “n” 必须出现 1 次,正则表达式中的圆括号表示将多个字符当成一个完整的对象来看待
面试中也经常会问到awk和正则这些东西
我自己说说使用 awk 的一些总结
因为 awk 算起来也是一种编程语言,它的功能远远不止我们上面讲的这些,awk 还有一些其他比较复杂的功能。但一般我们不建议将 awk 用的太过于复杂。通常面对一些比较复杂的场景我们还是要使用其他的一些工具,比如 shell 脚本
很高兴你能看到这里,相信你肯定学到了很多,我也从不会一点一点学,在学习的道路上真的没有捷径,不要让任何人看不起你自己,你要相信自己是可以的,我以前也觉得我自己不行,学了就忘记,学了也不会,忘记并不可怕,可怕的是你不学,没有真真正正的理解过这个东西,加油