运维脚本格式,三剑客

一:脚本
shell的功能
*命令行的解释功能
*启动程序
*输入输出重定向
*管道连接
*文件名置换(echo /")
*变量维护
*环境控制
*shell编程


1.数字比较运算
-eq 等于
-gt 大于
-lt 小于
-ge 大于或等于
-le 小于或等于
-ne 不等于

2.简单测试安装nginx
#!/bin/bash
yum -y install wget gcc pcre-devel zlib-devel
wget http://nginx.org/download/nginx-1.20.1.tar.gz
tar -xf nginx-1.20.1.tar.gz
cd nginx-1.20.1
./configure --prefix=/usr/local/nginx
make -j 1
make install
可利用率不高

3.转义字符(常用)
\a 发出警告声
\n 换行且光标移至行首
\t 插入tab
\b 删除前一个字符


4.read命令
默认接受键盘的输入,回车符代表输入结束
read命令选项
-p 打印信息
-t 限定时间
-s 不回显
-n 输入字符个数

5.变量
本地变量:用户私有变量,只有本用户可以使用,保存在家目录下的.bash_profile, .bashrc文件中
全局变量:所有用户都可以使用,保存在/etc/profile,/etc/bashrc文件中
用户自定义变量:用户自定义,比如脚本中的变量

定义变量:
变量格式:命名只能使用英文,数字,下划线。首个字符不能以数字开头
中间不能有空格,可以使用下划线
不能使用标点符号
不能使用bash里的关键字
注意:字符串要用单引号或双引号引起来

全局变量:export


6.数组
数组可以让用户一次性赋予多个值,需要读取的时候只需要调用一下
方法1:
array0[0]='tom'
array0[1]='jarry'
array0[2]='natasha'
方法2:
#array2=(tom jack alice)
#array3=('cat /etc/passwd')
#array4=('cat /var/ftp/Shell/for')

定义关联数组
申明关联数组变量


7.if判断
shell中的五大运算


1)数学运算
-eq 等于
-gt 大于
-lt 小于
-ge 大于或等于
-le 小于或等于
-ne 不等于


2)字符串比较运算
运算符解释,注意字符串一定别忘了使用引号引起来
== 等于
!= 不等于
-n 检查字符串的长度是否大于0
-z 检查字符串的长度是否为0


3)文件比较与检查
-d 检查文件是否存在且为目录
-e 检查文件是否存在
-f 检查文件是否存在且为文件
-r 检查文件是否存在且可读
-s 检查文件是否存在且不为空
-w 检查文件是否存在且可写
-x 检查文件是否存在且可执行
-o 检查文件是否存在且被当前用户拥有
-G 检查文件是否存在且默认组为当前组
file1 -nt file2 检查file1是否比file2新
file1 -ot file2 检查file1是否比file2旧


4)逻辑运算
逻辑与运算 &&
逻辑或运算 ||
逻辑非运算 |


5)赋值运算
= 赋值运算符

if语法一:
格式:
if [ 条件 ];
  then
fi
例子:
#!/bin/bash
if [ ! -d /tmp/abc ];then !是取反的意思
        mkdir -v /tmp/abc
        echo "123"
        echo "create /tmp/abc OK!!!"
fi


if语法二:
if-then-else
格式:
if [ 条件 ]
then
执行1
       else
执行2
fi

例子:
#!/bin/bash
if [ $USER == 'root' ]
    then
            echo "管理员,你好"
            else
echo "对不起,你没有权限"
fi


if语法三:
if-then-elif
格式:
if [ 条件1 ]
then
执行1
elif [ 条件2 ]
then
执行2
.......
else
执行3
fi
例子1:(嵌套):(嵌套)
#!/bin/bash
if [ $1 -eq $2 ]
    then
           echo "$1=$2"
else
    if [ $1 -gt $2 ]
            then
                   echo "$1>$2"
            else
                   echo "$1<$2"
    fi
fi

