ubuntu(20.04)-shell脚本(2)echo-date-awk-sed-iptables-shell变量数组

1.echo

语法:echo [-ne][字符串]

补充说明:
1、echo会将输入的字符串送往标准输出。
2、输出的字符串间以空白字符隔开,并在最后加上换行号。

OPTIONS:
-n	不要在最后自动换行
-e	若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:

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

\c	最后不加上换行符号;
\f	换行但光标仍旧停留在原来的位置;
\r	光标移至行首,但不换行;
\v	与\f相同;
\		插入\字符;
\0nnn	打印nnn(八进制)所代表的ASCII字符;  备注:数字0  不要理解成字母o
\xNN  打印NN(十六进制)所代表的ASCII字符;

-–help	显示帮助
-–version显示版本信息


2.shell 定义变量+使用变量
 

#1.定义变量
myname="tang"
var=123

#2.使用变量 前+$ 后面加不加{} 都可以
echo $myname
echo ${var}

#3.删除变量
unset myname


#4.变量类型 局部+环境+shell


#5.拼接字符 单引号+双引号
myname="tang"
greeting_1="start,"$nyname",end!"
greeting_2="start,$myname,end!"

greeting_3='start,'$nyname',end!'
greeting_4='start,$myname,end!'

echo greeting_1 greeting_2 greeting_3 greeting_4



