bash语言笔记

2019-08-06  本文已影响0人  DayBreakL

测试开发的shell水平

bash语言总览

变量

变量的定义

a=1
b=daybreak
c="hello world"
d='你玩过"吃鸡"游戏吗'
e=`pwd`

变量的使用

echo $a
echo ${b}
echo "${a}"

预定义变量

echo $PWD
echo $USER
echo $HOME
echo $PATH

数组变量

array=(1,2,3)
array=(`ls`)
echo ${array[index]}
echo ${array[*]}  //获取数组中的所有元素
echo ${#array[*]} //获取数组的长度

变量类型

数字型变量操作

i=1;
echo $i
echo $(i+1)
i=i+1;
echo $i

字符串操作

布尔变量

命令
echo $?

#任何命令执行都有一个返回值,0表示正确,非0表示错误

判断类型

逻辑控制

If结构

for 循环

for((i=0;i<10;i++));do echo $i;done

while循环

i=0;
while [$i -lt 3];
do echo $i;
((i=i+1));
done
while read line;
do echo $line;
done<tmp/tmp

退出控制

shell环境

shell环境概念

shell环境变量

shell输入输出

文件描述符

脚本编写

方式一:
chmod u+x xxx.sh;
./xxx.sh
方式二:
bash xxx.sh #这种方式会开启一个sub shell
方式三:
source xxx.sh  #在当前shell中执行

 - eval 可以执行shell原义语句
 - exec 尽量不要使用,这会破坏当前的shell

三剑客

bash自动化

自动化交互

自动输入方法

linux命令

测试开发应该达到的水平:

一键搭建web网站

python -m CGIHTTPServer 8080
python3 -m http.server

gnuplot 绘图

更多工具

Andriod常用命令

iOS命令

(以后讲)

快速搜索历史输入

ctrl+r
bck-i-search:
ctrl+a 行首
ctrl+e 行尾

实战

提取对外连接的ip数量

#使用命令netstat 参数-ntp
netstat -ntp
#删掉多余的数据行第一行、第二行, 使用sed 1,2d
netstat -ntp | sed 1,2d
#提取内容第五部分,使用awk '{print $5}'
netstat -ntp | sed 1,2d | awk '{print $5}'
#去掉端口号,使用awk -F ':' '{print $1}'
netstat -ntp | sed 1,2d | awk '{print $5}' | awk -F ':' '{print $1}'
#使用sort进行排序,使数据看上去规整一些
netstat -ntp | sed 1,2d | awk '{print $5}' | awk -F ':' '{print $1}' | sort
#去除重复的ip,使用uniq 命令删除重复的行,参数-c显示每个ip出现的次数
netstat -ntp | sed 1,2d | awk '{print $5}' | awk -F ':' '{print $1}' | sort | uniq -c
#使用wc获取ip的数量,参数-l统计行数
netstat -ntp | sed 1,2d | awk '{print $5}' | awk -F ':' '{print $1}' | sort | uniq -c | wc -l

提取testhome首页精华帖的点赞数

#使用curl命令模拟http请求
curl https://testerhome.com
#讲请求返回的错误信息仍进黑洞/dev/null
curl https://testerhome.com 2>/dev/null
#通过开发者工具-检查元素可以查看到精华帖后面的一个钻石icon属于class="fa fa-diamond"
curl https://testerhome.com 2>/dev/null | grep "fa fa-diamond"
#精华帖的list在钻石icon的上一行,使用参数-b1,代表before1行
curl https://testerhome.com 2>/dev/null | grep -b1 "fa fa-diamond"
#实际需要的是精华帖列表那一行,通过该行的关键字筛选
curl https://testerhome.com 2>/dev/null | grep -b1 "fa fa-diamond" | grep "href"
#每个精华帖的href不一样,同时也是每个精华帖的路径,使用awk进行切割
curl https://testerhome.com 2>/dev/null | grep -b1 "fa fa-diamond" | grep "href" | awk -F '\"' '{print $4}'
#因为article是文章集,所以只要topic开头的
curl https://testerhome.com 2>/dev/null | grep -b1 "fa fa-diamond" | grep "href" | awk -F '\"' '{print $4}' | grep "topics"
#进入精华帖详情页去获取点赞数,精华帖详情页的路径https://testerhome.com+上面获取的路径列表
#一行行读取列表,使用while read line;do echo $line;done
curl https://testerhome.com 2>/dev/null | grep -b1 "fa fa-diamond" |grep "href"|awk -F '\"' '{print $4}'| grep "topics"| while read line;do curl https://testerhome.com$line 2>/dev/null;done 
#进入了精华帖详情页,根据开发者工具-检查元素可以发现记录点赞数的class是 "fa fa-heart"
curl https://testerhome.com 2>/dev/null | grep -b1 "fa fa-diamond" |grep "href"|awk -F '\"' '{print $4}'| grep "topics"| while read line;do curl https://testerhome.com$line 2>/dev/null;done |grep "fa fa-heart" 
#除了话题点赞数之外,还有回复的点赞数,使用 grep "data-type=\"Topic\""去掉回复的点赞数的行
curl https://testerhome.com 2>/dev/null | grep -b1 "fa fa-diamond" |grep "href"|awk -F '\"' '{print $4}'| grep "topics"| while read line;do curl https://testerhome.com$line 2>/dev/null;done |grep "fa fa-heart" |grep "data-type=\"Topic\""
#通过awk分割后展示topic、topicid 、点赞数
curl https://testerhome.com 2>/dev/null | grep -b1 "fa fa-diamond" |grep "href"|awk -F '\"' '{print $4}'| grep "topics"| while read line;do curl https://testerhome.com$line 2>/dev/null;done |grep "fa fa-heart" |grep "data-type=\"Topic\""|awk -F '\"' '{print $8,$10,$4}'
#另一种显示:在curl详情页时把点赞数记为一个变量
curl https://testerhome.com 2>/dev/null | grep -b1 "fa fa-diamond" |grep "href"|awk -F '\"' '{print $4}'| grep "topics"| while read line;do count=$(curl https://testerhome.com$line 2>/dev/null |grep "fa fa-heart" |grep "data-type=\"Topic\""|head -1|awk -F '\"' '{print $4}');echo "$line 点赞数是: $count";done

从nginx log中提取数据并可视化

#确定目标日志是1206_2.log
cat 1206_2.log
#使用sed提取某个时间段的日志
#-n选项:只显示匹配处理的行(否则会输出所有)
cat 1206_2.log | sed -n '/07:48:00/,/07:52:00/p'
#使用gnuplot插件进行数据展示(gnuplot不会,随便看看吧)
cat 1206_2.log | sed -n '/07:48:00/,/07:52:00/p' | gnuplot -e "set terminal dumb;set datafile |separator ' ';set timefmt '[%d/%b/%Y:%H%:%M:%S]';set ydata time;set format y '%H%M'%S;|plot '<cat' using 8:4 with lines"
上一篇下一篇

猜你喜欢

热点阅读