例子2:(多步if)
#!/bin/bash
if [ $1 -gt $2 ]
   then
          echo "$1>$2"
elif [ $1 -eq $2 ]
          then
                  echo "$1=$2"
      else [ $1 -lt $2 ]
                  echo "$1<$2"
fi

例子3:
用[[ ... ]]测试结构比用[ ... ]更能防止脚本里的许多逻辑错误。比如说,&&,||,<和>操作符能在一个[[]]测试里通过,但在[]结构会发生错误。
for i in aa1 aa2 aa3 oo cc
do
if [[ $i == a* ]];then
         echo "$i"
else
         echo "不匹配"
fi
done


for循环语句
#1直接赋值
for i in 1 2 3 4 5 6 7 8 9

#2使用命令赋值
for i in ·seq 1 9·

#3赋值是一个字符串
for i in baism\'s is cool, baism\'s is nice
   do
          echo "输出:$i"
done


语法格式一:
for i in 数据1 数据2 数据3
do
执行条件
done
例子:
#!/bin/bash
for i in `seq 1 9`
   do
        echo $i
done

语法格式二:
"C格式语法"
for ((变量;条件;自增减运算))
do
代码块
done
例子:
#!/bin/bash
for (( a=0,b=9;a<10;a++,b-- ))
   do
          echo $a $b
done

"多变量"
for (( n=10,m=0;n>0,m<10;n--,m++ ))
     do
            echo -e "$n\t$m"
done


循环控制语句
1)sleep N 脚本执行到该步休眠几秒
#!/bin/bash
echo "倒计时:"
for i in `seq 9 -1 1`
  do
          echo -n -e "\b$i"
          sleep 1
done

时间取值:date +"%F %H:%M:%S"

一直循环
#!/bin/bash
for ((;;))
    do
            ping -c 2 $1 &>/dev/null
if [ $? -eq 0 ]
    then
             echo "`date +"%F %H:%M:%S"` : $1 is UP"
else
             echo "`date +"%F %H:%M:%S"` : $1 is DOWN"
fi
sleep 5
done

3)continue跳过循环中的某次循环
#!/bin/bash
for ((i=1;i<10;i++))
    do
       if [ $i -eq 5 ]
            then
            continue
       else
         echo $i
       fi
done

4)break跳出循环继续执行后续代码
#!/bin/bash
for i in `seq 1 9`
    do
            echo $i
     if [ $i -eq 5 ]
            then
            break
     fi
done

break终止本循环
#!/bin/bash
for ((;;))
    do
           read -p "char: " ch
    if [ $ch == "Q" ]
           then
           break
    else
           echo "你输入的字符是:$ch"
     fi
done


5)while循环
格式:
while [ 条件 ]
do
执行
done

例子:
#!/bin/bash
read -p "money: " money
read -p "car: " car_num
read -p "house: " house

while [ $money -lt 1000000 ] || [ $car_num -lt 1 ] || [ $house -lt 1 ]
do
       echo "不行"
       read -p "money: " money
       read -p "car: " car_num
       read -p "house: " house
done

       echo "OK!"

6)while循环控制与语句嵌套
#1,嵌套 if for while
#2,循环控制sleep break continue
#!/bin/bash
i=0
while [ $i -lt 10 ]
         do
              i=$((i+1))
         if [ $i -eq 5 ];then
              continue
          fi
               if [ $i -eq 10 ];then
                      break
               else
                      echo $i
               fi
done

#!/bin/bash
case $1 in
[0-9])
          echo "match number."
;;
[a-z])
           echo "match letter."
;;
'-h'|'--help')
           echo "help"
;;
*)
           echo "Input error!"
           exit
esac
模式支持的正则有:*、?、[ ]、[.-.]、|

debug的调试
debug方法
sh -x 显示脚本执行的过程,解决80-95%
set命令设置开始debug和结束debug的位置 显示脚本支持过程,解决复杂脚本故障
# sh -x 开始debug,从这里开始显示脚本详细执行过程
# sh +x 结束debug,从这里开始结束显示脚本详细执行过程


