**
测试必会之Linux三剑客(grep/awk/sed)
**
**
1.grep
grep:根据用户指定的模式(pattern)对目标文本进行过滤,显示被模式匹配到的行。
命令形式:grep [OPTIONS] PATTERN [FILE…]
选项:
-v:显示不被pattern匹配到的行
-i:忽略字符大小写
-n:显示匹配的行号
-c:统计匹配的行数
-o:仅显示匹配到的字符串
-E:使用ERE,相当于egrep
例:
访问 testerhome 主页,找出主页中包含的左右 url,分别进行访问,如果访问成功会返回状态码200,检查所有访问成功的url并打印出来,若没访问成功就打印ERR加上失败的url。
(1)先访问 Testerhome 社区主页,利用 grep href 过滤出所有包含 url 的内容。
命令:curl -s https://testerhome.com | grep href**
(2)从返回的结果中取出 url,观察发现所有的 url 都被包在了双引号之中,那么在利用 grep -o 命令,加上正则表达式匹配,只打印从 http 开始到 url 结束双引号之前的内容。
命令:curl -s https://testerhome.com | grep href | grep -o “http[^”]*"
(3)现在我们需要对每个url进行访问取值判断先用curl -I 看看请求返回的头信息内容。
命令:curl -s -I https://testerhome.com/topics/feed
(4)访问成功返回200,这时候我们一行一行去访问,再用grep命令匹配"200 OK"作为判断条件,筛选出成功的url并打印,然后将失败的 url 加上 ERR 标记也一起打印出来。
命令:curl -s https://testerhome.com | grep href | grep -o “http[^”]*" | while read line;do curl -s -I $line | grep 200 && echo $line || echo ERR $line;done
2.sed
sed:流编辑器,一次处理一行内容。
根据定位到的数据行修改数据 sed [-nefri] [动作]
与grep的区别:
命令形式: sed [-hn..][-e<script>][-f<script文件>][文本文件]
-h:显示帮助
-n:仅显示script处理后的结果
-e<script>
:以选项中指定的脚本来处理输入的文本内容
-f<script文件>
:已选项中指定的脚本文件来处理输入的文本文件
常用动作
a:新增 sed -e ‘4 a newline’
c:取代 sed -e ‘2,5c No 2-5 number’
d:删除 sed -e ‘2,5d’
i:插入 sed -e ‘2i newline’
p:打印 sed -n ‘/root/p’
s:取代 sed -e’s/old/new/g’ g代表全局
例:
(1)在第四行后添加新字符串
sed -e '4 newline testfile’test.txt
注意说明:
sed 在修改文件内容时,是另外开辟了一块模式空间,将修改后的内容放入并输出,源文件并未修改;
这时如果想要修改源文件就需要借助 -i 命令,另外为了防止误操作修改文件,一般可以采取这种写法: sed -i.bak ‘s/hello/HELLO/’ text.txt ,这种写法在修改源文件的同时还会生成一份以.bak结尾的备份文件,相较安全。
3.awk
理论上可以代替 grep,awk 具备完整的编程特性。比如执行命令,网络请求等
awk:把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分在进行后续处理。
命令形式: awk ‘pattern + action’[FILE]
-pattern:正则表达式
-action:对匹配到的内容执行的命令(默认为输出每行内容)
常用参数
FILENAME: awk浏览的文件名
BEGIN: 处理文本之前要执行的操作
END: 处理文本之后要执行的操作
FS: 设置输入域分隔符,等价于命令-F选项
NF: 浏览记录的域的个数(列数)
NR: 已读的记录数(行数)
OFS: 输出域分隔符
ORS: 输出记录分隔符
RS: 控制记录分隔符
$0: 整条记录
$1: 表示当前行的第一个域…以此类推
例:
(1)搜索/etc/passwd有root关键字的所有行,并显示对应的shell
awk -F:’/root/{print $7}’/etc/passwd
(2)打印/etc/passwd/的第二行信息
awk -F:‘NR==2{print $0}’/etc/passwd
注意:大括号{}里面代表动作,{}外面代表正则
(3)使用begin加入标题
awk ‘BEGIN {print"BEGIN",“BEGIN”}{print$1,$2}’/etc/passwd
(4)自定义分隔符
echo 111 222|333 444|555 666"|awk ‘BEGIN{RS="|"}{print $0}’