Linux常用命令:https://blog.csdn.net/qq_23329167/article/details/83856430/
VIM中的保存和退出:https://www.jianshu.com/p/0009bf462f15
z:调用gzip压缩命令进行压缩
c:创建一个文件的参数指令(create的意思)
x:解开一个文件的参数指令
t:查看tarfile里面的文件
v:显示运行过程
f:指定文件名
查看压缩包里面的内容:tar -ztvf bbb.tar.gz
文件属性
drwxr-xr-x@ 6 lianganqi staff 192 1 31 11:35 vue3-experience
“d”:文件类型
“rwx”(第2位-第4位):拥有者
“r-x”(第5位-第7位):所属组
“r-x”(第8位-第10位):其他人
6:连接
lianganqi:所有者
staff:用户组
192:大小
1-31 11:35:修改日期
vue3-experience:文件或者目录
网络
ping:测试网络连接情况
-c:ping的次数
-l 每次ping的时间间隔
netstat:打印Linux网络系统的状态信息
-t:列出所有的tcp
-u:列出所有的udp
-l:只显示监听端口
-n:以数字形式显示地址和端口号
-p:显示进程的pid和名字
性能
top:持续监控系统性能
ps:查看进程信息
ps -aux:显示所有进程,包括用户,分组情况
管道与三剑客、正则
管道:Linux提供管道符 “|” 将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。
例:echo "hello1234" | grep 'hello'
正则:https://tool.oschina.net/regex
例:
1、找出所有的hi单词 \bhi\b (\b单词\b:匹配到的是一个单词,前后得有空格)
2、hi单词后面有lucy单词 \bhi\b.*\blucy\b
3、以0开头,然后是两位数字,然后是一个连字号“-”,最后是8个数字 0\d{2}-\d{8} (\d是数字)
*使用扩展正则时,需要加上“-E”:echo "aaafff" | grep -E "f{3}"
grep:根据用户指定模式(pattern)对目标文本进行过滤,显示被模式匹配到的行(查询)
命令形式:grep [options] PATTERN [file]
-v:显示不被pattern匹配到的行
-i:忽略字符大小写
-n:显示匹配的行号
-c:统计匹配的行数
-o:仅显示匹配到的字符串
-E:使用ERE,相当于egrep
例:
text.txt:
root
123
Test
root 12
Root 33
Root
root
sure
newYear
搜:grep -n root text.txt(搜“root”所在的行号)
得:
1:root
4:root 12
7:root
搜:grep -n ^s text.txt(搜以“s”开头的行号)
得:
8:sure
搜:grep -n r$ text.txt(搜以“r”结尾的行号)
得:
9:newYear
sed:sed是流编辑器,一次处理一行内容
命令形式:sed [-hn..][-e<script>][-f<script FILE>][FILE]
-h:显示帮助。
-n:仅显示script处理后的结果
-e<script>
:以选项中指定的script来处理输入的文本文件
-f<script 文件>
: 以选项中指定的script文件来处理输入的文本文件
常用动作:
a:新增 sed -e '4 a newline'
第四行后新增‘newline’
c:取代 sed -e '2,5c No 2-5 number'
2-5行替换成‘No 2-5 number’
d:删除 sed -e '2,5d'
删除2-5行
i:插入 sed -e '2i newline'
。 第二行前面插入‘newline’
p:打印 sed -n '/root/p'
s:取代 sed -e 's/old/new/g'
注意:-e 不对文件进行保存,-i对文件进行保存,慎用
mac对于-i命令使用用法不同,报错:extra characters at the end of d command
https://blog.csdn.net/lgh1117/article/details/50094595
注意:a、i动作在Mac中不好使用,报错:command a expects \ followed by text
https://blog.csdn.net/ghostyusheng/article/details/86484884
awk:把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行后续处理
查看使用手册:man awk
命令形式:awk ‘pattern + action’ [FILE]
-pattern:正则表达式
-action:对匹配到的内容执行的命令(默认为输出每行内容)
常用参数:
FILENAME awk浏览的文件名
BEGIN 处理文本之前要执行的操作
END 处理文本之后要执行的操作
FS 设置输入域分隔符,等价于命令行-F选项
NF 浏览记录的域的个数(列数)
NR 已读的记录数(行数)
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
$0 整条记录
$1 表示当前行的第一域…以此类推
实战:
// diary.txt 第14行
伊娃,呜哇,瓦利,礼物,物品,品尝,尝鲜,鲜活,活动,动物,物价,价格,格子,子孙,孙女,女儿,儿子,子弹,弹头
// 打印14行整行
awk 'NR==14{print $0}' diary.txt
// 以“,”为分隔符,打印14行的第三域
awk -F ,'NR==14{print $3}' diary.txt
// 搜索/etc/passwd 有root关键词的所有行,并显示对应的shell
awk '/root/{print$0}' /etc/passwd
// 打印diary.txt的第二行信息
awk 'NR==2{print $0}' diary.txt
// 使用begin加入标题
awk 'BEGIN {print "BEGIN","BEGIN"}{print $0}' diary.txt // 实际无被改变
// 自定义分隔符
echo "111 222|333 444|555 666" | awk 'BEGIN{RS="|"}{print $0}'
// 进行创建文件并保存
echo "111 222|333 444|555|666" | awk 'BEGIN{RS="|"}{print}' > aaa.txt
实战:
// 找出log中的404 500的报错有多少条
grep -E '\s500\s|\s400\s' nginx.log | wc -l
awk '$9~/404|500/' nginx.log | wc -l
// 找出报错信息出现前三名的ip
grep -Eo '^([0-9]*\.){3}[0-9]*' nginx.log | sort | uniq -c | sort -nr | head -3
(注:\的意思是找出“.”,而不是正则的“.”)
awk '{print $1}' nginx.log | sort | uniq -c | sort -nr | head -3
// 换掉换行符 \n
awk '{print $1}' nginx.log | sed ':1;N;s/\n/|/g;t1'
(注:1、N意思是让下一行追加到此行,因此就能找到换行符,否则sed本来就是以行判断的;
2、:1 t1,代表打标记1,t1跳转到标记处)
变量
规则:
·命名只能使用英文字母,数字和下划线,首个字母不能以数字开头
·中间不能有空格,可以使用下划线
·不能使用标点符号
·不能使用bash里的关键字(可用help 命令查看保留关键字)
实操:
// 定义与使用变量
your_name="abc"
echo $your_name
// 只读变量
a=123
readonly a
// 删除变量
unset variable_name // 不能删除只读变量
变量类型:
·字符串:your_name=“kity”
·拼接字符串:greeting=“hello,”$your_name"!"
·数组:array_name=(value0 value1 value2 value3)
·取数组:value=${array_name[n]} // n=* | n=@ 的时候就是打印全部
·单独赋值:array_name[1]=value4 // mac索引由1开始
if
if [ 2==2 ];then echo “true”;else echo “false”;fi
if [[ 2>1 ]];then echo “true”;else echo “false”;fi
a=10
b=20
if [ $a -eq $b ];then echo 'equal';elif [ $a -lt $b ];then echo 'small';elif [ $a -gt $b ];then echo 'big';fi
// 注意空格
for
for i in 1 2 3 4 5;do echo $i;done
for i in $(cat diary.txt);do echo 'a'$i;done // 用$(),不是用${}
while
int=1
while(($int<=5));do echo $int let "int++";done
// 循环读出文件内容并输出
while read line;do echo $line;done<diary.txt // 这个是一整行打印的
for i in $(cat diary.txt);do echo 'a'$i;done // 这个是有空格分开的话就另开一行
Bash脚本编写
read命令:
·read命令是用于从终端或者文件中读取输入的内部命令
·读取整行输入
·每行末尾的换行符不被读入
命令使用:
·从标准输入读取输入并赋值给变量 read var
·从标准输入读取多个内容 read var1 var2 var3
·不指定变量(默认赋值给REPLY) read
脚本参数传递
$0 脚本名称
$1 ~ $n 获取参数
$# 传递到脚本的参数个数
$$ 脚本运行的当前进程ID号
$* 以一个单字符串显示所有向脚本传递的参数
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
算术运算
// 运算1:
a=10 b=20
加法:`expr $a + $b` 结果为30
减法:`expr $a - $b` 结果为-10
乘法:`expr $a \* $b` 结果为200
除法:`expr $b / $a` 结果为2
// 运算2:
a=10 b=20
取余:`expr $a % $b` 结果为10
赋值:a=$b 将把变量b的值赋值给a
相等:[ $a == $b ] // false
不相等:[ $a != $b ] // true
// 运算3:
-eq:检测相等[$a -eq $b] 返回false
-ne:检测不想等[$a -ne $b] 返回true
-gt:检测左边是否大于右边[$a -gt $b] 返回false
-lt:检测左边是否小于右边[$a -lt $b] 返回true
-ge:检测左边是否大于等于右边[$a -ge $b] 返回false
-le:检测左边是否小于等于右边[$a -lt $b] 返回true
Bash 与 Linux命令结合
创建目录并生成文件:
echo "hello" > aa.txt
bash与内存:
统计内存使用
for i in `ps aux | awk '${print $6}' | prep -v 'RSS'`
count=$[$count+$i]
echo "$count/kb"
curl is a tool to transfer data from or to a server
support protocols
DICT,FILE,FTP,FTPS,GOPHER,HTTPS,IMAP
without user interaction
proxy support
curl -x 127.0.0.1:8888 https://www.baidu.com/
(-x:指定端口地址请求)
get
-G:使用get请求
curl https://www.baidu.com
curl -G https://www.baidu.com
curl -X GET https://www.baidu.com
post
-d:指定post请求体
curl -d ‘login=1234’ https://www.baidu.com
curl -X POST https://www.baidu.com
other
// 保存响应内容到 tmp.html
curl -o tmp.html https://www.baidu.com
// 输出通信的整个过程
curl -v https://www.baidu.com
// 不输出错误和进度信息
curl -s https://www.baidu.com
jq(JSON processor)
A jq program is a filter
it takes an input,an produces an output
https://stedolan.github.io/jq/
using
格式优化
echo ‘{“a":11,"b":12}’ | jq '.'
it takes an input,and produces an output
常用方法:
内容提取:
echo '{"foo":42,"bar":"less interesting data"}' | jq .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}]' | jq. [0,1]
数据重组成对象
echo '{"a":1,"b":2',"c":3,"d":4]' | jq '{"tmp":b}'
cgi
简介:Common Gateway Interface 公共网关接口
工具:
CentOS 7:
epel-release
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com /repo/epel-7.repo
yum install -y nginx fcgiwrap
Ubunutu 18:
apt install -y nginx fcgiwrap
fcgiwrap配置
nohup fcgiwrap -f -c 4 -s unix:/run/fcgiwrap.socket &
nohup fcgiwrap -f -c 4 -s tcp:0.0.0.0:9000&
帮助:fcgiwrap -h;fcgiwrap
nginx配置
/etc/nginx/conf.d/test_cgi.conf
新建目录:mkdir -p/data/nginx/test_cgi/cgi/
chown nginx:nginx/run/fcgiwrap.socket
参考:fastcgi param
三剑客实战Nginx性能统计分析
技术概念:
进程:平均负载
内存:覆盖技术,交换技术
缓冲:buffer,cache
I/O:IO wait
CPU:中断
性能分析工具安装
CentOS/Red Hat
yum -y install sysstat
Other
http://sebastien.godard.pagesperso-orange.fr/download.html
uptime!
17:03:39 up 117 days,19:19,16 users, load average:0.52,1.26,0.97
(注:开机了117天,19个小时,16个正在登录的用户,load average:平均负载,第一个数字指1分钟的平均负载,第二个为5分钟,第三个为15分钟)
runnable (可运行状态、准备的进程,即正在运行的进程和等待运行的进程)
uninterruptable(不可间断的进程,等待I/O设备的进程)
1,5,15
统计有多少用户
cat /etc/group | wc -l
深入理解负载
cpu == 1
load average == 1,cpu时刻在用
cpu == 4
load average == 1,cpu只使用25%
平均负载
平均负载不大于3,则系统运行表现良好
如果多核cpu,需要累加
4核cpu < 12
dmesg | tail (操作系统日志)
tail:默认选出最新的10个
// 打印20条系统日志
dmesg | tail -20
r:runnable (可运行状态、准备的进程,即正在运行的进程和等待运行的进程)
b:uninterruptable(不可间断的进程,等待I/O设备的进程)
swpd:交换区
free:可用,空闲的内存
buff cache:缓冲(防止内存太多);buffer:缓冲垫,数据传输;cache:保险柜,临时储存
si:从磁盘出来的内容
so:从交换区进磁盘的内容
io:对磁盘的操作
bi:读
bo:写
in:中断(软中断:软件引起的中断(除零异象);硬中断:硬件引起的中断(I/O))
cs:上下文切换
us:用户命令占用cpu的百分比(非内核进程)
sy:系统命令占用cpu的百分比(内核进程)
id:空闲(idle)占有cpu的百分比
wa:等待I/O的百分比
st:偷
交换区:
覆盖:
思路捋直:
运行上面的shell,‘&’是后台进程;
vmstat 只能在服务器上执行命令;
运行vmstat后,就能看见正在跑的服务
清除进程
ps -aux | grep tesh.sh | awk '{cmd="kill -9"$2;system(cmd)}' //$2是进程
ps -aux | grep 61993657 | grep "\-bash$" | grep -v pts | awk '{cmd="kill -9"$2;system(cmd)}'
tps:每秒进程下发的IO读、写请求数量
kB_read/s:每秒从驱动器读入的数据量
kB_wrtn/s:每秒从驱动器写入的数据量
kB_read:读入数据总量
kB_wrtn:写入数据总量
#!/bin/bash
seeds=`while read line;do echo $line;done < diary.txt`
seeds=`while read line;do echo ${line// //};done < diary.txt`
echo $seeds (打印成一整行,“// //”是为了区分)
echo "$seeds" (一行一行的打印)
Linux三剑客实战抽奖
#!/bin/bash
# 筛选出一个人
rand(){
# 从文件中读取所有人的信息,用-代替空格
local seeds=`while read line;do echo ${line// /-};done < diary.txt`
local count=0
# 不停进行筛选,直到只剩一个
while [[ $count != 1 ]];do
seeds=`for seed in $seeds;do (($RANDOM%2)) && echo $seed;done`
counts=`echo "$seeds" | wc -l`
# 针对mac,`echo "$seeds" | wc -l`得出来的并非数字,`eval echo $counts`将数字前面的空格去掉
count=`eval echo $counts`
done
# 排除空行
seed=`eval echo $seeds`
if [[ $seed == "" ]];then
rand
else
echo $seeds
fi
}
is_repeat(){
for arr in ${arrs[@]};do
if [[ $arr == $1 ]];then
echo 0
return 0
fi
done
echo 1
}
res(){
# 筛选10条
# for i in {1..10};do
for ((i=0;i<$1;i++));do
rol=`rand`
while [[ `is_repeat $rol` == 0 ]];do
rol=`rand`
done
arrs[$i]=$rol
done
echo ${arrs[@]}
}
# 把脚本外的值传递给res函数
res $1
然后执行命令:bash init.sh 10(抽10次)