运维三剑客
命令 特点 场景
1.grep 过滤 grep命令过滤速度是最快的
2.sed 替换,修改文件内容,取行 如果替换或者修改内容,取出某个范围的内容(早上10点到11点)
3.awk 取列 取列,对比>= <= != > < 统计,计算(awk数组 )

一:grep

选项 含义
-E ==egrep 支持扩展正则
-A 了解,after-A5 匹配你要的内容并且显示接下来的5行
-B 了解,before-B 匹配你要的内容并且显示接上面的5行
-C 了解,context 上下-C5匹配你要的内容并且上下5行
-c 统计出现了多少行,类似wc -l
-v 取反,排除(行)
-n 显示行号
-i 忽略大小写
-w 精确匹配

匹配一些有规律的东西:手机号,身份证号,匹配日志
正则表达式
使用一些符号表达重复出现,大小写,开头/结尾含义

应用场景
正则表达式 Linux python golang等
应用场景 过滤有规律的内容,日志

正则注意事项:
1.所有的符号都必须是英文
2.正则通过grep来学习,grep加上单引号
3.给grep egrep 加上颜色 alias grep='grep --color=auto' alias egrep='egrep --color=auto'
4.注意系统字符集:en_US.UTF-8(大部分情况90%没问题),如果出现问题就修改字符集为C export LANG=C
5.快速掌握正则,需要配合grep -o 参数学习

正则符号
基础正则 ^ $ ^$ . * .* [a-z] [^abc]
扩展正则 + | {} ?()

正则VS通配符
分类 目标用途 支持的命令=
正则 高级语言,进行过滤(匹配字符) grep,sed,awk,find,rename(ubuntu),expr
通配符 匹配文件(文件名)*.txt *.log Linux大部分命令都支持

基础正则
grep -A [文件名字]
[root@node1 ~]# cat -n -A file.txt
1 I no linux.$
2 my blog jugikhk ugh , kijp ball and chess!$
3 $
4 I like nall!$
5 my log is http://guh.kig.com$
6 curl qq is http://qq.teten.com$

1) ^ 以...开头的行
[root@node1 ~]# grep '^my' file.txt
my blog jugikhk ugh , kijp ball and chess!
my log is http://guh.kig.com
my god, i am not but HFJYJYGU!

2) $ 以...结尾的行
[root@node1 ~]# grep 'com$' file.txt
my log is http://guh.kig.com
curl qq is http://qq.teten.com

3) ^$ 空行(这一行没有任何内容) 一般都是排除文件空行所用
[root@node1 ~]# grep -v '^$' file.txt -v 选项用来实现反选匹配
I no linux.
my blog jugikhk ugh , kijp ball and chess!
I like nall!
my log is http://guh.kig.com
curl qq is http://qq.teten.com
not qq is 56565656
my god, i am not but HFJYJYGU!
gh fsh edfc f de

4). 表示任意一个字
注意: .不匹配空行
[root@node1 ~]# grep '.' file.txt
I no linux.
my blog jugikhk ugh , kijp ball and chess!
I like nall!
my log is http://guh.kig.com
curl qq is http://qq.teten.com
not qq is 56565656
my god, i am not but HFJYJYGU!
gh fsh edfc f de

5)\ 转义字符,去除原有特殊含义
匹配出文件中以‘.’结尾的行
[root@node1 ~]# grep '.$' file.txt
I no linux.
my blog jugikhk ugh , kijp ball and chess!
I like nall!
my log is http://guh.kig.com
curl qq is http://qq.teten.com
not qq is 56565656
my god, i am not but HFJYJYGU!
gh fsh edfc f de
[root@node1 ~]# grep '\.$' file.txt
I no linux.

转义字符:
\n 回车换行
\t tab键

6)* 前一个字符连续出现0次或0次以上
连续出现:0(出现一次)00(出现两次)00000(出现五次) file(字母出现了六次)
[root@node1 ~]# grep '0*' file.txt

