在这一篇中我会给大家总结一些关于linux 操作以及shell脚本编写一些基础知识,如果大家有时间的话可以仔细看一些《鸟哥的linux私房菜》这本书籍,如果时间不够的话就把本文列举的一些知识掌握一下。想要学习linux,大家首先要安装一个linux环境。如果在windows系统上的话大家可以安装一个虚拟机来练习。

简单的总结

关于linux,在明白linux系统的一些特点的前提,面试考察的时候基本会考察大家对linux命令的掌握情况,那么对linux知识的分类,可以分为以下几个方面:
(1)一些关于linux操作系统基本常识性内容。如linux是什么、linux上的软件包下载更新怎么弄,linux上文件相关的基本知识以及常用命令。
(2)掌握linux中网络请求相关的命令。主要用于日常测试过程中搭建测试环境以及问题排查等。
(3)掌握查看linux主机性能相关的命令。主要涉及到进程、cpu、内存等信息的查看,为之后做性能测试获取观测指标打下基础。
(4)掌握文本操作相关的linux命令。在这里方面需要大家掌握的命令比较多,并且要能够熟练使用,这里面重点linux的三剑客grep、sed、awk。
除了以上几个方面,我会额外和大家分享我一直觉得比较难懂的linux的重定向的内容。按照惯例,我们从后往前给大家进行展示,因为在《鸟哥的linux私房菜》这个书籍中是按照从前往后的。

文本处理三剑客:grep、sed、awk

关于sed和awk的学习,可以推荐一本书给大家,有时间的话可以看看,没时间的话主要看本文中的内容即可。

在深入了解三个工具的使用之前,我们先简单总结一下三者之间的区别:

  • grep是linux中强大的文本搜索工具,可以借助正则表达式来进行文本搜索,当搜索到相应的匹配内容时会将匹配的行整行的打印出来。它只是单纯的把符合要求的文本行提取出来。所以在学习grep的时候我们要重点学习一下正则表达式。
  • sed是一个流式编辑器,它会对文件中的对所有的文本行进行在线编辑,一次处理一行内容,其重点在于他的编辑功能,但是它的编辑功能不是对原始对文件编辑,而是对读取到内存中的行进行对编辑,不会影响到原始文件到内容,除非我们在输出到过程中进行了重定向。sed中使用的大部分命令是一个字母,功能比较纯粹。
  • awk是一个强大的文本分析工具,他的处理过程是把文本逐行读入,然后以空格作为默认分隔符将文本行进行切片,然后对切片后的内容进行处理,使用的语法更加程序化,处理过程可以由程序设计语言和函数组成,其指令必须用{}括起来。

    Grep命令

    命令格式:命令格式:grep -cInv 正则表达式 filename,其中:
  • c 表示只统计匹配到的函数
  • I 表示忽略大小写
  • n 表示在显示匹配到的行的同时显示对应的行号
  • v 显示不包含匹配文本的所有行
    基本上把这个格式学会了之后 我们再使用grep基本上就是对正则表达式进行学习了。

    正则表达式

    通常和grep一起进行用来筛选出满足要求的行,然后进一步用sed和awk命令进行提取。
    命令 主要作用
    ^ 从行的开头进行匹配,例:^abc 表示匹配以abc开头的行
    $ 在行的尾部进行匹配,例:abc$ 表示匹配已以abc结尾的行
    . 匹配任意一个字符
    * 表示重复前一个表达式0次或无无数次, .* 可以匹配任意字符
    ? 匹配前一个表达式0次或1次
    \ \ .表示普通字符.,而不是前面的特殊元字符,可以转义很多字符
    [] 可以匹配[]中任意一个,如[Ww]hat, 表示可以匹配what或What \ .H[12345]表示可以匹配.H1, .H2, .H3, .H4, .H5
    - 表示一个范围,如[0-9],[A-Z] 表示可以匹配0-9,A-z中的任一字符,也可以[0-9A-z]这样写在一起进行混合使用
    ^ 仅当出现在第一个位置时表示反转匹配, [^0-9]匹配非数字字符, [^aeiou]匹配任意辅音
    {n,m} 表示前一个表达式出现n-m次,是符合要求的。[0-9]{3}表示一个三位数
    10{2,4}1 表示可以匹配1001,10001,100001
    | 表示或,匹配任意一个, linux|unix 表示匹配linux或unix
    () 分组,和|结合使用比较好用

