Menu:Linux三剑客与管道使用 41page
#! /bin/bash
echo "hello"
运行脚本俩种方式
1. chmod +x test.sh #加权限
./test.sh
2. /bin/sh test.sh
正则表达式
\bhi\b 完全匹配文本hi,只有文本内容为hi的单词才会被匹配,也就是说文本内容中间有空格才可以匹配 \b匹配单词的开始或结束
练习:
匹配以字母a开头的单词 \ba\w*\b #这里只能用\w* 不能使用.* 因为.*包含了空格和其他的特殊字符,会影响题目
匹配刚好六个字符的单词 \b\w{6}\b #单词必须用\b\b包起来
匹配1个或更多连续数字 \d+ #+重复一次或多次
5位到12位qq号 ^\d{5,12}$ #^匹配字符串的开始 $匹配字符串的结束 防止出现开始或结束为字符的数据
Liunx终端操作:
一、grep #基于正则表达式查找满足条件的行 查找
二、sed #数据修改
Z向下翻页 K向上翻页 查找使用/需要查找内容,然后按Enter键确认
#一般使用man命令查看文件或者查看文件的时候,需要查找、翻页使用上面的快捷键
sed 流处理,对文件进行了修改,原文件不会改变
sed '2a newline' test.txt #第二行后添加新的一行,内容为newline
sed '2i newline' test.txt #第二行前添加新的一行,内容为newline
sed -e 's/root/hello/g' test.txt #-e不会修改原文件 g参数修改全局的内容 s参数为取代
sed -i 's/root/hello/g' test.txt #-i会修改原文件,一定要谨慎操作 将文件test.txt里面所有为root的内容修改为hello
#将root字符修改为hello
三、awk #根据定位到的数据行处理其中的分段 数据切片 默认以空格进行分割切片
$0 展示当前未切片前的所有内容 $1、$2… 就是$0下面的切片 数据默认是以/n分隔符分隔的
Menu:linux常用命令 15page
1.删除文件夹 rmdir temp #删除文件夹名称为temp的文件夹
2.权限
r 读权限 4
w 写权限 2
x 可执行 1
chmod 777 test #修改文件为可读可写可执行,第一个7代表所有者,第二个7代表所属组,第三个7代表所有人
3.ls -l #查看文件属性
ls -ld test.txt #查看指定文件test.txt的文件属性
#网络
4.ping #测试网络连接情况
-c #ping的次数
ping -c 5 baidu.com #ping baidu.com五次后结束
-l #每次ping的时间间隔
5.netstat #打印Linux网络系统的状态信息
-t #列出所有tcp
-u #列出所有udp
-l #只显示监听端口
-n #以数字形式显示地址和端口号
-p #显示进程的pid和名字
#性能
6.top #持续监测系统性能 实时变化
7.ps #查看进程信息 快照
aux #显示所有进程,包括用户,分组情况 是用BSD的格式来显示
-ef # 是用标准的格式显示进程的
Menu:Bash编程语法 23page
1.变量命名规则
2.变量定义与使用变量
a=10; echo $a #定义变量a,使用echo打印变量
#变量名=变量值 , 注意=左右不能有空格,使用$变量名调用变量
3.只读变量
a = "123" ; readonly a #定义a为只读变量
4.删除变量
unset a #删除变量a 如果变量是只读变量,则不可以进行删除
5.变量的作用范围:当前窗口,如果关闭窗口,变量的作用范围就消失了
6.条件分支:if
if [ 2 == 2 ]; then echo "true"; else echo "flase"; fi #if...then 条件语句 fi为结束 特别需要注意条件 if [ 2 == 2] 中间的空格
if [[ 2 > 1 ]]; then echo "true"; else echo "flase"; fi #如果条件不是等于,而是大于或小于,则需要使用俩个中括号
如果上述的情况只想用一个中括号,可以使用下面进行代替
-eq 表示相等
-lt 表示小于
-gt 表示大于
a=10; b=10; if [ $a -eq $b ];then echo "equal"; elif [ $a -lt $b ];then echo "small";elif [ $a -gt $b ];then echo "big"; fi #[ $a -lt $b ] 表达式和中括号一定要有空格,不然会报错
7.循环:for
for i in $(cat test.txt);do echo $i;done #循环读取文件内容并输出,done表示结束 ,注意读取文件结束使用为done,非fi
8.while定义
while read i;do echo $i;done<test.txt #一行一行读,done<test.txt从test.txt去读
Menu:Bash脚本编写 13page
1.`expr $a + $b` #语法有严格要求,注意空格 `这个不是单引号,而是数字键盘左边的键
a=10; b=20
echo `expr $a + $b`
echo `expr $a - $b`
echo `expr $a \* $b` #乘法要进行转义
echo `expr $a / $b`
echo `expr $a % $b`
2.read命令 #参数值的传入 #此处无法运行,todo
read a ; 123
echo $a #此时a的值为123
3.ps aux | awk '{print $3}' #取出快照第三列的内容
取出结果为:
PGID
1461
2120
1460
ps aux | awk '{print $3}' | grep -v PGID #-v表示取反,就是不取PGID
取出结果为:
1461
2120
1460
Menu:Linux进阶命令 11page
==========================================
apt-get: command not found,这个的出现是因为系统的原因。
Linux系统分为两种:
1.RedHat系列:Redhat、Centos、Fedora等
2.Debian系列:Debian、Ubuntu等
RedHat系列的包管理工具是yum
Debian系列的包管理工具是apt-get
==========================================
1.curl命令 #支持HTTP/HTTPS/FTP/FTPS协议 安装,可以通过官网。linux 安装可以通过apt-get install jq 命令进行安装
-x #指定代理端口,配合代理工具实现代理
curl -x 127.0.0.1:8888 https://www.baidu.com
-G #使用get请求 ,不指定参数时,默认访问的也是get请求
-X GET #也可以指定是get请求
-d #指定post请求体,指定请求为post请求
curl -d 'login=1234' https://www.baidu.com
-X POST #也可以指定是post请求
curl -X POST https://www.baidu.com
-o #保存响应内容
curl -o tmp.html https://www.baidu.com #将响应内容保存到tmp.html文件中
-v #输出通信的整个过程
-s #不输出错误和进度信息 静默模式
Charles工具,指定代理端口,抓取设置的端口请求来进行分析,使用curl命令的请求时也要指定代理端口喔
2.jq #提取json的工具,官方网站stedolan.github.io/jq/
echo '{"a":11,"b":12}' | jq '.' #格式进行美化,缩进,高亮
jq内容提取
echo '{"foo":11,"bar":"good job"}' | jq.foo #提取json里面foo字段
从数组提取提取单个数据
echo '{"a":1,"b":2},{"c":3,"d":4}' | jq.[0] #提取第一组数据
从数组提取提取所有数据
echo '{"a":1,"b":2},{"c":3,"d":4}' | jq.[]
过滤多个值
echo '{"a":1,"b":2},{"c":3,"d":4},{"e":5,"f":6}' | jq.[0,1] #只提取第一组和第二组的值
数据重组为数组
echo '{"a":1,"b":2},{"c":3,"d":4}' | jq '[.a,.b]' #输出结果为数组 重组区别于提取,提取时都是jq .
数据重组为对象
echo '{"a":1,"b":2},{"c":3,"d":4}' | jq '{"tmp":.b}' #输出结果就为字典啦
Menu:三剑客实战Nginx日志分析 bash教程
1.连接shell ,windows使用gitbash或者xshell 连接账号:21139910@shell.testing-studio.com 密码:hogwarts
ssh 21139910@shell.testing-studio.com #进行连接,输入密码进行连接
w #命令可以查看在线用户
w | wc -l #查看在线用户数
推荐配置为2核4G服务器 阿里云、腾讯云、华为云 海外:DigitalOccean、Linode
Linux:国内建议使用CentOS ,国外使用Ubuntu
2. >file #将输出重定向到另一个文件
>> #表示追加
<file #输入重定向
3.https://ceshiren.com/t/topic/3321 正则相关得记住,扩展正则表达式也得记住, -E 开启扩展正则表达式
echo 123 | grep -E "1|3" #grep通过-E参数开启扩展正则表达式
echo 123 | sed -E -e "s#1|3#x#g" #sed 通过-E -e 参数开启扩展正则表达式
echo 123 | awk '/4 | 3/' #awk直接开启扩展正则表达式
使用shell命令建议工具使用vscode ,然后选择vscode插件shell-format,可以对shell语句进行格式化,文件内右键选择format docunment
4.less 查看文件内容,大文件也可以打开,使用的是流式加载 键入q就可以退出交互浏览模式
演练文件
cp /tmp/nginx.log ~/nginx.log
使用less命令替代more与vim来分析文件内容,键入q表示退出交互浏览模式。
文件内容格式
223.104.7.59 - - [05/Dec/2018:00:00:01 +0000] "GET /topics/17112 HTTP/2.0"
200 9874 "https://www.googleapis.com/auth/chrome-content-suggestions" "Mo
zilla/5.0 (iPhone; CPU iPhone OS 12_1 like Mac OS X) AppleWebKit/605.1.15
(KHTML, like Gecko) CriOS/70.0.3538.75 Mobile/15E148 Safari/605.1" 0.040 0.040 .
123.125.71.60 - - [05/Dec/2018:00:00:02 +0000] "GET /yuanyibo/topics?locale=en HTTP/1.1" 200 12164 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" 0.032 0.032 .
IP 空 空 时间戳 用户请求(请求方法 地址 http协议版本) 状态码 字节数 Refer UserAgent 访问速度 访问速度 空
5.常用分析命令
less
sort #排序
sort -nr #表示通过数字大小进行判断,如果不加n参数,则以ascii码进行比较
#sort -n 相当于sql没有加desc sort -nr 相当于sql加desc r表示反向
uniq #合并,展示合并的数量
uniq -c #在每列旁边显示改行重复出现的次数
6.grep -E 可以传递多个内容 ,使用 | 来分割多个pattern,以此实现OR操作
7.grep -e 和 grep -E的区别
7.1grep -e 只能传递一个检索内容
grep -e pattern1 -e pattern2 filename
例如:
$ grep -e Tech -e Sales employee.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Raj Sysadmin Technology $7,000
500 Randy Manager Sales $6,000
7.2grep -E 可以传递多个内容 ,使用 | 来分割多个pattern,以此实现OR操作
grep -E 'pattern1|pattern2' filenam
例如:
$ grep -E 'Tech|Sales' employee.txt
100 Thomas Manager Sales $5,000
200 Jason Developer Technology $5,500
300 Raj Sysadmin Technology $7,000
500 Randy Manager Sales $6,000
课件作业
课件作业一:
编写一个函数 find_error_log()
找出log中的404 500的报错 考察严谨性,某次训练没有一人做对
find_error_log() {
#方法一
less nginx.log | grep -E '(" 404 |" 500 )' #这样写更加严谨,建议使用第二种方法
#方法二
less nginx.log | awk '$9~/404|500/{print $0}' #也可以这样写 less nginx.log | awk '$9~/404|500/' 默认会打印$0
awk '$9~/xxxx/' #字段匹配
awk '/xxx/' #正则匹配
}
课件作业二:
find_top_3
找出访问量最高的ip, 统计分析,取出top3的ip和数量,打印出来。把函数和执行结果贴到回复里。记得使用代码格式化
find_top_3(){
less nginx.log | awk '{print $1}' | sort |uniq -c | sort -nr | head -3 | less #sort -nr 表示通过数字大小进行判断,如果不加n参数,则以ascii码进行比较
}
课件作业三:
url_avg_time
找出首页访问 / 的平均响应时间,把函数与结果打印出来贴到回复里
首页访问示例,get后面的地址是/,每次访问的响应时间是倒数第二个字段
url_avg_time(){
less nginx.log | awk '$7 == "/"' | awk '{ sum += $(NF-1)} END {print sum/NR}'
}
课后作业:
找出访问量最高的页面地址 借助于sed的统计分析
/topics/16689/replies/124751/edit 把数字替换为 /topics/int/replies/int/edit
/_img/uploads/photo/2018/c54755ee-6bfd-489a-8a39-81a1d7551cbd.png!large 变成 /_img
/uploads/photo/2018/id.png!large
/topics/9497 改成 /topics/int
其他规则参考如上
输出
url pattern对应的请求数量
取出top 10请求量的url pattern
类似
288 url1
3000 url2
url_pattern(){
}
Menu:三剑客实战Linux性能统计分析(1)
1.ps -ef | head -3 # head -3 查看3行 查看进程列表,不关注性能
2.ps aux # 关注性能
3.ps -o user #只打印自己关注的user数据
4.封装自己的ps命令
ps_ex ()
{
ps -o uname,pid,ppid,thcount,ni,pri,psr,pcpu,pmem,rss,vsz,sz,start_time,time,comm,c,command,args "$@"
}
作业1 统计aliyundun的性能 #阿里云盾的pid每次都是变化的
perf_get(){
/#todo: 输出20s内某个进程的每秒的cpu和mem,并最后空出一行统计平均性能
}
perf_get pid_or_name
cpu mem
3 4
2 6
2 2
3 4
…
10 2
avg
5.5 3.5
#shell自带的type命令输出
perf_get ()
{
top -b -d 1 -n 20 | grep --color=auto --line-buffered -i yundun$ | awk 'BEGIN{print "cpu","mem"}{cpu+=$9;mem+=$10;print $9,$10}END{print "";print cpu/NR,mem/NR}'
}
#也可以通过bash来格式化 ,bash直接输入以上内容后,然后使用type perf_get 查看文件名称perf_get的格式化数据
# -b top 批处理
-d 1 top 1s打印一次
-n 20 top 打印20组数据
-i yundun$ grep 找出yundun结尾的数据
--line-buffered grep 一行一行输出
{print "cpu","mem"}{cpu+=$9;mem+=$10;print $9,$10} awk 找出$9、$10切片,并计算总和
{print "";print cpu/NR,mem/NR} awk 打印空行,然后打印平均值 NR表示行数
#vs code+shell format
perf_get() {
top -b -d 1 -n 20 |
grep --color=auto --line-buffered -i yundun$ | #管道结尾不需要加换行符
awk '
BEGIN{print "cpu","mem"} #刚开始打印一行,名称为cpu 和 mem ,作为第一行展示
{cpu+=$9;mem+=$10;print $9,$10} #cpu初始化时有默认初始化值,默认为0
END{print "";print cpu/NR,mem/NR}
'
}
5.网络
Linux:
netstat -tlnp # -t表示tcp协议 -l表示监听,服务器对外开放的端口 -n表示不解析DNS名字,只打印ip地址 -p表示进程
netstat -tnp #
Menu:三剑客实战Linux性能统计分析(2) bash教程
yum install -y netcat #安装nc,发现没有进行安装
yum search netcat #查找nc,发现nc在nmap-ncat目录下
yum install -y nmap-ncat #安装nc
nc -l -p 7777 -vv #nc 模拟开端口7777 -l监听端口 -p指定端口
nc shell.ceshiren.com 7777 -vv #用户连接端口7777
###上述监听端口7777和连接用户端口7777可以进行传输会话
作业2 统计连接网络链接情况
connection_summary(){
#todo: 链接所有的端口和对应的tcp连接状态,找出他们的连接总数吧
netstat -tnp | awk 'NR>2' | awk '{print $4 , $6}' | sort -nr | uniq -c #awk 'NR>2' 表示删除前面俩行数据的展示,从第三行开始
}
connection_summary
22 ESTABLISHED 100
22 CLOSED 3
7777 ESTABLISHED 20
#bash编程
seq 1 10 #生成1到10的数字
seq 1 10 3 #表示生成一个1到10,步进为3
echo $((1+2)) #表示对变量进行计算
for i in "${array[@]}"; do echo $i ;done #遍历数组,只有这一种正确的写法"${array[@]}",bash里面的数组和python有区别,bash数组下标不是按照顺序进行排序的,下标可能是0,1,2,10,11...
###抽奖脚本编写未完成,未听课程
Linux系统安装Python3环境(超详细)Linux软链接
https://www.pianshen.com/article/7542114600/
三种方式实现Linux的文件上传下载
https://blog.csdn.net/weixin_37490221/article/details/80844825
linux上安装和启动docker
https://blog.csdn.net/u010689849/article/details/88560045