7).* 表示所有内容,任何内容,任意内容
整体记忆 .*表示所有即可(包括空行)
了解:.任意一个字符+*前一个字符连续出现0次或0次以上
[root@node1 ~]# grep '^.*t' file.txt
my log is http://guh.kig.com
curl qq is http://qq.teten.com
not qq is 56565656
my god, i am not but HFJYJYGU!
正则特色:正则表达式的贪婪性,.*表示所有或*连续出现的时候,匹配到最后一个

8) [] [abc] 1次匹配1个字符,匹配任何一个字符(a或b或c)
[root@node1 ~]# grep '[a-b]' file.txt
my blog jugikhk ugh , kijp ball and chess!
I like nall!
my god, i am not but HFJYJYGU!

匹配字母大小写加数字
[root@node1 ~]# grep '[a-Z0-9]' file.txt
I no linux.
my blog jugikhk ugh , kijp ball and chess!
I like nall!
my log is http://guh.kig.com
curl qq is http://qq.teten.com
not qq is 56565656
my god, i am not but HFJYJYGU!
gh fsh edfc f de

排除文件中含有空行或#号的行
# egrep -v '^$|#' file.txt

匹配符 说明
. 匹配除回车以外的任意字符
() 字符串分组
[] 定义字符类,匹配括号中的一个字符
[^] 表示否定括号中出现字符类中的字符,取反
\ 转义字符
| 或者

限定符 说明
* 某个字符之后加*号表示该字符不出现或多次出现
? 与星号相似,表示该字符出现一次或不出现
+ 与星号相似,表示其前面字符出现一次或多次,但必须出现一次
{n,m} 某个字符之后出现,表示该字符最少n次,最多m次
{m} 正好出现了m次

特殊字符 说明
[:alnum:] 匹配任意字母字符0-9 a-z A-Z
[:alpha:] 匹配人以字母,大写或小写
[:digit:] 数字 0-9
[:graph:] 非空字符(非空格控制字符)
[:lower:] 小写字符a-z
[:upper:] 大写字符A-Z
[:cntrl:] 控制字符
[:print:] 非空字符(包括空格)
[:punct:] 标点符号
[:blank:] 空格和TAB字符
[:xdigit:] 16进制数字
[:space:] 所有空白字符(新行,空格,制表符)
例子:egrep "^ro[[:alnum:]]" /etc/passwd

二:sed命令
1.特点及格式
sed 流编辑器,sed把处理的内容(文件)可以一直处理到文件末尾
sed 格式
命令 选项 (s)sed命令功能(g)修饰符 参数(文件)
sed -r 's#file#oldgirl#g'支持扩展正则 file.txt
-n 显示行数

2.sed核心功能(增删改查)
1)
s 替换
p 显示print
d 删除delete
cai 增加c/a/i

2)sed执行过程
找谁:你要找谁
干啥:增删改查
[root@node1 ~]# sed -n '2p' file.txt #-n(选项)显示行数 '2'指第二行 'p'显示出来(sed功能)
my blog jugikhk ugh , kijp ball and chess!

3)sed-查找p
查找格式
'2p' 指定行查找
'1,5p' 指定行号范围进行查找
'/lidao/p' 类似于grep过滤,//里面可以写正则
'/10:00/,/22:00/p' 表示范围的过滤
[root@node1 ~]# sed -n '1,4p' file.txt
I no linux.
my blog jugikhk ugh , kijp ball and chess!

I like nall!

4)实际生产环境日志
sed -n '/2021-11-19 10:/,/2021-11-19 16:36:22/p' app-shop-console.log 正式环境日志过滤范围

5)sed-删除(只是不显示,并不是真的删除)
d delete
查找格式
'2d' 指定行号进行查找
'1,5d' 指定行号范围进行查找
'/dfg/d' 类似于grep过滤,//里面可以写正则
'/10:00/,/11:00/d' 表示范围的过滤
1,/das/d 混合(了解)