#6.获取字符长度
string="abcd"
echo ${#string}  ${#string[0]}


#7.提取子字符串

string=“abcded”
echo ${string:1:4}


#8.查找子字符串  c  反引号
string="abcded"
echo `expr index "$string" ic`




3.date

#date [参数] [+格式] 

1.命令参数:
必要参数:
%H 小时(以00-23来表示)。
%I 小时(以00-12来表示)。
%K 小时(以0-23来表示)。
%l 小时(以0-12来表示)。
%M 分钟(以00-59来表示)。
%P am或pm。
%s 总秒数(起算时间为1970-01-01 00:00:00 UTC)。UTC(coordinated Universal Time协调时间,又称世界统一时间)
%S 秒(以本地惯用法来表示)
%T 时间(含时分秒,小时以24小时制来表示)。
%X 时间(以本地的惯用法来表示)
%Z 市区(CST China Standard Time,中国标准时间)
%a 星期英文名的缩写。
%A 星期英文名的完整名称。
%b 月份英文名的缩写。
%B 月份英文名的完整名称。
%c 日期与时间。只输入date指令也会显示同样的结果。
%r 时间(含时分秒,小时以12小时AM/PM来表示)。
%d 日期(以0-31来表示)。
%D 日期(含年月日)。
%x 日期(以本地的惯用法来表示)
%j 该年中的第几天。
%m 月份(以0-12来表示)。
%U 该年中的周数。
%w 该周的天数,0代表周日,1代表周一,依次类推。
%y 年份(以00-99来表示)。
%Y 年份(以四位数来表示)。
%n 在显示时,插入新的一行。
%t 在显示时,插入tab。
MM 月份(必要)
DD 日期(必要)
hh 小时(必要)
mm 分钟(必要)
ss 秒(选择性)

2.选择参数:
   -d<字符串> 显示字符串所指的日期与时间。字符串前后必须加上双引号。
   -s<字符串> 根据字符串来设置日期与时间。字符串前后必须加上双引号。
   -u 显示GMT(Greenwich Mean Time,格林威治时间)。
   –help 在线帮助。
   –version 显示版本信息。

3.设定
    date -s                //设置当前时间,只有root权限才能设置,其他只能查看。
    date -s 20111213       //设置成20111213,这样会把具体时间设置成空00:00:00。
    date -s 01:01:01     //设置具体时间,不会对日期做更改。
    date -s “01:01:01 2011-12-13” //这样可以设置全部时间。
    date -s “2011-12-13 01:01:01” //这样可以设置全部时间。
    date -s “20111213 01:01:01” //这样可以设置全部时间
    date -s “01:01:01 20111213” //这样可以设置全部时间


4.加减

   date +%Y%m%d                       //显示前天年月日
   date +%Y%m%d --date="-1 day"      //显示前一天的日期
   date +%Y%m%d --date="+1 day"      //显示后一天的日期
   date +%Y%m%d --date="+/-1 month"  //显示下/上一个月的日期
   date +%Y%m%d --date="+/-1 year"   //显示下/上一年的日期


 



#1.打印 今天日期
    
    [keysystem@localhost ~]$ date -d 'now'     #输出:Fri Feb  2 09:29:28 CST 2018
    [keysystem@localhost ~]$ date +%Y%m%d      #输出: 20180202
    [keysystem@localhost ~]$ date +%Y%m%d%H%M%S#输出:20180202101334
    [keysystem@localhost ~]$ ORIGINAL="Jul 1 21:29 "
    [keysystem@localhost ~]$ date -d "$ORIGINAL"  "+%G-%m-%d %H:%M:%S" 
    #2020-07-01 21:29:00
    [keysystem@localhost ~]$ date +%b/%d/%G -d "2020-01-01"
    Jan/01/2020

#2. 获取年月日变量
    date -d today    +%Y%m%d%H%M   # 获取今天的年月日时分   
    date -d next-day +%Y%m%d       # 获取明天的日期
    date -d last-day +%Y%m%d       # 获取昨天的日期
    date -d last-month +%Y%m       # 获取上个月的年和月
    date -d next-month +%Y%m       # 获取下个月的年和月
    date -d next-year  +%Y         # 获取明年的年份
    date +%F                     # “2006-03-08” 
    date +%T                     # “10:06:16”
    date +%Y                     # 得到年 2006

#3. 获取时间戳



#4. 算间隔天数

#4.1 两日期相减
    expr '(' $(date  -d "2020-01-31" +%s) - $(date  -d "2020-01-01" +%s ) ')' / 86400 #
    30
#4.2 增加36小时
    a=`date +%Y-%m-%d`
    b=`date +%Y-%m-%d -d "$a +36 hours"`
    echo $a
    #2020-10-23
    echo $b
    #2020-10-24




#5.获取间隔天数后的值
    [keysystem@localhost ~]$ date -d 'now'    #显示当前时间
    Fri Feb  2 09:29:28 CST 2018
    [keysystem@localhost ~]$ 
    [keysystem@localhost ~]$ date -d '2 days ago'    #显示2天前的时间
    Wed Jan 31 09:29:40 CST 2018
    [keysystem@localhost ~]$ date -d '3 month 1 day'    #显示3月零1天以后的时间 
    Thu May  3 09:30:16 CST 2018
    [keysystem@localhost ~]$ date -d '25 Dec' +%j    #显示12月25日在当年的哪一天
    359
    [keysystem@localhost ~]$ date -d '30 second ago'    #显示30秒前的时间
    Fri Feb  2 09:41:03 CST 2018
    [keysystem@localhost ~]$ date -d "+3 day"
    Mon Feb  5 09:45:52 CST 2018
    [keysystem@localhost ~]$ date -d "-3 day" 
    Tue Jan 30 09:46:04 CST 2018
    [keysystem@localhost ~]$ date -d "-3 month"
    Thu Nov  2 09:46:16 CST 2017
    [keysystem@localhost ~]$ date -d "+3 month" 
    Wed May  2 09:46:24 CST 2018
    [keysystem@localhost ~]$ date -d "+3 year" 
    Tue Feb  2 09:46:35 CST 2021
    [keysystem@localhost ~]$ date -d "-3 year" 
    Mon Feb  2 09:46:40 CST 2015
    [keysystem@localhost ~]$ date -d "-3 hour" 
    Fri Feb  2 06:46:59 CST 2018
    [keysystem@localhost ~]$ date -d "+3 hour" 
    Fri Feb  2 12:47:02 CST 2018
    [keysystem@localhost ~]$ date -d "+3 minute"
    Fri Feb  2 09:50:09 CST 2018
    [keysystem@localhost ~]$ date -d "-3 minute" 
    Fri Feb  2 09:44:12 CST 2018
    [keysystem@localhost ~]$ date -d "-3 second"
    Fri Feb  2 09:47:21 CST 2018
    [keysystem@localhost ~]$ date -d "+3 second" 
    Fri Feb  2 09:47:31 CST 2018


#6.
    #显示本月的第一天
    [keysystem@localhost ~]$ date -d `date +%y%m01`
    Thu Feb  1 00:00:00 CST 2018
    [keysystem@localhost ~]$ date +%y%m01
    180201
    [keysystem@localhost ~]$ date +%Y%m01
    20180201
    #上个月最后一天
    [keysystem@localhost ~]$ date -d `date +%y%m01`"-1 day"
    Wed Jan 31 00:00:00 CST 2018
    #4个月前的最后一天
    [keysystem@localhost ~]$ date -d `date -d "-3 month" +%y%m01`"-1 day"
    Tue Oct 31 00:00:00 CST 2017
    #11个月后的第一天
    [keysystem@localhost ~]$ date -d `date -d "+12 month" +%y%m01`"-1 day"
    Thu Jan 31 00:00:00 CST 2019
    #11个月后的最后一天
    [keysystem@localhost ~]$ date -d `date -d "+12 month" +%y%m01`"-1 day" +%Y%m%d
    20190131



4.awk

awk 比较倾向于将一行分成多个字段然后再进行处理。
   

4.1 语法

awk '条件1 {动作 1} 条件 2 {动作 2} …' 文件名

# awk 检测到完整的''才结束
#1.输出第2列和第6列的内容
   awk '{printf $2 "\t" $6 "\n"}' student.txt

#2.begin
#这里定义了两个动作
#第一个动作使用BEGIN条件,所以会在读入文件数据前打印"这是一张成绩单"(只会执行一次)
#第二个动作会打印文件的第二个字段和第六个字段
   awk 'BEGIN{printf "This is a transcript\n"}
             {printf $2 "\t" $6 "\n"}' student.txt

#3.end
#END 后的动作只在程序结束时执行一次
awk 'END{printf "The End \n"}
     {printf $2 "\t" $6 "\n"}' student.txt

#4.关系运算
   #使用cat输出文件内容,用grep取反包含"Name"的行
   #判断第6个字段(平均成绩)大于等于87分的行,如果判断式成立,则打印第2列(学员名)
cat student.txt | grep -v Name |awk'$6 >= 87 {printf $2'\n"}'
   

4.2 awk 的分隔符

awk的默认分隔符是空格和制表符,上面的例子中,若希望把逗号去掉,则可以使用 -F 参数来指定分隔符,命令如下:

awk -F ':|,' '{print $2, $4, $6}' log

这里指定冒号(:)和逗号(,)同时作为分隔符。


6.iptables
   

     6.1防火墙

          位于Linux内核中的包括过滤功能体系。
          主要是网络层,针对IP数据包,体现在对包内的IP地址、端口等信息的处理上。
          

默认包括4个规则表

  • raw表:确定是否对该数据包进行状态跟踪
  • mangle表:为数据包设置标记
  • nat表:修改数据包中的源、目标lP地址或端口
  • filter表:确定是否放行该数据包(过滤)

规则链
规则的作用:对数据包进行过滤或处理
链的作用:容纳各种防火墙规则
链的分类依据:处理数据包的不同时机
默认包括5种规则链

  • INPUT:处理入站数据包
  • OUTPUT:处理出站数据包
  • FORWARD:处理转发数据包
  • POSTROUTING链:在进行路由选择后处理数据包
  • PREROUTING链:在进行路由选择前处理数据包

         

规则表之间的顺序
raw→mangle→nat→filter

规则链之间的顺序
入站:PREROUTING→INPUT
出站:OUTPUT→POSTROUTING
转发:PREROUTING→FORWARD→POSTROUTING

规则链内的匹配顺序
按顺序依次检查,匹配即停止(LOG策略例外)
若找不到相匹配的规则,则按该链的默认策略处理

     6.2编写防火墙规则
 

6.2.1 安装

CentOS7默认使用firewalld防火墙,若想使用iptables防火墙,必须先关闭firewalld防火墙
关闭firewalld防火墙

1
2

[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# systemctl disable firewalld.service

安装iptables防火墙

1

[root@localhost ~]# yum -y install iptables iptables-services   #安装工具 安装服务

设置iptables开机启动

1
2

[root@localhost ~]# systemctl start iptables.service
[root@localhost ~]# systemctl enable iptables.service


   6.2.2基本语法
     

语法构成

iptables [ -t 表名 ] 选项 [ 链名 ] [ 条件 ] [ -j 控制类型 ]

:设置其他主机无法ping通本机,阻止ping测试
iptables -t filter -I INPUT -p icmp -j REJECT

选项
-A:在指定链的末尾添加(–append)一条新的规则。
-D:删除(–delete)指定链中的某一条规则,可指定规则序号或具体内容。
-l :在指定链中插入(–insert)一条新的规则,未指定序号时默认作为第一条规则。
-R:修改、替换(–replace)指定链中的某一条规则,可指定规则序号或具体内容。
-L:列出(–list)指定链中所有的规则,若未指定链名,则列出表中的所有链.
-F:清空(–flush)指定链中的所有规则,若未指定链名,则清空表中的所有链。
-P:设置指定链的默认策略(–policy) .
-n:使用数字形式(–numeric)显示输出结果,如显示IP地址而不是主机名。
-v:查看规则列表时显示详细(–verbose)的信息。
-h:查看命令帮助信息(–help) .
–line-numbers:查看规则列表时,同时显示规则在链中的顺序号。

数据包的常见控制类型

ACCEPT:允许通过
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过,必要时会给出提示
LOG:记录日志信息,然后传给下一条规则继续匹配

添加、替换、查看、删除规则,设置默认策略

1、添加新的规则
-A:在链的末尾追加一条规则
-I:在链的开头(或指定序号)插入一条规则

1
2
3
4
5
6
7

[root@localhost ~]# iptables -t filter -A INPUT -j REJECT      #在默认表插入拒绝通过规则,Xshell断开
[root@localhost ~]# iptables -t filter -L   #查看所有规则
[root@localhost ~]# iptables -t filter -I INPUT -p tcp -- dport 22 -j ACCEPT   #插入默认第一条规则,端口22允许通过
[root@localhost ~]# iptables -t filter -L   #查看所有规则
#Xshell可连接
[root@localhost ~]# iptables -I INPUT -p udp j ACCEPT
[root@localhost ~]# iptables -I INPUT 2 -p icmp j ACCEPT   #-p用来指定协议

2、替换规则
-R:修改、替换(–replace)指定链中的某一条规则,可指定规则序号或具体内容。

1
2
3

[root@localhost ~]# iptables --line-numbers -L INPUT  #查看默认表以数字序列号显示所有规则
[root@localhost ~]# iptables -t filter -R INPUT 2 -p icmp -j ACCEPT   #更换第二行为允许通行
[root@localhost ~]# iptables --line-numbers -L INPUT  #查看默认表以数字序列号显示所有规则

3、查看规则列表
-L :列出所有的规则条目
-n:以数字形式显示地址、端口等信息
-v:以更详细的方式显示规则信息
–line-number:查看规则时,显示规则的序号


 

4、删除、清空规则
-D:删除链内指定序号(或内容)的一条规则
-F:清空所有的规则


 

5、设置默认策略
-P:为指定的链设置默认规则

规则的匹配条件

1.常见的通用匹配条件

协议匹配:-p 协议名
地址匹配:-s源地址、-d目的地址
接口匹配:-i入站匹配、-o出站网卡


 

2.常见的隐含匹配条件

端口匹配
–sport源端口、–dport目的端口
连续的端口号用":“分隔
不连续的端口用”:"分隔
-m multiport --sports 源端口列表 # “,” 分隔开
-m multiport --dports 目的端口列表

1
2
3
4
5

[root@localhost ~]# iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT   #接收数据
[root@localhost ~]# iptables -A FORWARD -d 192.168.4.0/24 -p udp --sport 53 -j ACCEPT   #返回结果
[root@localhost ~]# iptables -A INPUT -p tcp --dport 20:21  -j  ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 24500:24600  -j  ACCEPT
[root@localhost ~]#iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT



 
ICMP类型匹配:–icmp-type ICMP类型
ICMP类型的代码表示:echo-request 代码为8;echo-reply 代码为0;destination-unreacha 代码为3

1
2
3
4

[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p icmp -j DROP

3.常用的显示匹配条件

IP范围匹配
编写规则时使用 -m iprange --src-range IP范围 #源地址
        -m iprange --dst-range IP范围 #目标地址
的形式,用来检查数据包的源地址,目标地址。
IP地址范围的表示方式:起始地址-结束地址
示例:

1

[root@localhost ~#iptables -A  FORWARD  -p  tcp -m  iprange  --src-range 192.168.4.100-192.168.4.2200 -j ACCEPT

MAC地址匹配
编写规则时使用 -m mac --mac-source MAC地址的形式。用来检查数据包的MAC地址
示例:

1

[root@localhost ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f -j DROP

状态匹配
编写规则时使用 -m state --state 连接状态的形式,基于Iptables的状态跟踪机制来检查数据包的连接状态。
常见连接状态:NEW 与任何连接无关的
       ESTABLISHED 响应请求或者已建立连接的
       RELATED 与已有连接有相关性的,如FTP数据连接
示例:

1

[root@localhost ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP

7.shell 数组的定义和使用
   

   7.1定义
    

#1.方法1
array_name=(值1 值2 值3 ... 值n)

#2.
array_name[0]=值1
array_name[1]=值2
array_name[2]=值3
...
array_name[n-1]=值n


   7.2 读取
 

#指定
${array_name[index]}
#所有
${array_name[*]}
${array_name[@]}


   7.3 长度
   

${#array_name[*]}
${#array_name[@]}
#!/bin/bash

# 定义数组
array_test=(A "B" C)

# 输出数组的所有元素
echo "【方式1】数组的元素为:${array_test[*]}"
echo "【方式2】数组的元素为:${array_test[@]}"

echo -e "【方式3】输出数组的所有元素:\n元素1:${array_test[0]}, 元素2:${array_test[1]}, 元素3:${array_test[2]}"

echo "【方式4】列出数组的所有元素:"
# 循环输出数组所有元素
for((i=0;i<=${#array_test[*]-1};i=i+1))
    do
        echo "${array_test[i]}"
    done



 









 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值