SHELL脚本

简介:

Shell脚本


脚本:可以执行文件,运行后可以实现某种功能(命令的堆积,非交互)


在Linux系统中脚本的解释程序基本都在/bin/bash下面


在Linux系统中利用Bash的有点:可以使用快捷键、支持Tab键补齐、可以运用历史命令、制作别名、支持标准输入输出、(在Shell脚本中经常使用重定向和管道操作)


重定向:

           (1)重定向输入 :<------------将(<)后面的内容导入到前面的文件中

             (2)  重定向输出 :>-------覆盖重定向;>>---------追加重定向

                                       >:只收集前面命令的正确输出

                                       2>:只收集前面命令的错误输出

                                       &>:收集前面命令的错误与正确输出 





Shell中的一些数值运算:expr 2 + 2、X=100 expr $X + 10

                    X=66  echo $[X+5]

for循环的结构

for 变量名 in 值列表

do

    命令

done


While 判断条件

do

    命令

done


case 变量名 in

模式)

       命令;;

模式)

       命令;;

模式)

       命令;;

*)

    默认的命令;;

esac



子串截取的三种用法:

${x:起始位置:长度}

expr substr "$x" 起始位置 长度

echo $x | cut -b 起始位置-结束位置


字符串的替换

“/” 代表替换,vim中也是一样“/“代表替换