删除文件中的空行和包含#号的行
[root@node1 ~]# sed -r '/^$|#/d' /etc/ssh/sshd_config
[root@node1 ~]# sed -nr '/^$|#/!p' /etc/ssh/sshd_config

6)sed-增加c/a/i
命令 含义
c replace替代这行的内容
a append追加,向指定的行或每一行追加内容(行后面)>>
i insert插入,向指定的行或每一行插入内容(行前面)
[root@node1 ~]# cat file.txt
I no linux.
my blog jugikhk ugh , kijp ball and chess!
I like nall!
my log is http://guh.kig.com

[root@node1 ~]# sed '3a996,ld996,ufo' file.txt
I no linux.
my blog jugikhk ugh , kijp ball and chess!
I like nall!
996,ld996,ufo
my log is http://guh.kig.com

[root@node1 ~]# sed '3i996,ld996,ufo' file.txt
I no linux.
my blog jugikhk ugh , kijp ball and chess!
996,ld996,ufo
I like nall!
my log is http://guh.kig.com

[root@node1 ~]# sed '3c996,ld996,ufo' file.txt
I no linux.
my blog jugikhk ugh , kijp ball and chess!
996,ld996,ufo
my log is http://guh.kig.com

案例:
向文件中追加多行内容
方法1:
[root@node1 ~]# cat >>config<<'EOF'
> userDNS NO
> GOUSPER YES
> permitrootlogin no
> GSSAPIAUTCATION no
> EOF
方法2:
[root@node1 ~]# sed '$a userDNS NO\GOUSPER YES\permitrootlogin no\GSSAPIAUTCATION no' config

7)sed-替换 s
s sub substitute 替换
替换格式
s###g
s///g
[root@node1 ~]# cat config
101 userDNS NO
102 GOUSPER YES
111 permitrootlogin no
123 GSSAPIAUTCATION no
[root@node1 ~]# sed 's/[0-9]//g' config 将开头的数字替换为空
userDNS NO
GOUSPER YES
permitrootlogin no
GSSAPIAUTCATION no

后向引用,反向引用
先保护,在使用
[root@node1 ~]# echo 123456 | sed -r 's/(34)/<\1>/g' #先用()将34保护起来,\1就等于小括号里面的内容(\1=34),然后加上<>将34套上
12<34>56

[root@node1 ~]# echo file_lidao | sed -r 's/(^.*)_(.*)/\2_\1/g' #相当于()是打标记,按照顺序重新排列第一个()是\1 第二个()是\2
lidao_file

或者这样:
[root@node1 ~]# echo file_lidao | sed -r 's/([a-z]+)_([a-z]+)/\2_\1/g'
lidao_file

截取IP
[root@node1 ~]# ip a s ens33 | sed -n '/inet/p' | sed -n '1p' | sed -r 's#(^.*t )(.*)(/.*)#\2#g'
截取数字
[root@node1 ~]# stat /etc/hosts | sed -rn '4s#(^.*\(0)(.*)(/-.*)#0\2#gp'


三:awk
1.特点与应用场景
awk
一门语言,类似C语言
过滤,计算,统计
过滤,日志

2.执行过程
awk -F, 'BEGIN{print "name"}{print $2}END{print "end of file"}' file
说明:
-F, 后面加分隔 如果有特殊符号/ * |等,就用''括起来 例子:awk -F '/'
BEGIN{print "name"} 这是开头添加
END{print "end of file"} 这是结尾添加
{print $2} 这是以...分隔,然后根据顺序选取位置
file 这是文件名

3.行与列
名词 awk叫法 说明
行 记录record 每一行默认是通过回车分割
列 字段,域field 每一列默认是通过空格分割
awk中行和列结束标记都是可以修改的

