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

news/2024/10/15 14:06:05/

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-23echo $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%m01180201[keysystem@localhost ~]$ date +%Y%m0120180201#上个月最后一天[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%d20190131

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))doecho "${array_test[i]}"done



 









 


http://www.ppmy.cn/news/47065.html

相关文章

【WebRTC技术专题】更进一步,核心组件RTP/RTCP数据传输协议 (3)

前言介绍 RTP/RTCP协议是流媒体通信的基石。 RTP协议定义流媒体数据在互联网上传输的数据包格式RTCP协议则负责可靠传输、流量控制和拥塞控制等服务质量保证。 在WebRTC项目中&#xff0c;RTP/RTCP模块作为传输模块的一部分 发送端采集到的媒体数据进行进行封包&#xff0c;…

C#FileInfo和File 类

C#中的FileInfo和File类都提供了许多方法和属性来操作文件&#xff0c;但它们的使用方法有所不同。下面是FileInfo和File类常用的方法举例说明&#xff1a; FileInfo类方法&#xff1a; CreateText&#xff1a;创建或打开一个文本文件&#xff0c;并返回一个StreamWriter对象…

MybatisPlus

目录 MybatisPlus入门案例步骤代码实现数据库及表MybatisPlus的Maven坐标配置数据库创建实体类User Mapper接口UserMapper 引导类测试类 简介使用MP做标准数据层开发标准CRUD新增删除修改根据id查询查询所有分页查询步骤1:调用方法传入参数获取返回值步骤2:设置分页拦截器 DQL编…

2023/4/18往日题目总结

搜索路径状态记录 1076. 迷宫问题 - AcWing题库 //以最简单的迷宫问题为例&#xff0c;如何记录走迷宫的路径&#xff0c;其实只需要记录一下状态即可 //也就是记录一下这个点是从哪个点来的&#xff0c;最后从终点开始输出即可&#xff08;此时输出的是逆序&#xff09; #in…

flowable流程图绘制工具flowable-ui的安装和使用

一.简介 记录绘制flowable图的过程。 二.下载安装 1.下载 我这边是windows的&#xff0c;下载的版本是6.8.0&#xff0c;zip那个就可以&#xff0c;tar.gz是linux的 下载地址&#xff1a;https://github.com/flowable/flowable-engine/releases/tag/flowable-6.8.0 下载截…

pyecharts从入门到精通-地图专题Map-带时间轴与网格的复杂绘图

文章目录 参考安装与查看pyecharts地图实现-Geo导入依赖生成数据集生成2013-2018年的各个省份GDP数据生成2013-2018年的时间列表生成2013-2018年的总GDP设置visulmap的最大最小值范围 生成2013年的网格组合图提取2013年的数据测试绘制map地图绘制折线图line绘制折线图bar绘制折…

ChatGPT/大模型+零代码,给中小企业带来哪些机会?

ChatGPT让2023年成了AI之年。正如iPhone在2007年开启了智能手机时代&#xff0c;我们现在正在进入人工智能时代。 新形势下&#xff0c;零代码应如何借势发力&#xff1f;伙伴云“AI零代码”给出了答案。 作为零代码领域的头部平台&#xff0c;伙伴云全量发布【AI零代码应用搭…

第四十章 文本渲染总结(未完结)

OpenGL本身没有包含任何的文本处理能力,需要自己定义一套全新的系统让OpenGL绘制文本到屏幕上,但是文本字符没有图元。 可以通过GL_LINES来绘制自行,创建文本的3D网格,或者是将3D环境中字符纹理渲染到2D四边形上。 常用的方法是:将字符纹理绘制到四边形上。 经典文本渲染…