sed 命令

我们使用sed到一般方式为:sed instruction file,表示对file中对每行执行instruction命令,其中instruction 可以写在文件中,也可以是直接在命令行上进行书写。
sed -f instruction_scripte file,通过-f参数指定命令所在对文件。
在使用sed过程中,要记住用单引号将指令括起来。

简单的单指令demo

我们先看一个简单的例子:
sed 's/MA/Mass/' test.sh
结果如下:

虽然这个命令只影响了3行,但是因为sed对遍历所有行,所以最终控制台上输出了所有对行。
我们对这个简单的命令进行解析:
(1)s 代表的是sed中的指令,表明要把定位到的部分进行替换;
(2)MA 就代表了我们使用的定位表达式,表明要把字符中的MA进行替换(这里用的是正则表达式进行书写,所以还是需要学习正则表达相关的内容)
(3)Mass 就表明了新的替换值
(4)/最后还要再补充一个/是因为,sed命令就是通过//来定位和解析的,仅有一个不能完整的解析出来。
(5)这个命令只会把每一个行中定位到的第一个“MA”字符进行替换,要想把一行中所有的MA都进行替换,还需要sed 's/MA/Mass/g' test.sh,用g表示全局替换

多个指令书写

多个指令书写有以下四种方式:

1.使用分号分割指令:sed 's/MA/Mass/g; s/VA/Vass/g' test.sh
2.在每个指令前都放置-e参数:sed -e 's/MA/Mass/g' -e 's/VA/Vass/g' test.sh
3.使用shell都换行输入功能:其实不怎么推荐使用这种方式
4.利用-f指令,将多个命令按行放在一个脚本文件中统一管理

更多选项学习

-n 阻止sed向控制台打印,除非命令行中添加p打印参数,如:
sed -n -e 's/VA/Mass/p' test.sh 这个命令只会把做了替换的相关行进行打印

sed '50,$/s/root/ROOT/g' fileanme, 把fileanme文件都第50行到最后一行的行内容中的root文本进行替换
sed '50,$/d' fileanme 删除fileanme 到第50行到最后一行
sed '/^\.TS/, /^\.TE/d'   fileanme 删除从.TS开头的行到.TE开头的行中到内容,其中\.是为了写出转义字符.。
sed '/^\.TS/, /^\.TE/{
/^$/d
}' fileanme 将.TS开头到行到.TE开头 的内容中的空行删除掉,其中用{ }可以将几个命令组合在一起使用,写出更复杂灵活的表达式

小结

所以总结起来就是:sed 是行寻址的处理命令。行寻址可以是单独的一行,用数字代表到行,也可以是用// 通过模式匹配出到行,这里到行也可以是一个范围。而处理命令则可以用{} 括起来,每一个处理放在一行。就像我们上面列举到这个例子一样。

AWK的使用

awk是一个强大的文本分析工具,他的处理过程是把文本逐行读入,然后以空格作为默认分隔符将文本行进行切片,然后对切片后的内容进行处理,用法格式为:
awk '模式1 {动作1} 模式2 {动作2}' file 对符合模式的行执行相应的动作。
awk -f script_file filename 对filename 文件执行script_file脚本中的命令。同样的对于命令在命令行中进行表达的时候也要像sed中使用的那样,用单引号括起来。
awk的处理更像是程序处理方式,在awk中1 代表由分隔符分割出来的第一列,同理$n,代表第n列。

简单示例