1)取行
awk
NR==1 取出某一行
NR>=1&&NR<=5 取出1到5行
符号 > < >= <= == !=
[root@node1 ~]# awk 'NR>=1&&NR<=5' file.txt 取出文件中1-5行内容
[root@node1 ~]# awk '/yy/' file.txt 取出文件中带'yy'这一行

2)取列
-F 指定分隔符 指定每一列结束标记(默认是空格,连续的空格,tab键)
$数字 取出某一列,注意:在awk中($+内容)只有一个意思 表示取出某一列
[root@node1 ~]# ll | awk '{print $1}'
$0 表示整行的内容
[root@node1 ~]# ll | awk 'NR==2 {print $0}' 取出第二行整行内容
[root@node1 ~]# ll | awk '{print $5,$9}' | column -t 取出第5到第9列,column -t:取出的数值对齐
[root@node1 ~]# awk -F ':' '{print $1,$NF}' /etc/passwd | column -t 取出第一列和最后一列
[root@node1 ~]# awk -F ':' -vOFS==: '{print $NF,$2,$3,$4,$5,$1}' /etc/passwd 将最后一行和第一行互换,并且输出分割符 ':',如果指定多个分隔符,则用"[]"双引号隔开
[root@node1 ~]# ip a s ens33 | awk -F "[ /]+" 'NR==3{print $3}' 指定多个分隔符,则用"[]"双引号隔开

常用的awk条件
内置变量 含义
NR Number of Record行号
NF Number of Field每行有多个字段(列) $NF表示最后一列
FS -F 指定分隔符,可一个可两个,默认为空格,支持扩展正则
OFS 输出字段分隔符

3)awk模式匹配
例子:awk -F "[ /]+" 'NR==3{print $3}'
awk -F "[ /]+" NR==3{print $3}
命令 选项 条件(动作),模式

[root@node1 ~]# sed -n '/20\/Nov\/2021:17/,/20\/Nov\/2021:17/p' access.log | awk '{print $1}' | sort | uniq -c | more | awk '$1>=100'

支持的模式:
比较符号:> < >= <= == !=
正则表达式
//支持扩展正则
awk可以精确到某一行,某一列中包含(不包含)的内容
~ 包含
!~ 不包含
[root@node1 ~]# awk -F ':' '$3~/^1/' /etc/passwd ':' '$3~/^1/' 以:为分隔符,第三列包含以1开头的行
[root@node1 ~]# awk -F: '$3~/^1/{print $1,$3,$NF}' /etc/passwd 找出第三列以2开头的行并显示出第一列,第三列和最后一列
[root@node1 ~]# awk -F: '$3~/^1|^2/{print $1,$3,$NF}' /etc/passwd 找出第三列以2开头或者以1开头的行并显示出第一列,第三列和最后一列
范围表达式

特殊条件:BEGIN和END
模式 含义 应用场景
BEGIN 里面的内容会在awk读物文件之前执行 1)进行简单统计,计算,不涉及读取文件
2)用来处理文件之前,添加表头
3)用来定义awk变量(很少用,可用-v实现)
END 里面的内容会在awk读物文件之后执行 1)awk进行统计,一般过程:先进行计算,最后END里面输出结果
2)awk使用数组,用来输出数组结果

END{}统计计算
统计方法
i++ i=i+1 计数,统计次数
sum=sum+??? sum+=? 求和,累加
注意:i,sum都是变量

#统计/etc/services 里面有多少空行
[root@node1 ~]# awk '/^$/{i++}END{print i}' /etc/services
#计算1+2...+100,求和
[root@node1 ~]# seq 100 | awk '{sum=sum+$1}END{print sum}'

4.awk数组
统计日志:类似于
统计次数:统计每个IP出现次数,统计每种状态码出现次数,统计系统中每个用户被攻击的次数,统计攻击者IP出现次数
累加求和:统计每个IP消耗的流量

