Linux与Bash

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处理流程

命令形式: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:把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行后续处理

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次)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值