echo ${变量//旧的内容/新的内容

举列:x=1332551445

     echo ${x//5/*}

     echo ${x/335/***



变量“:” 截取,“/” 替换,“#" 掐头,”%“,去尾


字符串掐头去尾:

从左向右,最短匹配删除:${变量名#*关键词}

从左向右,最长匹配删除:${变量名##*关键词}

从右向左,最短匹配删除:${变量名%关键词*}

从右向左,最长匹配删除:${变量名%%关键词*}

 x=`head -1 /etc/passwd`

root:x:0:0:root:/root:/bin/bash

echo ${x##:}

echo ${x##*:}

echo ${x%%:*}


远程控制连接

i=192.168.4.207

expect << EOF

set timeout 300

spawn ssh $i  

expect yes     { send "yes\n"}

expect passwd { send "123456\n"}

expect #      { send "touch /qq\n"}

expect #      { sned "exit\n"}

EOF

(1)有时有yes提示,有时没有,删除known_hosts

(2)ssh比较慢,可以把ssh变快(修改配置文件),让expect多等会

(3)expect最后一条命令不执行


在shell脚本中一步步显示脚本的执行命令是:bash -x 脚本名字

seq 3----1、2、3

seq 2-6----2、3...6

echo -e -n "\033[33m \033[0m"-----“-e”代表扩展想要把这个颜色填充完整,“-n”表示不换行

3X------是字体颜色

4X------是背景颜色

X-------表示样式


正则表达式:使用一些特殊的符号来表达

“^”---------------表示开始

“$”---------------结尾,行尾

“[ ]”--------------表示集合中任意符号

列如[a-e]=[abcde],[abcdemz123]=[ma-ez1-3]


[^]------------表示对集合取反

“.”-----------任意单个字符

“*”-----------匹配前一个字符出现了任意次(0次或多次)

“.*”----------匹配所有

\{n,m\}-------匹配前一个字符出现了n到m次

\{n,\}--------匹配前一个字符出现了n次或更多

\{n\}---------匹配前一个字符出现了n次

grep -n-------显示行号

grep -i-------不去分大小写

grep -c-------统计过滤出有几行

grep -v-------表示取反


扩展正则:优化基本正则,添加新的

{n,m}、{n,}、{n}

“?”------0或1次

“+“------1或大于1次 

“( )”------表示整体,列如:(abc){8}---------表示abc出现了8次

列如:

vim brace.txt

ab def ghi abdr

dedef abab ghighi

abcab CD-ROM

TARENA IT GROUP

cdcd ababab

Hello abababab World

[1]输出ababab的行,即“ab”连续出现3次

egrep '(ab)'{3} brace.txt

[2]输出ab,连续出现2~4次

egrep '(ab){2,4}' brace.txt

[3]输出ab,至少连续出现3次

egrep '(ab){3,}' brace.txt

元字符[ ]-------匹配范围内的单个字符

输出包括abc、abd的行,即前两个字符为“ab”,第三个字符只要是c、d中的一个就符合条件:

egrep 'ab[cd]' brace.txt

输出包括大写字母的行,使用[A-Z]匹配连续范围:

egrep '[A-Z]' brace.txt

输出包括“非空格也非小写字母”的其他字符的行,本例中大写字母和 – 符合要求:

egrep '[^ a-zA-Z]' brace.txt


“|”--------表示或者关系,列如:(test|taste)

基本正则:兼容性强,使用麻烦

扩展正则:兼容性差,使用简单,有些软件不支持扩展正则

egrep---------支持扩展正则

\b------------表示单词边界


sed:文本编辑器,非交互(增、删、改、查)

sed    [选项]    '条件指令'      文件

sed:逐行处理文件,流水处理

指令:p--打印

     d--删除

     s--替换,s/旧的/新的/--------------注意:替换符号可以是任意其他符号

     a--追加

     i--插入

     c--替换,整行替换

sed -n '|op' /etc/passwd-------(-n)屏蔽sed默认输出功能

    -r---支持扩展正则

sed使用的一些条件:(1):行号: sed -n '3p' /etc/passwd----把第三行打印出来

                          sed -n '3,5p' /etc/passwd---打印3、4、5行

                               (2):/正则/:sed -n '/root/p' /etc/passwd---把包含root的都打印出来

sed -n '/bash$/s#:.*##p' /etc/passwd-----把以bash结尾的行中的用户找出来,s替换

awk -F: '/bash$/{print $1}' /etc/passwd


awk:数据过滤,统计处理(行,列),也是逐行处理

awk  [选项]  '条件{指令}'   文件

df | awk '/\/$/{print $4}'---------df:查看硬盘

free | awk '/Mem/{print $4}'------free:查看内存

选项:-F----指定分隔符(默认是空格或tab)

awk -F: '{print $1}' /etc/passwd

awk的一些内置变量:$1,$2,$3(表示某一列)、NF(当前行有多少列)、NR(当前行号)

awk打印常量(常量必须要使用引号)

列如:awk '{print "nh","root","nb"}' /etc/passwd

          awk -F: '{print "用户是:",$1}' /etc/passwd

awk的完整命令:

            awk [选项] 'BEGIN{}  条件{ }   END{}' 条件--------所有指令必须放在{ }

            BEGIN{}:指令在读取文件内容前执行1次

                      条件{ }:指令在读取文件中执行n次

            END{}:指令在读取文件后执行1次

awk -F: 'BEDIN{print "用户名"  "UID" "解释器"}  {print $1,$2,$3}  {print "总用户量" NR}' /etc/passwd

awk的条件:

                (1)正则(也可支持模糊匹配)

                 列如:一整行中包含root即可

         awk -F: '/root/{print $3}' /etc/passwd

                          在一列中包含root即可

         awk -F: '$1~/root/{print $3}' /etc/passwd

                (2)数字和字符比较:==;!=;>;>=;<;<=

         awk -F: '$3>=1000{print $1}' /etc/passwd

         awk -F: '$1=="root"' /etc/passwd

                (3)逻辑:&&;||

         awk -F: '$3>10&&$<20' /etc/passwd

         awk -F: '$3==0||$3==1000' /etc/passwd

(4)运算

awk 'BEGIN{x=5;y=5;print x+y}'

awk 'BEGIN{pirnt 2.5*5}'

awk 'BEGIN{x=5;print x+y}'

统计普通用户有几个,系统用户几个

awk -F: '{if($3<1000){x++}else{y++}} END{print x,y}' /etc/passwd

列子:

    vim a.txt

    root haha root

    hehe root

    ni   hao  ma  root

awk '{i=1;while(i<=NF){if($i=="root"){x++};i++}}END{print x}' a.txt




sed -i '/192.168.4.5/d' ~/.ssh/known_hosts



     本文转自hj_1314wgn 51CTO博客,原文链接:http://blog.51cto.com/13513556/2051526,如需转载请自行联系原作者






相关文章
|
22天前
|
弹性计算 Shell Perl
ecs服务器shell常用脚本练习(二)
【4月更文挑战第1天】shell代码训练(二)
104 1
|
24天前
|
Java Shell
SpringBoot启动脚本Shell
SpringBoot启动脚本Shell
16 0
|
2天前
|
Java 关系型数据库 MySQL
Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
【4月更文挑战第12天】Elasticsearch【问题记录 01】启动服务&停止服务的2类方法【及 java.nio.file.AccessDeniedException: xx/pid 问题解决】(含shell脚本文件)
23 3
|
5天前
|
运维 监控 Shell
利用Shell脚本编写局域网监控软件:实时监测主机连接情况
本文介绍了如何使用Shell脚本创建一个局域网监控工具,以实时检查主机连接状态。脚本包括扫描IP地址范围检测主机可达性及使用`netstat`监控ESTABLISHED连接。此外,还展示了如何每60秒将连接数数据自动提交到指定网站API,以便实时跟踪网络活动。这个自动化监控系统有助于提升网络安全性和故障排查效率。
24 0
|
6天前
|
Shell
Shell脚本之流程控制语句
Shell脚本之流程控制语句
|
7天前
|
JSON 运维 监控
训练shell常用脚本练习(三)
【4月更文挑战第14天】shell代码训练(三)
23 1
|
11天前
|
存储 弹性计算 Shell
ecs服务器shell常用脚本练习(十)
【4月更文挑战第11天】shell代码训练(十)
140 0
|
11天前
|
弹性计算 Shell Go
ecs服务器shell常用脚本练习(九)
【4月更文挑战第10天】shell代码训练(八)
133 0
|
15天前
|
弹性计算 Shell Linux
ecs服务器shell常用脚本练习(六)
【4月更文挑战第4天】shell代码训练(六)
108 0
|
20天前
|
弹性计算 Shell 应用服务中间件
ecs服务器shell常用脚本练习(四)
【4月更文挑战第4天】shell代码训练(四)
96 0