shell中色彩处理和awk使用技巧

  • shell中的色彩处理
  • awk基本应用
  • awk高级应用
  • 实战-shell脚本实战

一、shell中的色彩处理

shell脚本中echo显示内容带颜色显示,需要使用到-e参数
格式1:echo -e “\033[背景颜色;字体颜色m 要输出的字符 \033[0m”
格式2:echo -e “\e[背景颜色;字体颜色m 要输出的字符 \e[0m”
例如:绿底蓝字
在这里插入图片描述
注:42的位置表示背景颜色是绿色;34的位置表示字体是蓝色的
1、背景颜色和字体颜色中间用分号隔开
2、文字颜色后面有个m
3、字符串前后可以没有空格,如果有的话,输出同样是有空格
4、echo带颜色显示,需要使用-e参数

控制选项:
\033[0m:关闭所有属性
\033[1m:高亮显示,加粗
\033[5m:闪烁
例:
在这里插入图片描述

常见shell输入带颜色文字:3x表示字的颜色;4x表示背景色
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”
在这里插入图片描述

二、awk的基本应用
任何的awk语句都是有模式和动作组成,一个awk脚本可以有多个语句。模式决定动作语句的触发条件和触发时间。

模式:
正则表达式:/root/匹配含有root的行 /*.root/
关系运算符:< <= > >= != ==
正则运算符:~ ~!
赋值运算符:= += -= *= /= %= **=
逻辑运算符: || &&
算数运算符:+ - * / ++ –
其它运算符:$–>用来对字段进行引用 空格—>字符串链接符

动作:
变量 命令 内置函数 流控制语句

语法结构:
awk [options] ‘BEGIN{ print “start” }’ ‘pattern{ action }’ END{ print “end” } file
特殊语句:
BEGIN和END部分在awk中都仅执行一次且它们都各有各的用途
BEGIN语句:
1、设置变量计数初始值
2、打印头部信息
3、改变字段的分隔符
4、它在动作之前进行
END语句:
1、输出统计结果
2、打印结尾信息
3、在完成动作之后执行

awk的内置变量:
$n 当前记录的第n个字段,比如:$1表示第一个字段,$2表示第二个字段
$0 执行过程中这个行的内容显示
FILENAME 当前输入文件的名称
FS 字段分隔符(默认是空格)
NF 表示字段数,对应文件的列数,就是有多少列
FNR 各文件分别计数的行号
NR 表示记录数,执行过程中的行号,从1开始
OFS 输出字段分隔符(默认空格)
ORS 输入字段分隔符(默认是换行符)
RS 记录分隔符(默认是换行符)

命令选项:
-F 指定分隔符
-v 赋值一个用户自定义变量
-f 指定脚本文件,从脚本中读取awk命令

1)分隔符的使用
用法:-Ffs fs表示分隔符号 fs可以是字符串或正则表达式,分隔符默认是空格
例1:默认分隔符是空格

[root@xuegod140 ~]# echo “aa bb cc dd” | awk ‘{print $1}’
aa
[root@xuegod140 ~]# echo “aa bb cc dd” | awk ‘{print $2}’
bb
[root@xuegod140 ~]# echo “aa bb cc dd” | awk ‘{print $3}’
cc

例2:修改分隔符为“|”

[root@xuegod140 ~]# echo “aa|bb|cc|dd” | awk ‘{print $1}’#默认空格分隔,所以只有一个字段
aa|bb|cc|dd
[root@xuegod140 ~]# echo “aa|bb|cc|dd” | awk -F"|" ‘{print $1}’
aa
[root@xuegod140 ~]# echo “aa|bb|cc|dd” | awk -F"|" ‘{print $2}’
bb
[root@xuegod140 ~]# echo “aa|bb|cc|dd” | awk -F"|" ‘{print $3}’
cc

例3:以冒号分隔,打印passwd文件的用户

[root@xuegod140 ~]# awk -F":" ‘{print $1}’ /etc/passwd | head
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator

例4:指定多个分隔符,使用正则表达式

[root@xuegod140 ~]# echo “aaaxbbbxccccXddd” | awk -F"[xX]" ‘{print $2}’
bbb
[root@xuegod140 ~]# echo “aaaxbbbxccccXddd” | awk -F"[xX]" ‘{print $3}’
cccc
[root@xuegod140 ~]# echo “aaaxbbbxccccXddd” | awk -F"[xX]" ‘{print $4}’
ddd

例5:使用内置变量FS指定分隔符,需要和BEGIN一起使用

[root@xuegod140 ~]# echo “aaaxbbbxccccXddd” | awk ‘BEGIN{FS=“xX”}{print $2}’
#没有输出,因为把xX当做一个分隔符来划分字段
[root@xuegod140 ~]# echo “aaaxXbbbxccccXddd” | awk ‘BEGIN{FS=“xX”}{print $2}’
bbbxccccXddd
[root@xuegod140 ~]# echo “aaaxXbbbxccccXxddd” | awk ‘BEGIN{FS=“Xx”}{print $2}’
ddd

例6:过滤本系统的IP地址
方法1:通过grep先过滤,然后awk打印

[root@xuegod140 ~]# ifconfig ens33 | grep -i netmask
inet 192.168.1.140 netmask 255.255.255.0 broadcast 192.168.1.255
[root@xuegod140 ~]# ifconfig ens33 | grep -i netmask|awk ‘{print $2}’
192.168.1.140

方法2:直接使用awk先匹配关键字,然后打印

[root@xuegod140 ~]# ifconfig ens33 | awk ‘/netmask/’
inet 192.168.1.140 netmask 255.255.255.0 broadcast 192.168.1.255
[root@xuegod140 ~]# ifconfig ens33 | awk ‘/netmask/{print $2}’
192.168.1.140

2)运算符号的使用
例1:单个运算命令

[root@xuegod140 ~]# echo 2 4 5 6 | awk ‘{print $2+10}’
14
[root@xuegod140 ~]# echo 2 4 5 6 | awk ‘{print $23}’
12
[root@xuegod140 ~]# echo 2 4 5 6 | awk '{print $2
3/$1}’
6

例2:多个运算命令

[root@xuegod140 ~]# echo 2 4 5 6 | awk ‘{print $23/$1,$3$2}’
6 20

例3:内部赋值变量,进行运算

[root@xuegod140 ~]# awk ‘BEGIN{a=5;a+=5;print a}’
10

3)NF字段参数和运算符的结合使用
例1:打印passwd的前三行的NF字段

[root@xuegod140 ~]# awk -F":" ‘{print $NF}’ /etc/passwd | head -3
/bin/bash
/sbin/nologin
/sbin/nologin

例2:打印passwd的倒数第二行的NF字段

[root@xuegod140 ~]# awk -F":" ‘{print $(NF-2)}’ /etc/passwd | head -3
root
bin
daemon

例3:打印平均字段的前一个字段

[root@xuegod140 ~]# echo “aa bb cc dd” | awk ‘{print $(NF/2-1)}’
aa

例4:打印passwd文件中UID小于10的用户名和登录shell

[root@xuegod140 ~]# awk -F":" ‘{$3<10;print 1 , 1, 1,NF}’ /etc/passwd |head
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
[root@xuegod140 ~]# awk -F":" ‘$3<10{print 1 , 1, 1,NF}’ /etc/passwd |head #运算在外也行

例5:awk最外面使用了单引号,里面使用双引号

[root@xuegod140 ~]# awk -F":" ‘$3<10{print KaTeX parse error: Expected 'EOF', got '\t' at position 3: 1"\̲t̲"NF}’ /etc/passwd |head
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin

例6:打印除系统UID大于1000且登录shell是/bin/bash用户

[root@xuegod140 ~]# awk -F":" ‘KaTeX parse error: Expected 'EOF', got '&' at position 8: 3>=1000&̲&NF=="/bin/bash"{print 1 , 1, 1,NF}’ /etc/passwd
zx /bin/bash

注:这里的比较符号一定要使用正则表达式。>= ==

4)脚本中的应用
例1:统计当前内存的使用率

[root@xuegod140 ~]# free -m | grep -i mem| awk ‘{print $3/$2}’
0.10727
[root@xuegod140 ~]# free -m | grep -i mem| awk ‘{print $3/$2100}’
10.727
[root@xuegod140 ~]# free -m | grep -i mem| awk '{print $3/$2
100"%"}’
10.727%

例2:给到变量,使用echo -e打印色彩

[root@xuegod140 ~]# var=$(free -m | grep -i mem| awk ‘{print $3/$2*100"%"}’)
[root@xuegod140 ~]# echo -e “内存使用百分比:\e[31m $var \e[0m”
内存使用百分比: 10.727%
[root@xuegod140 ~]# echo -e “内存使用百分比:\e[31m $var \e[0m”
内存使用百分比: 10.727%

例3:将上面命令写入到脚本内执行
在这里插入图片描述

三、awk的高级应用
1、命令格式:
awk [-F | -f | -v ] ‘BEGIN{} // {command1;command2} END{}’ file
-F 指定分隔符
-f 调用脚本
-v 定义变量
‘{}’ 引用代码块
{……} 命令代码块,含一条或多条
BEGIN 初始化代码块
/str/ 匹配代码块,可以是字符串或正则表达式
{print a;print b} 多条命令用冒号隔开
END 结尾模块
system() 执行系统命令,命令用引号引起来 system(“”df -Th””)
例1:打印以root开通的行,使用正则表达式^

[root@xuegod140 ~]# awk -F":" ‘/^root/{print KaTeX parse error: Expected 'EOF', got '\t' at position 3: 1"\̲t̲"NF}’ /etc/passwd
root /bin/bash
[root@xuegod140 ~]# awk -F":" ‘/^root/{print $0}’ /etc/passwd #$0表示当前行全部
root❌0:0:root:/root:/bin/bash

例2:打印包含root的行

[root@xuegod140 ~]# awk -F":" ‘/root/{print $0}’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin
[root@xuegod140 ~]# awk -F":" ‘/root/’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin

例3:行范围匹配
输出行号大于等于3且行号小于等于6的行

[root@xuegod140 ~]# awk -F":" ‘NR>=3&&NR<=6{print NR,$0}’ /etc/passwd
3 daemon❌2:2:daemon:/sbin:/sbin/nologin
4 adm❌3:4:adm:/var/adm:/sbin/nologin
5 lp❌4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync❌5:0:sync:/sbin:/bin/sync

2、内置变量的特殊用法
例1:使用NR来定位行号,然后提取IP地址

[root@xuegod140 ~]# ifconfig ens33 | awk ‘NR==2{print $2}’
192.168.1.140

例2:NR和FNR的区别

[root@xuegod140 ~]# awk ‘{print NR,$0}’ /etc/hosts /etc/hostname
1 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
2 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
3 xuegod140.localdomain
[root@xuegod140 ~]# awk ‘{print FNR,$0}’ /etc/hosts /etc/hostname #FNR分文件计数
1 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
2 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
1 xuegod140.localdomain

注:对于NR来说,在读取不同文件时,NR的值是一直增加的
对于FNR来说,在读取不同文件时,它在读取下一个文件时,FNR会从1重新计时

例3:使用3中方法删除route -n显示的首行内容
方法1:grep命令

[root@xuegod140 ~]# route -n | grep -iv kernel
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 ens33
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0

方法2:使用sed命令

[root@xuegod140 ~]# route -n | sed ‘1d’
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 ens33
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0

方法2:使用awk命令

[root@xuegod140 ~]# route -n | awk ‘NR!=1{print $0}’
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 ens33
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0

例4:使用awk查找包含root的行的三种方法
方法1:

[root@xuegod140 ~]# awk ‘/root/{print $0}’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin

方法2:

[root@xuegod140 ~]# awk ‘/root/’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin

方法3:

[root@xuegod140 ~]# awk ‘/root/{print}’ /etc/passwd
root❌0:0:root:/root:/bin/bash
operator❌11:0:operator:/root:/sbin/nologin

例5:使用awk找出不包含root的行

[root@xuegod140 ~]# awk ‘!/root/{print $0}’ /etc/passwd | wc -l
42
[root@xuegod140 ~]# awk ‘!/root/{print}’ /etc/passwd | wc -l
42
[root@xuegod140 ~]# awk ‘!/root/’ /etc/passwd | wc -l
42

3、条件表达式
表达式?if-true:if-false 问号前是条件,如果条件为真执行true,为假执行false
例1:如果passwd中UID小于10,则给变量USER赋值成aaa,否则赋值成bbb
变量赋值要用双引号引起来,判断需要放在awk内部

[root@xuegod140 ~]# awk -F":" ‘{$3<10?USER=“aaa”:USER=“bbb”;print $1,USER}’ /etc/passwd
root aaa
bin aaa
daemon aaa
adm aaa
lp aaa
sync aaa
shutdown aaa
halt aaa
mail aaa
operator bbb
games bbb
ftp bbb
nobody bbb
systemd-network bbb

例2:用if(条件){命令1;命令2}elif(条件2){命令}else{命令}中,在比较条件中用()括起来,在awk中如果条件为1为真,0为假
如果UID小于10,则输出user=>用户名,否则输出pass=用户名

[root@xuegod140 ~]# awk -F":" ‘{if($3<10){print “user=”$1}else{print “pass=”$1}}’ /etc/passwd
user=root
user=bin
user=daemon
user=adm
user=lp
user=sync
user=shutdown
user=halt
user=mail
pass=operator
pass=games
pass=ftp

例3:查出行号小于等于5且包含bin/bash的行

[root@xuegod140 ~]# awk -F":" ‘NR<=5 && $NF~"/bin/bash"{print $0}’ /etc/passwd
root❌0:0:root:/root:/bin/bash
[root@xuegod140 ~]# awk -F":" ‘{if(NR<=5 && $NF~"/bin/bash"){print 1 , 1, 1,NF}}’ /etc/passwd
root /bin/bash

4、变量的使用
注:awk外部变量需要使用单引号+双引号括起来
awk内部变量,直接使用,不需要用$符号调用

[root@xuegod140 ~]# var=10
[root@xuegod140 ~]# awk ‘BEGIN{print "’$var’"}’ #外部变量
10
[root@xuegod140 ~]# awk -v var=10 ‘BEGIN{print var}’ #内部变量
10

5、格式化输出
printf命令
使用注意事项
1、printf需要指定format样式
2、format用于指定后面的每个item的输出格式
3、printf语句不会自动打印换行符:\n
4、format格式的指示符都是以%开头,后跟一个字符,如下
%c:显示字符的ASCII码
%d,%i:十进制数
%e,%E:科学计数法显示数值
%f:显示浮点数
%g,%G:以科学计数法的格式或浮点数的格式显示数值
%s:显示字符串
%u:无符号整数
%%:显示%自身

例1:输入passwd文件中的第一行,输出是不会换行

[root@xuegod140 ~]# awk -F":" ‘{printf “%s”,$1 }’ /etc/passwd
rootbindaemonadmlpsyncshutdownhaltmailoperatorgamesftpnobodysystemd-networkdbuspolkitdlibstoragemgmtrpccolordsaslauthabrtsetroubleshootrtkitchronyrpcusernfsnobodyqemuunboundglustertssusbmuxdgeoclueradvdpulsegdmgnome-initial-setupsshdavahipostfixntptcpdumpzxapachemysql[root@xuegod140 ~]#

例2:换行输出

[root@xuegod140 ~]# awk -F":" ‘{printf “%s”,$1"\n" }’ /etc/passwd
root
bin
daemon
adm
[root@xuegod140 ~]# awk -F":" ‘{printf “%s\n”,$1}’ /etc/passwd
root
bin
daemon

例3:在输出的字符前面添加上自定义字符串USERNAME

[root@xuegod140 ~]# awk -F":" ‘{printf “USERNAME: %s\n”,$1}’ /etc/passwd
USERNAME: root
USERNAME: bin
USERNAME: daemon
USERNAME: adm
USERNAME: lp
USERNAME: sync
USERNAME: shutdown
USERNAME: halt

例4:对 1 和 1和 1NF都做格式化输出

[root@xuegod140 ~]# awk -F":" ‘{printf “USERNAME: %s %s\n”, 1 , 1, 1,NF}’ /etc/passwd
USERNAME: root /bin/bash
USERNAME: bin /sbin/nologin
USERNAME: daemon /sbin/nologin
[root@xuegod140 ~]# awk -F":" ‘{printf “USERNAME: %s PASS:%s\n”, 1 , 1, 1,NF}’ /etc/passwd

例5:对 1 和 1和 1NF都做格式化输出,在两者之间添加一串===字符输入

[root@xuegod140 ~]# awk -F":" '{printf "USERNAME: %sPASS:%s\n", 1 , 1, 1,NF}’ /etc/passwd
USERNAME: root
PASS:/bin/bash
USERNAME: binPASS:/sbin/nologin
USERNAME: daemon
PASS:/sbin/nologin
USERNAME: admPASS:/sbin/nologin
USERNAME: lp
PASS:/sbin/nologin

5、修饰符
N:显示宽度
-:左对齐
一个字占一个宽度,默认是右对齐(+)
例1:显示10个宽度的字符串,左对齐

[root@xuegod140 ~]# awk -F":" ‘{printf “%-10s %-10s\n”, 1 , 1, 1,NF}’ /etc/passwd | head -3
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
注:输出两个字段,格式化指示符也需要两个

四、实战-shell脚本
1、检查服务器是否收到DDOS攻击脚本
思路:通过netstat 查看网络连接数,如果一个IP地址对服务器建立很多连接数,那么就认为发生了DDOS攻击
首先安装httpd服务,然后启动

[root@xuegod140 ~]# yum -y install httpd
[root@xuegod140 ~]# systemctl start httpd
[root@xuegod140 ~]# systemctl status httpd

编写脚本

[root@xuegod140 ~]# netstat -ntu | awk ‘{print $5}’|cut -d: -f1|sort|uniq -c|sort -n
1 192.168.1.104
1 Address
1 servers)
[root@xuegod140 ~]# vim ddos.sh
[root@xuegod140 ~]# cat ddos.sh
#!/bin/bash
netstat -ntu | awk ‘{print $5}’|cut -d: -f1|sort|uniq -c|sort -n
测试,模拟ddos
ab命令:做压力测试的工具和性能的监控工具
语法:ab -n 要产生的链接数综合
ab -c 同时打开的客户端的数量
安装ab命令:
[root@xuegod140 ~]# rpm -qf `which ab`
httpd-tools-2.4.6-80.el7.centos.x86_64

跑ddos测试攻击

[root@xuegod140 ~]# ab -n 1000 -c 10 http://192.168.1.140/index.html

运行脚本,查看测试结果

[root@xuegod140 ~]# sh ddos.sh
1 192.168.1.104
1 Address
1 servers)
1004 192.168.1.140

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值