
你好,我是你的测试课老师思寒,本内容来自拉勾教育专栏《测试开发核心技术 46 讲》
在本课时我将讲解 Linux 三剑客,以及它们的具体使用语法。
Linux 三剑客简介首先,我们来了解下 Linux 三剑客具体指什么?
- 第一个工具是 grep,grep 会根据正则表达式查找相关内容并打印对应的数据。
- 第二个工具是 awk,awk 的名字来源于三个作者的名字简称,它可以根据定位到的数据行处理其中的分段。
- 第三个工具是 sed,它是 stream editor 流式编辑器的简称,可以定位到数据行并对数据进行增删改查操作。
因为它们三个组合使用的功能非常的强大,几乎完美的应对了 Shell 中的数据分析场景,于是人们把这三个工具统称为 Linux 三剑客。
Linux 三剑客价值接下来,我们通过对三剑客与 SQL 进行类比,来具体看看它们到底能做些什么?
- grep 相当于 SQL 的 select *from table,它可以进行数据的查找与定位。
- awk 相当于 SQL 的 select field from table,它可以进行数据切片。
- sed 相当于 SQL 的 update table set field=new where field=old,它可以对数据进行修改。
你可以发现,grep 和 awk 可以进行组合使用,来达到查找数据并对数据进行分割的目的,grep 也可以与 sed 组合使用,达到查找数据并修改的目的,它们三个还可以组合在一起使用来完成一系列的操作,就相当于大数据处理中的 Map-Reduce,我们接下来看如何具体的使用它们。
本内容来自拉勾教育专栏《测试开发核心技术 46 讲》
grep首先,我们来看下如何使用 grep,grep 用于根据正则表达式查找相关内容并打印对应的数据,我们打开 Shell 环境,通过 vim/tmp/hello.txt 命令创建一个文件,并在文件内输入三条数据:
- hello from hogwarts
- hello from sevenriby
- hello from testerhome
然后通过 grep hogwarts /tmp/hello.txt 指令查找数据,指令中间的参数是正则表达式,指令后面的参数是文件名。
你可以看到 grep 把 hello from hogwarts 从文件中提取出来。
你还可以通过 grep 把 testerhome 提取出来,通过 cat 指令可以看到在 hello.txt 中有三行数据。
如果我们输入 grep hello 指令,它会把三条数据都提取出来。这就是 grep 的第一个作用,根据指定的正则表达式查取对应的数据,我们上面的演示用的是简单的字符串。
接下来,我们学习如何使用正则表达式获取以字母 s 或 t 开头的后面跟任意两个字符的数据,输入 grep "[st].." /tmp/hello.tex 指令,其中 [] 表示正则表达式,..表示后面跟任意的两个字符,你可以看到输出了两条数据。
我们还可以通过 -o 指令只打印匹配的内容,输入 grep -o "[st].." /tmp/hello.tex 指令,你可以看到只打印了匹配到的内容,而不是整条数据。
grep 还有一些其他的指令,比如 -i 可以忽略字符大小写。
-v 表示将匹配到的内容过滤掉,比如我们输入 grep -v "[st].." /tmp/hello.tex 指令,只显示了一条数据,过滤掉了匹配正则条件的内容。
-o 表示只打印匹配的数据,-E 表示支持使用扩展正则表达式,我们接下来详细了解下 pattern 正则表达式。
我把正则表达式分为两类,第一类称为基本表达式,基本表达式包括了典型的正则标识符。
- ^表示开头
- $表示结尾
- []表示任意匹配项
- *表示0个或多个
- .表示任意字符
第二类是扩展表达式,它在基础表达式的基础上做了一些扩展,支持了更高级的语法和更复杂的条件。
- ?表示非贪婪匹配
- + 表示一个或多个
- () 表示分组
- {} 表示一个范围的约束
- | 表示匹配多个表达式中的任何一个
我们举个例子,输入 grep -E "(hog|home)" /tmp/hello.tex 指令,输出结果分别匹配了 hog 与 home。
但如果你的指令中不含 -E,则指令不支持扩展正则,这个时候你会发现它什么都匹配不到。
如果不使用 -E,我们可以使用 转义符对匹配条件进行转义,也可以达到同样的效果
awk了解完 grep 如何使用,我们接下来学习如何使用 awk。
awk 是 Linux 下的一个命令,同时也是一种语言解析引擎,它的功能非常强大,具备完整的编程特性,可以执行命令、进行网络请求等操作。所以精通 awk 是一个 Linux 工作者必备的技能。我们接下来看下 awk 的语法 awk 'pattern{action}' 的相关知识,pattern是匹配条件,action表示具体需要做的处理。
pettern 语法在一定程度上可以代替 grep。
举个例子,使用双 / 表示一个正则匹配,我们输入 awk '/[st]../' /tmp/hello.txt 指令,你可以看到和 grep 一样,轻松地打印出匹配到的内容,所以在一定程度上 awk 可以替代 grep,但它没有使用 grep 简洁。
还有表示区间选择,比如我们在 1、2、3 之间,使用 awk '$0>2' 指令打印大于 2 的数据 3。
还有一个参数叫 NR,代表记录数,比如输入 awk 'NR>1' /tmp/hello.tex 指令打印去掉第一行的数据。
pattern有非常丰富的语法,你可以课后自己进行练习,同时 awk 还有几个标准的内置变量。
- FS 表示字段分隔符
- OFS 表示输出数据的字段分隔符
- RS 表示记录分隔符
- ORS 表示输出字段的行分隔符
- NF 表示字段数
- NR 表示记录数
比如,我们输入 awk '{print NR,NF}' /tmp/hello.txt 指令,输出显示 hello from hogwarts 被空格分隔成了三个字段,并且 hello.txt 文件中的三条数据字段数都是 3。
我们输入 awk -Fo '{print NR,NF}' /tmp/hello.txt 指令,输出显示我们以 o 为分隔符,将 hello from hogwarts 分为了 4 个字段,下面两条数据以此类推。
我们还可以使用 BEGIN 指令,能够得到同样的结果。
接下来,学习 awk 的字段数据处理。
我们通过 -F 参数指定字段分隔符,这里需要注意 awk 有一个 $0~$N~$NF 的特殊参数,
假设我们以 t 为分隔符打印 $1 和 $2,我们来分析夏结果,
当输入 $1 以 t 为分隔符的时候,t 之前的 hello from hogwar 是 $1 记录,t 之后的 s 是 $2 记录,以此类推,也就是说 awk 通过解析数据内容,然后会根据默认的分隔符打印出每个字段的具体内容,我们输入 awk 'OFS=''-''{print $1,$2,$3}' 并打印输出。
可以看到,hello 指定为 $1,from 指定为 $2,并将默认的空格分隔符替换为 -,我们可以通过 $ 获取具体字段并对其进行相关操作,接下来我们学习 awk 的字段分隔。
这里有几个例子,课后你可以试验一下,同样 awk 也可以实现简单的数据计算功能,比如说awk 'BEGIN{print 10000/3}'。
除了这些之外,awk 还支持词典,用来统计一些特征和数据,它类似于 Java 的 hash 和 Python 的字典。awk 的语法非常灵活,希望你在课后能够把文档打印出来仔细阅读,它可以帮助你在日后的数据分析工作中更加得心应手。
sed然后我们再看第三个工具流式编辑器 sed。sed 的语法和 awk 有点类似,只不过具体的用法不太一样。
- sed[addr]X[opptions],其中 [] 定义了一个范围,x位是具体操作,options表示进行数据修改的选项。
- -e 表示可以指定表达式。
- sed -n '2p' 2 表示打印第二行的数据。
- s 表示查找并替换。
比如我们输入 sed 's#testerhome#world#' /tmp/hello.txt 指令,其中 s 后面可以跟任意符号,比如 / 或 # 都可以表示分隔符,它会用后面的内容替换前面的内容。
- -i 表示直接修改源文件。
- -E 支持扩展表达式。
比如我们把以 t 开头的三个字符都替换成 xxx。你可以看到,后面的 ter 没有改变,是因为需要添加一个额外的标记符 /g。
/g 表示除了替换第一个匹配的字符以外还会把第二个也替换掉,这就是 sed 的用法,你看到 sed 主要帮助我们编辑文件。
那么关于它的匹配符 pattern,你可以给定具体的行数也可以通过正则匹配一个范围,在某个范围内做一个修改;区间范围也是一个类似的用法,你会发现它和 awk 语法很像。
action 与 awk 的不同点在于 awk 专注于数据的提取,而 sed 更专注于数据的修改,sed 的重要作用是完成对数据的增删改查工作,比如:
- d 是删除
- p 是打印
- s 是查找并进行替换
- 1 2 可以根据匹配的数据进行分组处理
所以 sed 也是一个灵活强大的工具,一旦你掌握了上面的全部内容,那么说明你对三剑客已经入门了。
好了,本课时的内容就全部讲完了,下一课时我将分享“Linux 三剑客(下)”,重点讲解Shell Piping 管道的相关知识,记得来听课啊,下节课见。
本内容来自拉勾教育专栏《测试开发核心技术 46 讲》
版权声明:本文版权归属拉勾教育及该专栏作者,任何媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发布/发表,违者必究。