Linux云计算架构-shell入门到精通(放弃)[4]

Linux云计算架构-shell入门到精通(放弃)[4]

1. grep过滤行

作用:按关键字提取需要的行

# 创建两个测试文本
# a.txt
a	1	abong
b	2	aabong
c	3	aaabong
# b.txt
a:1:abong
b:2:aabong
c:3:aaabong
# 查看文本内容
[root@master ~]# cat a.txt 
a	1	abong
b	2	aabong
c	3	aaabong
[root@master ~]# cat b.txt 
a:1:abong
b:2:aabong
c:3:aaabong
# 查看第二行的内容
[root@master ~]# cat a.txt | grep 2
b	2	aabong
# 查看除了第二行的内容
[root@master ~]# cat a.txt | grep -v 2
a	1	abong
c	3	aaabong

2. cut提取列

作用:按指定条件提取需要的列

参数 作用
-f 指定提取第几列
-d 指定分隔符,默认的分隔符是tab键
-c 按字符顺序提取第几个字符
# 查看第二行的第三列的信息
[root@master ~]# cat a.txt | grep 2 | cut -f 3
aabong

# 查看除了第二行外的第三列的信息
aabong
[root@master ~]# cat a.txt | grep -v 2 | cut -f 3
abong
aaabong

# 查看除了第二行外的第一、三列的信息
[root@master ~]# cat a.txt | grep -v 2 | cut -f 1,3
a	abong
c	aaabong

# 查看除了第二行外全部列的信息
[root@master ~]# cat a.txt | grep -v 2 | cut -f 1-
a	1	abong
c	3	aaabong

# 查看除了第二行外的第一到列的信息
[root@master ~]# cat a.txt | grep -v 2 | cut -f 1-3
a	1	abong
c	3	aaabong

# 提取按:分隔的文本的第3列信息
]# cat b.txt | grep 2 | cut -d ":" -f 3
aabong

# 按字符提取第5个字符所在列
# tab键算一个字符
[root@master ~]# cat a.txt
a	1	abong
b	2	aabong
c	3	aaabong
[root@master ~]# cat b.txt | grep 2 | cut -c 6
a

# 按字符提取第m-n个字符所在列
[root@master ~]# cat b.txt | grep 2 | cut -c 5-8
aabo

# -f是按第几列提取,而-c是按第几个字符提取,故-f与-c不能一起用。
# -d指定的分隔符不能是空格,若指定空格,会精确到空格的个数。
[root@master ~]# df -h | grep /dev/mapper
/dev/mapper/rhel-root   18G  4.2G   14G  24% /
[root@master ~]# df -h | grep /dev/mapper | cut -d " " -f 5
# 提取第5列,但是分隔符是一些空格,则无法提取。
[root@master ~]# df -h | grep /dev/mapper | cut -f 5
/dev/mapper/rhel-root   18G  4.2G   14G  24% /

综上,grep、cut能与管道符|连用,可以提取格式化文本的某行、某列、某个区域、某个单元格。但分隔符如果是空格,且空格数量不是规则的,则无法提取。作用是提取出指定文本后,可以作为脚本中循环的输入

3. awk条件动作格式化输出

在介绍awk命令前,先来介绍个小朋友printf

printf可以理解为格式化输出。但printf不是系统命令,不可接收文件的输入,也不可使用管道符|,但是可以接收命令结果的输入。

格式:printf '输出类型输出格式' 输出内容

输出类型 作用
%ns 格式化字符串,n表示长度
%ni 格式化整数,n表示长度
%m.nf 格式化浮点型,m位有效数字,保留n位小数
%c 显示字符的ASCII码
%d或者%i 格式化十进制
%e或%E 格式化科学计数法
%u 格式化无符号整数
%% 显示%
输出格式 作用
\n 换行
\r 回车
\t 水平输出制表符,即tab键
\v 垂直输出制表符,即tab键
\f 清楚屏幕
\a 输出警告声音
\b 输出空格键
# 按格式定制格式化输出
[root@master ~]# printf '%s \n' a b c
a 
b 
c 
[root@master ~]# cat a.txt 
a	1	abong
b	2	aabong
c	3	aaabong
# 单引号里面的格式是每一行的输出结果的格式
[root@master ~]# printf '%s %s %s\n' $(cat a.txt)
a 1 abong
b 2 aabong
c 3 aaabong

# 格式化输入左右对齐
# 默认右对齐,如%20s;左对齐为%-20s
右对齐:awk -F":" '{printf "%20s\n",$1}' /etc/passwd
左对齐:awk -F":" '{printf "%-20s\n",$1}' /etc/passwd

# print相对于printf,多了一个换行符/n。即print自带换行符,而printf需手工加换行符。
# printf可单独使用,但是print只能在awk命令中使用。

