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脚本的主要内容,如果未能解决你的问题,请参考以下文章