反引号里面的内容会被当做命令执行
查看python的目录,which python
r:read 读的权限
w:write 写的权限
x 执行权限
chmod +x 1.sh(文件名)
@,*都可以表示一个数组里的全部,区别在于,*加上双引号之后会被当作字符串处理,@加上双引号之后依然是数组
echo -e开启转译
\b,表示删除b前一个字符
echo $?之前的语句执行是否正确,0表示true,非0表示false
bash不支持有浮点数的除法运算
如果要计算,awk 'BEGIN{print 2/3}'
s="hello from testerhome"
echo ${s:6:3},表示从第6个单位开始,向后打印3个单位
echo ${#s}表示计算长度
掐头#
echo ${s#hello}表示去掉hello
echo ${s#*m}表示去掉匹配到第一个m
echo ${s##*m}表示贪婪匹配,一直匹配到所有m,去掉
去尾%
echo ${s%home}表示去尾home
echo ${s%h*}*表示通配符
echo ${s%%o*}表示去尾的贪婪匹配,从后往前,一直去掉最后一个o
字符串替换
echo ${s/testerhome/seveniruby}将testerhome替换为seveniruby
echo ${s//h/xxx}表示将所有的h替换为xxx,贪婪匹配
算数判断
[ 2 -eq 2 ]相等
[ 2 -ne 2 ]不等
[ 3 -gt 1 ]大于
[ 3 -ge 3 ]大于等于
[ 3 -lt 4 ]小于
[ 3 -le 3 ]小于等于
(())也可以表示算数比较。((10>=8)),((10==10))
字符串比较
[ string1 = string2 ]如果两字符相等,则结果为真
[ string1 != sring2 ]如果两字符不相同,则结果为真
[ -n string ] 如果字符串非空,则结果为真
[ -z string ] 如果字符串为空,则结果为真
逻辑与的两种表示
[ 2 -ge 1 -a 3 -ge 4 ] 2>=1 与 3>=4
[[ 2 -ge 1 && 3 -ge 4 ]] 2>=1 与 3>=4
逻辑或的两种表示
[ 2 -ge 1 -o 3 -ge 4 ] 2>=1 或 3>=4
[[ 2 -ge 1 || 3 -ge 4 ]] 2>=1 或 3>=4
逻辑非
[ ! 2 -ge 1 ]
echo "1" && echo "2" || echo "3" && echo "4" || echo "5" || echo "6" && echo "7" && echo "8" || echo "9"
1
2
4
7
8
||要前面执行的为false才会执行,&&执行过后一直为true
ctrl+r可以搜索之前输入的命令,再一次按ctrl+r过滤你想要搜索的命令
.bash_history里面有输入过的命令
for条件循环
for(());do;done
for遍历循环读取文件名字的时候,如果文件名有空格的时候,会变成两个。
for x in *;do echo $x;done
read命令:接收一个标准命令
continue 结束本次循环
shell前后台切换:
1.echo $$打印当前进程号
2.()在括号里运行的是子shell
3.command& 让进程在后台运行
jobs 查看后台运行的进程
bg[]到后台,fg[]到前台,输入jobs命令查看到的job编号
2>$1
几个基本符号及其含义
/dev/null 表示空设备文件
0 表示stdin标准输入
1 表示stdout标准输出
2 表示stderr标准错误
输出重定向
>>输出重定向,两个箭头不会覆盖,一个箭头会覆盖
输入重定向
while read k;do echo $k;done < baidu.keywork
curl命令 利用URL规则在命令行下工作的文件传输工具,支持文件的上传和下载
-s不显示统计信息
grep命令
-o精准匹配 -i忽略大小写 -io 可以放到一起用
grep -E 选项可以用来扩展选项为正则表达式。 如果使用了grep 命令的选项-E,则应该使用 | 来分割多个pattern,以此实现OR操作
-A -B -C 后面都跟阿拉伯数字
-A是显示匹配后和它后面的n行。
-B是显示匹配行和它前面的n行。
-C是匹配行和它前后各n行。
例子(需要提前创建baidu.keyword文件):
1.while read k;do echo $k;curl http://www.baidu.com/s?wd=$k;done < baidu.keyword
2.while read k;do echo $k;curl http://www.baidu.com/s?wd=$k;done < baidu.keyword | grep -o "结果约[0-9,]*."
3.while read k;do echo $k;curl -s http://www.baidu.com/s?wd=$k | grep -o "结果约[0-9,]*" | grep -o "[0-9]*" | while read x;do printf $x;done;echo;done < baidu.keyword
正则表达式
. 一个字符
* 0个或者多个字符
awk
RS ⾏记录分隔符
FS 字段分隔符
echo $PATH | awk 'BEGIN{FS=":"}{print $1}'
NR 记录数
NF 字段数
echo $PATH | awk 'BEGIN{RS=":"}{print $0}'
echo $PATH | awk 'BEGIN{RS=":"}{print NR,$0}'
echo $PATH | awk 'BEGIN{RS=":"}END{print NR}'
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | awk -F/ '{print $1,$2,$3,$4}'
示例:
1.去掉第一行的显示
(vmstat显示Linux系统虚拟内存状态)
vmstat | awk 'NR>1'
通过正则表达式的方法,打印从01到04的数据
2.awk '/00:00:01/,/00:00:04/' /tmp/nginx.log
sed
-e :可以指定多个表达式
-n :只打印模式匹配的行
例子1 将abc变为_
echo 123abc456 | sed 's#abc#_#'
例子2 将数字2-9替换为x,#g表示全部替换,不加只替换第一个
echo 123abc456 | sed 's#[2-9]#x#g'
-n和p一起使用
sed -n '/00:00:01/,/00:00:04/p' /tmp/nginx.log
【shell实战】
1. 找出log中的404 500的报错
答案1:grep -E " 404 | 500 " /tmp/nginx.log
(404和500需要加,不加空格的话,会检索到其他请求包含404和500的请求)
(sort可以对数据进行排序)
awk '{print $9}' /tmp/nginx.log | sort | uniq -c |less
答案2:
只显示第9部分
awk '$9=="404"{print $9}' /tmp/nginx.log
打印整个内容
awk '$9=="404"' /tmp/nginx.log
支持正则表达式的用法
awk '$9~/500/' /tmp/nginx.log | less
2. 找出500错误数据行的前10条非500的数据
grep -B 10 "500 " /tmp/nginx.log
3. 找出访问量最高的ip
uniq 命令删除文件中的重复行 -c 在输出行前面加上每行在输入文件中出现的次数
sort 将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序
-n 依照数值的大小排序
-r 以相反的顺序来排序
head -10000 /tmp/nginx.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -5
4. 找出访问量最高的页面地址
精简版:
awk '{print $7}' /tmp/nginx.log | sed 's#[0-9]#_#g' | sort |uniq -c|sort -nr|head -10
标准版:
awk '{print $7}' /tmp/nginx.log |sed -e "s#[0-9]\{1,\}#*#g" -e 's#?.*##' -e 's#/[^/]*\.png.*##'| sort | uniq -c | sort -nr |head -10
netstat用于显示各种网络相关信息
-n 拒绝显示别名,能显示数字的全部转化成数字。(重要)
-t (tcp)仅显示tcp相关选项
-p 显示正在使用Socket的程序识别码和程序名称
wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出
-l 统计行数
vmstat 显示Linux系统虚拟内存状态(查看的是整个服务器的)
vmstat delay 刷新时间间隔。如果不指定,只显示一条结果
(vmstat 1)
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,常用于服务端性能分析
top-p只查看特定进程
ps命令查看进程列表
ps -ef 显示所有用户进程,完整输出
ps -aux 显示所有包含其他使用者的行程
ps -o %cpu $$ 查看当前进程的cpu信息,$$表示当前进程
time命令的用途,在于量测特定指令执行时所需消耗的时间及系统资源等资讯
【Linux测试】
5. 文件检索 在特定目录下找到包含特定debug的数据或者代码
6. 网络统计 统计当前机器的连接数 查看当前开放的端口和进程
netstat -tn | grep ":22" | wc -l
netstat -ntp | grep 22 | sort | uniq -c | wc -l
7. 性能统计 统计某个进程的cpu和mem的增长情况 打印三列数据 时间 cpu mem
先查找到进程的pid
ps -ef | grep -i 名称
(9081 pid)
for i in $(seq 1 20);do time=$(date +%H:%M:%S); info=$(ps -o %cpu -o %mem 9081 | tail -1 );echo $time $info ;sleep 1;done
8. 任务处理 使用简易的工具对第三方服务做加压并统计性能
while true; do count=$(jobs -l | grep Running|wc -l); [ $count -le 5 ] && { time curl https://testerhome.com/topics/17870 &>/dev/null & } || echo $count waiting ;done
【App测试】
9. apk文件分析 分析app的文件内容检索特定的api调用
10. 分析api的调用序列 app性能分析
adb shell
ps | grep com.tencent.mobileqq
11. 统计某个app的一段时间内的性能
12. 自动化测试 编写一个自动遍历工具