上面说了printf命令是格式化输出,那awk命令就是条件动作格式化输出。

在linux中,常用的命令是gawk,而awkgawk的链接文件。

[root@master ~]# which awk
/usr/bin/awk
[root@master ~]# ll /usr/bin/awk
lrwxrwxrwx. 1 root root 4 7月  19 05:01 /usr/bin/awk -> gawk

格式:awk '条件1{动作1} 条件2{动作2} 条件{3动作3}' 文件名

条件支持
①正则表达式:/str/ 包含str的行
②关系表达式:> < && || + *
③匹配表达式:匹配~ 不匹配!~

# 若无条件,则动作的对象是全部内容。
# 不可见字符要用单引号或者双引号括起来,单引号awk命令已用,此时使用双引号括起不可见字符。
# 在awk命令中使用printf命令作为动作,不可使用%s等数据类型进行格式化。
# $3表示第3列
[root@master ~]# awk '{printf $1 "\t" $3 "\n"}' a.txt
a	abong
b	aabong
c	aaabong
# $0表示所有的列
[root@master ~]# awk '{printf $0 "\n"}' a.txt
a	1	abong
b	2	aabong
c	3	aaabong
[root@master ~]# cat a.txt 
a	1	abong
b	2	aabong
c	3	aaabong
[root@master ~]# awk '$2<=1{printf $1 "\t" $3 "\n"}' a.txt
a	abong
[root@master ~]# awk '$2>1{printf $1 "\t" $3 "\n"}' a.txt
b	aabong
c	aaabong

awk命令执行过程:取一行数据,检测条件,执行动作,输出结果。再取下一行数据,检测条件,执行动作,输出结果。

# 在这里使用awk命令提取磁盘空间的使用量
[root@master ~]# df -h
文件系统               容量  已用  可用 已用% 挂载点
/dev/mapper/rhel-root   18G  3.3G   15G   19% /
devtmpfs               905M     0  905M    0% /dev
tmpfs                  914M  140K  914M    1% /dev/shm
tmpfs                  914M  8.8M  905M    1% /run
tmpfs                  914M     0  914M    0% /sys/fs/cgroup
/dev/sda1              497M  119M  379M   24% /boot
/dev/sr0               3.5G  3.5G     0  100% /run/media/root/RHEL-7.0 Server.x86_64
[root@master ~]# df -h | grep rhel-root
/dev/mapper/rhel-root   18G  3.3G   15G   19% /
[root@master ~]# df -h | grep rhel-root | awk '{printf $5}'
19%[root@master ~]# df -h | grep rhel-root | awk '{printf $5}' | cut -d '%' -f 1
19

awk命令相对于cut命令较为复杂,但是可以解决分隔符是空格且空格数量不规则的文本的提取问题。对规则的文本,cut命令要更简单。

在这里,介绍两个awk中常用的条件。

BEGIN{动作}:在对文本进行提取前先执行该动作

END{动作}:在对文本提取结束后再执行该动作

# BEGIN条件:在对文本进行提取前先执行该动作
[root@master ~]# df -h | grep rhel-root | awk 'BEGIN{printf "HELLO!!!\n"} {printf $5}' | cut -d '%' -f 1
HELLO!!!
19

# 使用BEGIN条件指定分隔符  BEGIN{FS=":"}
[root@master ~]# cat /etc/passwd | grep /bin/bash | awk 'BEGIN{FS=":"} {printf $1"\n"}'
root
abong

# END条件:在对文本提取结束后再执行该动作
# FS和-F指定分隔符
[root@master ~]# cat /etc/passwd | grep /bin/bash | awk 'BEGIN{FS=":"}{printf $1"\n"}END{print "hahaha"}'
root
abong
hahaha
[root@master ~]# cat /etc/passwd | grep /bin/bash | awk -F":" '{printf $1"\n"}END{print "hahaha"}'
root
abong
hahaha

# print相对于printf,多了一个换行符/n。即print自带换行符,而printf需手工加换行符。
[root@master ~]# cat /etc/passwd | grep /bin/bash | awk 'BEGIN{FS=":"}END{printf "AAAAA\n"} {printf $1"\n"}'  
root
abong
AAAAA

# 多个分隔符,这里的分隔符是a和b
# "ab" 双引号括起来指分隔符是ab
# "[ab]" 中括号括起来,表示或的关系,即a或b
[root@master ~]# echo "a123b423b234a234b545ab35" | awk -F "[ab]" '{print $2}'
123
[root@master ~]# echo "a123b423b234a234b545ab35" | awk 'BEGIN{FS="[ab]"}{print $2}'
123

