awk加正则表达式你必须要会的东西

从了解到熟悉再到精通

任何时候都要相信自己,加油

最开始的时候我也是不会写脚本,也玩不明白awk这些东西,你仔细静下心来去看我这篇文章,你就会觉得其实这些东西真的没有那么难

在 awk 中使用数学运算

在 awk 中,像其他编程语言一样,它也支持一些基本的数学运算操作

awk '{a = 12; b = 24; print a + b}' wanghaixiang.txt

输出的结果为:
36
36
36
36
上面这段脚本表示,先声明两个变量 a = 12 和 b = 24,然后用 print 打印出 a 加上 b 的结果

  • 看到上面的输出结果,你很可能又是一脸的懵逼,为什么会重复输出 4 次同样的计算结果。所以说小时不学好,长大做IT。 知识这东西真到了要用的时候,能亮瞎别人的双眼,好了,不废话。请记住 awk 是针对文件的每一行来执行一次单引号 里面的脚本代码,每读取到一行就会执行一次,文件里面有多少行就会执行多少次,但 BEGIN 和 END 关键字后面的 脚本代码除外,如果被处理的文件中什么都没有,那 awk 就一次都不会执行
    awk 还支持其他的数学运算符
  • 加法运算符 +
  • 减法运算符 -
  • 乘法运算符 *
  • 除法运算符 /
  • 取余运算符 %
    接下来说一说在awk中的判断条件
    比如有一个文件wanghaixiang.txt 内容如下:
    yahoo 100 4500
    google 150 7500
    apple 180 8000
    twitter 120 5000
    让你判断文件的第 3 列数据,也就是平均工资小于 5500 的公司,然后将其打印输出
awk '$3 < 5500 {print $0}' wanghaixiang.txt 

awk加正则表达式你必须要会的东西_第1张图片
我来解释上面命令结果就是平均工资小于5500的公司名单,你可以这样来理解当$3 < 5500 表示当第 3 列字段的内容小于 5500 的时候才会执行后面的 {print $0} 代码块

awk '$1 == "yahoo" {print $0}' wanghaixiang.txt

输出的结果是
yahoo 100 4500
如图所示:
在这里插入图片描述
awk不光可以这样玩
awk 还有一些其他的条件操作符如下
< 小于
<= 小于或等于
== 等于
!= 不等于
大于
大于或等于
~ 匹配正则表达式
!~ 不匹配正则表达式

  • 使用 if 指令判断来实现上面同样的效果
awk '{if ($3 < 5500) print $0}' wanghaixiang.txt

如下图所示:
awk加正则表达式你必须要会的东西_第2张图片
如何理解这个段呢?
你可以这样理解如果第 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

如图所示:
awk加正则表达式你必须要会的东西_第3张图片

让你使用使用正则表达式匹配字符串 “There” ,将包含这个字符串的行打印并输出的效果

接下来让你在这段英语中使用正则表达式配一个包含字母 t 和字母 e ,并且 t 和 e 中间只能有任意单个字符的行,操作如下:

awk '/t.e/{print $0}' wang.txt

awk加正则表达式你必须要会的东西_第4张图片
解释一下如果只想匹配单纯的字符串 “t.e”, 那正则表达式就是这样的 /t.e/ ,用反斜杠来转义 . 符号 因为 . 在正则表达式里面表示任意单个字符。

继续练习
使用正则表达式来匹配所有以 “The” 字符串开头的行

awk '/^The/{print $0}' wang.txt 

如图所示:
awk加正则表达式你必须要会的东西_第5张图片
^在正则表达式中 ^ 表示以某某字符或者字符串开头的

有开头必有结尾,在来看匹配结尾的行
使用正则表达式来匹配所有以 “true” 字符串结尾的行

awk '/true$/{print $0}' wang.txt

如图:
awk加正则表达式你必须要会的东西_第6张图片
上面这个$是什么意思呢?
在正则表达式中 $ 表示以某某字符或者字符串结尾。
上面这些只是一些简单的基本操作

下面难度升级

下面这个正则表达式 /m[a]t/ 表示匹配包含字符 m ,然后接着后面还要包含中间方括号中表示的单个字符 a ,最后还要包含字符 t 的行,输出结果中只有单词 “matter” 符合这个正则表达式的匹配。因为正则表达式 [a] 方括号中表示匹配里面的任意单个字符

awk '/m[a]t/{print $0}' wang.txt 

awk加正则表达式你必须要会的东西_第7张图片
正则表达式 /s[a-z]/ 表示匹配包含字符 s 然后后面跟着任意 a 到 z 之间的单个字符的字符串,比如 “se”, “so”, “sp” 等等。

awk '/s[a-z]/{print $0}' wang.txt 

awk加正则表达式你必须要会的东西_第8张图片
正则表达式 [] 方括号中还有一些其他用法比如下面这些
[a-zA-Z] 表示匹配小写的 a 到 z 之间的单个字符,或者大写的 A 到 Z 之间的单个字符
[^a-z] 符号 ^ 在方括号里面表示取反,也就是非的意思,表示匹配任何非 a 到 z 之间的单个字符
正则表达式中的星号 * 和加号 + 的使用方法

awk '/go*d/{print $0}' wang.txt 

awk加正则表达式你必须要会的东西_第9张图片
上面这个表示匹配包含字符串 “god”,并且中间的字母 “o” 可以出现 0 次或者多次,比如单词 “good” 就符合这个要求。 正则表达式中的 + 和星号原理差不多,只是加号表示任意 1 个或者 1 个以上,也就是必须至少要出现一次。

  • 正则表达式问号 ? 的使用方法
  • 正则表达式中的问号 ? 表示它前面的字符只能出现 0 次 或者 1 次,也就是可以不出现,也可以出现,但如果有出现也只能出现 1 次。
awk '/ba?d/{print $0}' wang.txt 

awk加正则表达式你必须要会的东西_第10张图片
最后在来一个花括号和圆括号的用法吧
花括号 {} 表示规定它前面的字符必须出现的次数,像上面这个 /go{2}d/ 就表示只匹配字符串 “good”,也就是中间的字母 “o” 必须要出现 2 次

awk '/go{2}d/{print $0}' wang.txt

awk加正则表达式你必须要会的东西_第11张图片
正则表达式中的花括号还有一些其他的用法如下

/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 

awk加正则表达式你必须要会的东西_第12张图片 /th(in){1}king/ 就表示其中字符串 “in” 必须出现 1 次。而如果不加圆括号就变成了 /thin{1}king/ 这个就表示其中字符 “n” 必须出现 1 次,正则表达式中的圆括号表示将多个字符当成一个完整的对象来看待

面试中也经常会问到awk和正则这些东西
我自己说说使用 awk 的一些总结
因为 awk 算起来也是一种编程语言,它的功能远远不止我们上面讲的这些,awk 还有一些其他比较复杂的功能。但一般我们不建议将 awk 用的太过于复杂。通常面对一些比较复杂的场景我们还是要使用其他的一些工具,比如 shell 脚本

很高兴你能看到这里,相信你肯定学到了很多,我也从不会一点一点学,在学习的道路上真的没有捷径,不要让任何人看不起你自己,你要相信自己是可以的,我以前也觉得我自己不行,学了就忘记,学了也不会,忘记并不可怕,可怕的是你不学,没有真真正正的理解过这个东西,加油

你可能感兴趣的:(awk,运维,shell)