shell-三剑客
2022-05-07 14:55:03 0 举报
AI智能生成
linux
作者其他创作
大纲/内容
业务模型获取
重要性
方式
命令
日志平台
ELK
elasticsearch
logstash
kibana
kql
EFK
ELK + Filebeat
ELK + Filebeat + kafka
说明
历史业务模型可能有多个,所以需要从不同的维度(天、小时、分钟、秒)去获取业务高峰数据
三剑客
三剑客
grep、sed、awk
主要应用于查看日志、分析日志、命令监控、修改配置文件shell脚本等
命令参数的含义,可以参考帮助,比如:
man grep
grep --help
演示数据
数据1
/etc/passwd
数据2
test.sh
#!/bin/bashfor (( i=1;i<=10;i++ ))doecho test_$idone
sh test.sh > 1.txt
sed
编辑
sed 常用的参数有
n 把匹配到的内容输出打印到屏幕
p 以行为单位进行查询
a 表示新增
i 表示插入
c 表示替换
d 表示删除
s/要被取代的内容/新的字符串/g
-i 对源文件进行修改
/被搜索内容/p
grep
查找
参数
-E表示或
grep -E 'roo|ren' /etc/passwd
-i忽略大小写
grep -niE "exception|error" catalina.out.2020-10-25
tail -f catalina.out.2020-10-25 | grep -niE "exception|error"
tail -fn500 xxx.log |grep grep -niE "exception|error"
-v输出不匹配行
排除
ps -ef|grep java |grep -v "grep"
-w匹配指定字符串
grep -w 'roo' /etc/passwd
无结果
grep -w 'root' /etc/passwd
有结果
^匹配开头行首
grep '^roo' /etc/passwd
统计当前目录下文件个数:ls -l |grep "^-"|wc -l
-R
$匹配结尾行尾
以nologin结尾的行
cat /etc/passwd | grep nologin$
-n表示对提取的内容显示所在行号
grep -n 'ren' /etc/passwd
awk
文本与数据处理
输出
printf 格式化输出,不会自动换行
printf格式化列出用户名、用户标识号
与\n合用
awk -F ':' '{printf("User:%s UID:%s\n",$1,$3)}' /etc/passwd
print 打印出内容,会自动换行
awk -F ":" '{print $3}' /etc/passwd
cat /etc/passwd |grep test| awk -F ':' '{print $1,$3}'
等价于:awk -F ':' '{print $1,$3}' /etc/passwd |grep test
参数
-F 指定分隔符
awk的内置参数
$0:表示整个当前行$1:每行第一个字段$2:每行第二个字段$n:每行第n个字段
awk -F ':' '{print $0}' /etc/passwd
打印所有内容
awk '{print $1}' /usr/local/nginx/logs/access.log
打印日志第一列
NR:每行的行号
打印第六行第五列
df -h | awk 'NR==6 {print $5}'
NF:字段数量(列数),如果是$NF,就表示最后一列
awk -F ':' '{print NR,NF,$NF}' /etc/passwd
逻辑判断式
~,!~:匹配正则表达式
awk -F ':' '$1!~/^s.*/{print $1}' /etc/passwd
==,!=,:判断逻辑表达式
显示/etc/passwd中用户名ID大于1000的用户名和ID
awk -F ':' '$3>1000{print $1,$3}' /etc/passwd
nobody 65534ren 1001test2 1002
awk -F ':' '{if($3>1000) print $1,$3}' /etc/passwd
nobody 65534ren 1001test2 1002
其它
BEGIN
在读取所有行内容前就开始执行,常常被用于修改内置变量的值
awk -F : 'BEGIN{print "begin"}{print $1} END{print "end"}' /etc/passwd
以 begin 开头、end 结尾,打印第 1 列数据
FS
BEGIN时定义分割符
cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}' |head -n3
BEGIN {FS=":"}等价于 -F ":"
END
结束的时候执行
cat /etc/passwd | awk -F":" '{print $1}END{printf "执行完成"}'
搜索
cut
提取列
参数
-c
以字符为单位进行分割
截取/etc/passwd文件从第二个字符到第九个字符
cut -c 2-9 /etc/passwd
-f
指定截取区域
以':'为分隔符,截取出/etc/passwd的第二列到最后一列
cut -d ':' -f 2- /etc/passwd
-d
指定分割符
默认为制表符,不是空格
awk默认是空格
所以,cut的缺点是,空格时候没法操作
uniq
uniq 用于检查或者统计文本出现的重复行
常用参数
-c,它用于连续重复行次数的统计
示例
数据
12111332
uniq -c 1.txt |sort -r
3 1 2 3 1 2 1 2 1 1
sort
sort 的默认方式就是把第一列根据 ASCII 值排序输出
常用参数有
-n,依照数值的大小排序;-r,以相反的顺序来排序;-k,选择以某个区间进行排序。
sort -n 是按照第一列的数值大小进行排序
示例
sort -r 1.txt
将内容倒序输出
数据
12111332
结果
33221111
wc
统计指定文件中的行数、字节数、字数,并将统计结果显示输出
参数
-l 统计行数。
示例
统计/etc/passwd文件有多少行
wc -l /etc/passwd
指定目录下,所有txt文件中行数
find /root/test -type f -name "*.txt" -exec wc -l {} \;
find /root/test -type f -name "*.txt" |xargs -I {} wc -l {}
find /root/test -type f -name "*.txt" |xargs -i wc -l {}
其它
删除20天以前的文件
find ~/ -name "*" -ctime +20 -exec rm -f {} \;
业务比例统计
按天
业务量最多的天,按小时
业务最多的天里,业务量最多的小时,统计业务比例
如果更细的维度有峰值,那么需要进一步细化,比如分、秒
补充
其它业务量非最大天,但是其它维度是峰值的,也要考虑
shell
shell简介
shell应用场景
解释器
解释器是一种命令解释器,主要作用是对命令进行运行和解释,将需要执行的操作传递给操作系统内核并执行
指定解释器
#!/usr/bin/python3
#!/bin/bash
不指定,默认就是这个
#!/bin/bash#这是第一个shell脚本#by renecho ‘hello, shell'
脚本执行
sh test.sh
chmod +x test.sh
./test.sh
变量
shell的变量不需要先声明,可以直接使用
调用变量
a=15,但是注意:等号两侧没有空格
$a 或者 ${a}
echo $a
echo ${a}
echo $aa
改为:echo ${a}a
$?, 判断上一条命令是否成功,0表示成功,其它表示不成功
echo $?
$0,返回脚本的文件名称
$1-$9,返回对应的参数值
$*,返回所有的参数值
$#,返回参数的个数
示例
#!/bin/bash#by ren echo "脚本名称:$0"echo "第一个参数是:$1"echo "第二个参数是:$2"echo "一共有多少参数:$#"echo "这些参数是:$*"
常用符号
> ,会覆盖原有的内容
>> ,不会覆盖原有的内容
; ,分号,执行多条命令,cat 1.txt; ls
| ,管道符,ps –ef | grep xxx
&& ,前面的命令执行成功,后面的才可以执行
cat test.txt && ls
|| ,前面的命令执行失败,后面的才可以执行
“” ,双引号中的变量输出变量值
‘’ ,单引号中的变量输出本身
#!/bin/bashecho "第一个参数:$1"echo '第一个参数:$1'
sh test.sh 1
`` ,输出命令结果
a=`date`;echo $a
条件判断
文件目录
语法:[ 判断表达式 ]
注意,[]内部左右要有空格
-e 目标是否存在[ -e test.sh ] || touch test.sh
-d 是否为路径[ -d /root/test ] && echo "/root/test存在"
-f 是否为文件[ -f test.sh ] && echo "是文件"
权限
-r 是否有读取权限-w 是否有写入权限-x 是否有执行权限[ -x test.txt ] && echo '有执行权限'
比较
整数值:-eq 等于(equal)-ne 不等于(not equal)-gt 大于(greater than)-lt 小于(lesser than)-ge 大于或者等于(greater or equal)-le 小于或者等于(lesser or equal)
字符串:= 相等!= 不相等
输入输出
语法:read -参数-p:给出提示符
#!/bin/bashread -p "请输入密码:" passwordecho '你输入的密码是:'$password
if
用法
if [ 条件判断 ]; then 执行动作 fi
if [ 条件判断 ]; then 执行动作 else 执行动作 fi
示例
#!/bin/bashif [ $1 -eq $2 ]thenecho "$1 等于 $2"elseecho "$1 不等于 $2"fi
sh test.sh 1 2
case
case 变量 in值1 )执行动作1;;值2 )执行动作2;;....esac
示例
#!/bin/bashecho '请输入你要购买的商品编号:'read proidcase ${proid} in'1')echo '笔记本电脑';;'2')echo '华为手机';;* )echo '输入有误请重新输入';;esac
for
用法
for 变量名 in `命令` do 执行动作 done
#!/bin/bash#依次打印1-10for i in `seq 1 10`doecho $isleep 1done
`seq 1 10`
等价于
$(seq 1 10)
#!/bin/bash#curl for i in $(cat url.txt)docurl -I $iecho -e "\n"done
www.baidu.comwww.126.comwww.cnblogs.com
for (( 条件 )) do 执行动作 done
示例
#!/bin/bashsum=0for ((i=1;i<11;i++))dosum=$(($sum + $i))doneecho $sum
while
用法
while [ 条件判断式 ] do 执行动作 done
示例
#!/bin/bashsum=0n=1while [ $n -lt 11 ];dosum=$(( $sum + $n ))n=$(( $n + 1 ))doneecho $sum
示例
任务8
提交说明
邮箱地址
168632201@qq.com
主题格式
随机编号-第08次任务
比如:016-第08次任务
1、练习jmeter二次开发
1、编写java请求
自行实现一个功能
2、自定义一个函数
自行实现一个功能
2、业务模型提取练习
用公司的日志平台、或者用命令,对公司日志提取出业务模型
3、思考:
restful api,如何提取业务模型?
4、针对redis服务,写一个shell脚本
要求:
1、开机启动服务
2、定期检查服务是否存在
5、jmeter在linux非gui执行脚本前,要删除jtl文件、清空html报告目录内容,写shell脚本完成
子主题
6、继续练习linux基础命令,以及三剑客(sed、awk、grep)、cut、sort、uniq
7、第一阶段总结(自行完成:性能理论、java、jmeter等)
第一阶段是压力端的知识,下一阶段是服务端监控、分析
0 条评论
下一页