# 输出IP地址
[root@master ~]# ifconfig ens32 | grep netmask | awk '{print $2}'
192.168.10.43
awk内置参数 作用
$1 $2 $3 第几个字段
$0 所有字段
FS 指定分隔符
NF 字段数,或者最后一列
NR 每行的记录行,表示第几行,是一个数字;输入多个文件时,读下一个文件时,接续上一个文件的行数
FNR 输入多个文件时,读下一个文件仍从行数1开始
OFS 字段分隔符,默认是空格
ORS 记录分隔符,默认是\n
RS 记录分隔符,默认是\n

综上,总结下awk的作用。即可以提取格式化文本的某行、某列、某个区域、某个单元格。对分隔符是空格,且数量不规则的文本也可以提取。还可以在文本提取前和文本提取后加提示语。

4. awk高级应用

awk [-F | -f | -v ] 'BEGIN {} / / {command1;command2} END {}' file
-F 指定分隔符
-f 调用脚本
-v 定义变量
'{}' 引用代码块
{
    
    } 命令代码块,包含一条或多条命令,命令之间用;分隔
BEGIN 初始化代码块
/ str / 匹配代码块,可以是字符串或正则表达式
{
    
    print A;print B} 多条命令使用分号分隔
END 结尾代码块
# 正则表达式匹配
# 输出/etc/passwd文件中以root开头的行
[root@master ~]# awk -F: '/^root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

# 输出/etc/passwd文件中包含root开头的行
[root@master ~]# awk -F: '/root/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

# 输出/etc/passwd文件中不包含root开头的行
[root@master ~]# awk -F: '!/root/{print}' /etc/passwd

# 输出/etc/passwd文件中以bash结尾的行
[root@master ~]# awk -F: '/bash$/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
abong:x:1000:1000:abong:/home/abong:/bin/bash

# 输出/etc/passwd文件中的第2-5行
[root@master ~]# awk -F: '(NR>=2&&NR<=5){print NR,$0}' /etc/passwd
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

# 输出IP地址
[root@master ~]# ifconfig ens32 | awk -F" " 'NR==2{print $2}'
192.168.10.43

# NR和FNR的用法
# 在awk接收多文件时,NR延续显示行数、FNR循环显示行数
[root@master ~]# cat a.txt
111
222
333
444
[root@master ~]# cat b.txt
555
666
777
888
[root@master ~]# awk '{print NR "\t" $0}' a.txt b.txt
1	111
2	222
3	333
4	444
5	555
6	666
7	777
8	888
[root@master ~]# awk '{print FNR "\t" $0}' a.txt b.txt
1	111
2	222
3	333
4	444
1	555
2	666
3	777
4	888

# 去除首行
[root@master ~]# awk 'NR!=1{print }' a.txt
222
333
444

# 使用开始和结束模块来格式化输出
[root@master ~]# awk 'BEGIN{print "id"}{print }END{print "end"}' a.txt
id
111
222
333
444
end

5. sed预编辑器[脚本中的替换器]

作用:对文件或者命令的输出结果进行编辑。是一种轻量级的流编辑器。支持数据的选取、替换、删除、新增。在linux中存在vi或vim编辑器,可直接对文件进行编辑,故sed命令主要用于对命令的输出结果进行编辑,而不直接影响文件实际内容。

格式:sed 选项 '动作' 文件名

选项 作用
-n 默认要输出整个文件,加-n参数,表示只输出经过sed命令处理的行。
-e 指定动作,该选项可省略,但动作要有。
-i 输出屏幕的结果和文件数据都更改,不加-i则不修改文件的数据,只修改输出屏幕的数据。
动作 作用
na 在第n行后面追加,可追加多行
nc 替换整行,替换第n行
ni 在第n行前面插入,可插入多行
nd 删除第n行。m,nd指删除第m行到第n行的数据
np 打印第n行。m,np指打印第m行到第n行的数据
ns 替换第n行的某个字符串,ns/old_str/new_str/g,将第n行的old_str替换成new_str。
ny 替换第n行的某个字符串,ny/old_str/new_str/,将第n行的old_str按字符顺序替换成new_str。
# 打印第二行的结果,不加-n参数,把原内容也显示一遍。加了-n参数,只显示打印的部分,即经过sed处理的部分。
[root@master ~]# cat a.txt 
a	1	abong
b	2	aabong
c	3	aaabong
[root@master ~]# sed '2p' a.txt
a	1	abong
b	2	aabong
b	2	aabong
c	3	aaabong
[root@master ~]# sed -n '2p' a.txt
b	2	aabong
[root@master ~]# sed -n '2,3p' a.txt
b	2	aabong
c	3	aaabong

# 输出屏幕的结果删除第2、3行,并不修改文件实际的内容。
[root@master ~]# sed '2,3d' a.txt
a	1	abong
[root@master ~]# cat a.txt 
a	1	abong
b	2	aabong
c	3	aaabong


