SHELL脚本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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


以上是关于SHELL脚本的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本--变量(后附简单shell脚本案例)!

shell脚本翻译 急求

shell脚本书写方法

如何在shell脚本里调用另一个shell脚本

shell脚本获取参数&在线执行shell脚本

shell脚本中#是啥意思