shell数组 awk
形式 array[0]=shuzu0 array[1]=shuzu1 array[0]=shuzu0 array[1]=shuzu1
使用 echo $(array[0]) $(array[1]) print array[0] array[1]
批量输出数组内容 for i in ${array[*]}; for(i in array) awk数组专用循环,变量获取到的是数组的下标,数组内容是a[i]
do print a[i]
echo $i
done
例子:awk字母会被识别为变量,而数字不会,输出字母时要用双引号引起来
[root@node1 ~]# awk 'BEGIN{a[0]="shuzu";a[1]=123456;print a[0],a[1]}'
shuzu 123456
[root@node1 ~]# awk 'BEGIN{a[0]="shuzu";a[1]=123456;for (i in a) print a[i]}'
shuzu
123456

案例:
处理一下文件内容,将域名取出并根据域名计数排序处理
http://www.zhang.com/a/index.html
http://www.zhang.com/b/index.html
http://mp3.zhang.com/a/index.html
http://wfo.zhang.com/a/index.html
http://host.zhang.com/a/index.html
http://port.zhang.com/a/index.html
[root@node1 ~]# awk -F'[/.]+' '{print $2}' url.txt 以/.为分割,取出域名前缀
www
www
mp3
wfo
host
port
[root@node1 ~]# awk -F"[/.]+" '{a[$2]++}END{for(i in a)print i,a[i]}' url.txt | sort -rnk2 ++代表统计 sort -rnk2多次到少的排列
www 2
wfo 1
host 1
mp3 1
port 1
说明:a[]++你要统计什么 []里面就是什么(某一列)
统计access.log中ip出现次数 a[$1]++

[root@node1 ~]# awk '$9~/[0-9][0-9][0-9]/{array[$9]++}END{for(i in array)print i,array[i]}' access.log | sort -rnk2
说明:统计access.log的访问状态码,使用awk统计日志,尽量精确匹配


6)for循环
for i in 1 2 3
do
echo $i
done

shell编程c语言for循环 awk for循环
for ((i=1;i<=10;i++)) for (i=1;i<=10;i++) awk for用来循环每个字段
do print i
echo $i
done
案例:1+100
[root@node1 ~]# awk 'BEGIN{for(i=1;i<=100;i++)sum+=i;print sum}'

7)判断
shell if判断(单分支) awk if
if ["test" -eq 18];then if (条件)
echo biye print biye
fi

(双分支)
if ["test" -eq 18];then if (条件)
echo biye print biye
else else
echo shangxue print shangxue

判断磁盘空间
[root@node1 ~]# df -h | awk -F "[ %]+" 'NR>1{if($5>5)print $1,$5,$NF,"不足"}'     说明:NR>1$5>5比较数值,一般设为80
/dev/mapper/centos-root 8 / 不足
/dev/sda1 19 /boot 不足

[root@node1 ~]# echo kljuh kj | awk '{print length($1)}' 统计出字母数字,length($1)是awk函数,统计字符个数
[root@node1 ~]# echo kigu hj pljo ljojo lihj | awk -F ' ' '{for (i=1;i<=NF;i++) if(length($i)<3)print $i}'
hj
说明:统计字符个数小于3的字符串


参考视频:https://www.bilibili.com/video/BV1Kg411g7bC?p=41&spm_id_from=pageDriver

awk '{split($4,array,"[");if(array[2]>="23/Nov/2021:00:00:00" && array[2]<="23/Nov/2021:23:59:59" ){print $0}}' xxxxx.xxxx.cn.log | awk '{print $1}'| sort -n | uniq -c | sort -rn | egrep -v "xx.xx.xx.x|x.xx.xx.xxx|x.xx.xxx.xxx" | awk '$1>20000 {print $1 $2}'

 sed -n '/23\/Nov\/2021/,/23\/Nov\/2021/p' gateway.cs08.cn.log | awk '{print $1}' | sort | uniq -c | more | awk '$1>=20000' |  egrep -v "47.99.212.2|8.210.231.103|192.168.130.115" 

原文地址:https://www.cnblogs.com/zgqbky/p/15597379.html