# 替换第3行的aaabong为xiaoming
[root@master ~]# cat a.txt 
a	1	abong
b	2	aabong
c	3	aaabong
[root@master ~]# sed '3s/aaabong/xiaoming/g' a.txt 
a	1	abong
b	2	aabong
c	3	xiaoming
# 多行字符串同时替换
[root@master ~]# sed -e '2s/aabong/dalao/g;3s/aaabong/xiaodi/g' a.txt 
a	1	abong
b	2	dalao
c	3	xiaodi


# 替换第一行整行为null
[root@master ~]# sed '1c null' a.txt
null
b	2	aabong
c	3	aaabong
[root@master ~]# cat a.txt 
a	1	abong
b	2	aabong
c	3	aaabong

# a后面追加  i前面插入
[root@master ~]# cat a.txt 
a	1	abong
b	2	aabong
c	3	aaabong
[root@master ~]# sed '2a hello!!!' a.txt
a	1	abong
b	2	aabong
hello!!!
c	3	aaabong
[root@master ~]# sed '2i hello!!!' a.txt
a	1	abong
hello!!!
b	2	aabong
c	3	aaabong

# 指定某行按字符替换,不指定则只全文
[root@master ~]# sed '3y/abong/ABONG/' a.txt 
a	1	abong
b	2	aabong
c	3	AAABONG

# 其他用法
# 计算总行数
[root@master ~]# sed -n -e '$=' a.txt 
3
# 显示行数及打印每一行的内容
[root@master ~]# sed -e '=' a.txt 
1
a	1	abong
2
b	2	aabong
3
c	3	aaabong

总结一下,以上四个命令都可以接收文本的输入或者将其他命令的输出结果作为输入,可以很好的在shell脚本中进行文本的提取,并赋予指定的变量。所以学会使用这几个文本提取的命令还是非常有必要的。

6. shell输出内容背景和字体颜色设置

# \e即\033
# echo -e "\033[背景颜色;文字颜色m 输出字符\033[0m"
# echo -e "\e[背景颜色;文字颜色m 输出字符\e[0m"

[root@master ~]# echo -e "\e[42;34m abong\e[0m"
 abong
[root@master ~]# echo -e "\033[42;34m abong\033[0m"
 abong

42 绿  4x为背景,40-47
34 蓝  3x为文字,30-37
# 
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m"
echo -e "\033[33m 黄色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天蓝字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"

echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
echo -e "\033[42;37m 绿底白字 \033[0m"
echo -e "\033[43;37m 黄底白字 \033[0m"
echo -e "\033[44;37m 蓝底白字 \033[0m"
echo -e "\033[45;37m 紫底白字 \033[0m"
echo -e "\033[46;37m 天蓝底白字 \033[0m"
echo -e "\033[47;30m 白底黑字 \033[0m"

# 0m 清除所有格式
\033[0m  关闭所有属性
[root@master ~]# echo -e "\033[45;37m 紫底白字 \033[0m"
\033[1m  设置高度、亮度、加粗
[root@master ~]# echo -e "\033[45;37m 紫底白字 \033[1m"
\033[5m  闪烁
[root@master ~]# echo -e "\033[45;37m 紫底白字 \033[5m"

在这里插入图片描述
在这里插入图片描述

7. 检测服务器是否受到DDOS攻击脚本【网站压测】

DDOS,即分布式拒绝服务攻击。DDOS可以对源IP地址进行伪造,使多台计算机在同一时间遭受到攻击(大量未知源IP的访问),占用大量的cpu和内存资源,使得攻击的目标网站无法正常访问。

# 对网站进行压力测试,并统计压测情况
# 部署httpd服务
[root@server ~]# yum install httpd -y
[root@server ~]# systemctl start httpd
[root@server ~]# echo "hahah" > /var/www/html/index.html
[root@server ~]# curl 192.168.10.10
hahah

# 编写ddos攻击监控脚本,用于收集源IP地址
[root@server ~]# vim ddos_test.bash
#!/bin/bash
netstat -antup | awk '{print $5}' | cut -d: -f1 | sort |uniq -c | sort -n
[root@server ~]# chmod +x ddos_test.bash

# 安装ab工具,httpd-tools是httpd的依赖包,故直接安装httpd即可
[root@client ~]# yum install httpd -y
[root@client ~]# which ab
/usr/bin/ab
[root@client ~]# rpm -qf /usr/bin/ab
httpd-tools-2.4.6-88.el7.centos.x86_64

# 使用ab工具攻击攻击网站
[root@client ~]# ab -n 1000 -c 1000 http://192.168.10.10/index.html

# 执行ddos攻击监控脚本
[root@server ~]# bash ddos_test.bash
      1 192.168.10.1
      1 Address
      1 and
      9 
     13 0.0.0.0
   1001 192.168.10.42
   
# 通过检测脚本,可以收集访问网站的源地址的访问次数,以便排查是否受到了ddos攻击。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_36522099/article/details/107804597