shell编程
一、正则表达式
1、概述
1)正则表达式用来在文件中匹配符合条件的字符串。(grep、awk、sed)
2)通配符用来匹配符合条件的文件名。(locate、find、cp)
2、基础正则表达式
元字符 | 作用 |
* | 前一个字符匹配0次或任意多次。 |
. | 匹配除了换行符外任意一个字符。 |
^ | 匹配行首。例如:^hello会匹配以hello开头的行。 |
$ | 匹配行尾。例如:hello$会匹配以hello结尾的行。 |
[ ] | 匹配中括号中指定的任意一个字符,只匹配一个字符。 例如:[aoieu]匹配任意一个元音字母。[0-9]匹配任意一个数字,[a-z][0-9]匹配小写字和一位数字构成的两位字符。 |
[^] | 匹配除中括号的字符外的任意一个字符。例如:[^0-9]匹配任意一位非数字字符,[^a-z]表示任意一位非小写字符。 |
\ | 转义符。用于取消特殊符号的含义取消。 |
\{n\} | 表示其前面的字符恰好出现n次。[0-9]\{4\}匹配4为数字,[1][3-8][0-9]\{9\}匹配手机号码。 |
\{n,\} | 表示其前面的字符出现不小于n次。例如:[0-9]\{2,\}表示两位及以上的数字。 |
\{n,m\} | 表示其前面的字符至少出现n次,最多出现m次。例如:[a-z]\{6,8\} 匹配6到8位的小写字母。 |
说明:在~./bashrc文件中建立grep别名:
[root@localhost ~]# vi /root/.bashrc
alias grep=’grep –color=auto’
3、扩展正则表达式
扩展元字符 | 作用 |
+ | 前一个字符匹配1次或任意多次。 |
? | 前一个字符匹配0次或1次。 |
| | 匹配两个或多个分支选择。 |
() | 匹配其整体为一个字符。 |
二、字符截取和替换命令
1、cut列提取命令(不推荐用于有空格的提取)
[root@localhost ~]# cut [选项] 文件名
-f 列号 #提取第几列
-d 分隔符 #指定分隔符分割列
-c 字符范围 #指定字符串范围来进行字段提取。
例:[root@localhost ~]# cut –c 8- student.txt
2、awk编程
1.概述(略)
2.printf格式化输出
[root@localhost ~]# printf‘输出类型输出格式’ 输出内容
输出类型:
%s 输出字符串。
%ni 输出整数。n是数字指代输出几个数字。
%n.mf 输出浮点数。m和n是数字,指代输出的整数位数和小数位数。如:%8.2f代表共输出8位数,其中2位小数,6位整数。
\a 支持转义符。
例:[root@localhost ~]# printf‘%s’$(cat student.txt)
3.awk的基本使用
[root@localhost ~]# awk ‘条件1{动作1} 条件2{动作2} ……’文件名
条件(pattern):
说明:一般使用关系表达式作为条件。
x > 10 判断变量x是否大于10
x == y 判断变量x是否等于变量y
A ~ B 判断字符串A是否包含能匹配B表达式的子字符串
A !~ B 判断字符串A是否不包含能匹配B表达式的子字符串
动作(action):
1)格式化输出
2)流程控制语句
4.awk的条件
条件的类型 | 条件 | 说明 |
awk保留字 | BEGIN | 在awk程序一开始时。尚未读取任何数据之前执行。BEGIN后的动作只在程序开始执行一次。 |
END | 在awk程序处理完所有数据,即将结束时执行。END后的动作只在程序结束时执行一次。 | |
关系运算符 | > | 大于 |
< | 小于 | |
>= | 大于等于 | |
<= | 小于等于 | |
== | 等于(判断式) | |
!= | 不等于 | |
A~B | 判断字符串A是否包含能匹配B表达式的子字符串 | |
A!~B | 判断字符串A是否不包含能匹配B表达式的子字符串 | |
正则表达式 | /正则/ | 如果在“//”中可以写入字符,也可以支持正则表达式 |
例:[root@localhost ~]# awk ‘BEGIN{ FS=”:” } {print $2 ,$6 }’student.txt
[root@localhost ~]# awk ‘$6 >=89 {print $2 }’student.txt
[root@localhost ~]# awk ‘$2 ~ /Yz/ {print $6 }’student.txt
[root@localhost ~]# awk ‘/Yuyuz/ {print $6 }’student.txt
5.awk内置变量
awk内置变量 | 作用 |
$0 | 代表目前awk所读入的整行数据。$0就代表当前读入行的整行数据。 |
$n | 代表目前读入行的第n个字段。 |
NF | 当前行拥有的字段(列)总数。 |
NR | 当前awk所处理的行,是总数据的第几行。 |
FS | 用户定义分隔符。 |
6.awk流程控制
1)awk函数
function 函数名 (参数列表){
函数体
}
7.awk中调用脚本
[root@localhost ~]# awk –f pass.awk /etc/passwd
-f 使用该选项来调用脚本
3、sed命令
[root@localhost ~]# sed [选项] ‘动作’文件名
选项:
-n 输出处理的行
-f 脚本文件名
-i 修改文件数据
-e 多条sed命令处理输入的数据
-r 支持扩展正则
动作:
a 追加
c 替换
i 插入
d 删除
p 打印
s 字符串替换
说明:sed不会直接改变文件的内容。除非加“-i”选项。
例:[root@localhost ~]# sed ‘2p’ student.txt
[root@localhost ~]# cat student.txt | sed ‘2c No search person’
三、字符处理命令
1、排序命令sort
[root@localhost ~]# sort [选项] 文件名
-f #忽略大小写
-b #忽略每行前面的空白部分
-n #以数值型进行排序
-r #反向排序
-u #删除重复行
-t #指定分割符,默认分隔符是制表符
-k n[,m] #按照指定的字段范围排序
例:[root@localhost ~]# cat /etc/passwd | sort –n -t “:” –k 3,3
2、消除重复行命令uniq
uniq [选项] 文件名
-i #忽略大小写
3、统计命令wc
[root@localhost ~]# wc -lwc
-l #只统计行数
-w #只统计单词数
-c #只统计字符数
四、条件判断
1、按照文件类型进行判断
测试选项 | 作用 |
-b文件 | 判断该文件是否存在。(是设备文件为真) |
-c文件 | 判断该文件是否存在。(是字符设备文件为真) |
-d文件 | 判断该文件是否存在。(是目录文件为真) |
-e文件 | 判断该文件是否存在。(存在为真) |
-f文件 | 判断该文件是否存在。(是普通文件为真) |
-L文件 | 判断该文件是否存在。(是符号连接文件为真) |
-p文件 | 判断该文件是否存在。(是管道文件为真) |
-s文件 | 判断该文件是否存在。(非空为真) |
-S文件 | 判断该文件是否存在。(是套接字为真) |
例:[ -e /root/sh/ ]
[root@localhost ~]# echo $?
[root@localhost ~]#date=$(date +%y%m%d)
[root@localhost ~]#date=$(date +%F)
[root@localhost ~]# [ -d /root/test ] && echo “yes”|| echo “no”
2、按照文件权限进行判断
测试选项 | 作用 |
-r文件 | 判断该文件是否存在。(有读权限为真) |
-w文件 | 判断该文件是否存在。(有写权限为真) |
-x文件 | 判断该文件是否存在。(有执行权限为真) |
-u文件 | 判断该文件是否存在。(有SUID权限为真) |
-g文件 | 判断该文件是否存在。(有SGID权限为真) |
-k文件 | 判断该文件是否存在。(有SBit权限为真) |
例:[root@localhost ~]# [ -w /root/student.txt ] && echo “yes”|| echo “no”
3、两个文件之间进行比较
测试选项 | 作用 |
文件1 –nt 文件2 | 判断文件1的修改时间是否笔文件2的新(如果新则为真) |
文件1 –ot 文件2 | 判断文件1的修改时间是否笔文件2的旧(如果旧则为真) |
文件1 –ef 文件2 | 判断文件1和文件2的inode号是否一致。判断连接文件 |
例:[root@localhost ~]# [ /root/student.txt –ef /tmp/student.txt ] && echo“yes”|| echo“on”
4、两个整数之间比较
测试选项 | 作用 |
整数1 –eq 整数2 | 判断整数1是否和整数2相等(相等为真) |
整数1 –ne 整数2 | 判断整数1是否和整数2不相等(不相等为真) |
整数1 –gt 整数2 | 判断整数1是否大于整数2(大于为真) |
整数1 –lt 整数2 | 判断整数1是否小于整数2(小于为真) |
整数1 –ge 整数2 | 判断整数1是否大于等于整数2(大于等于为真) |
整数1 –le 整数2 | 判断整数1是否小于等于整数2(小于等于为真) |
例:[root@localhost ~]# [ 23 –le 24 ] && echo “yes”|| echo “no”
5、字符串的判断
测试判断 | 作用 |
-z字符串 | 判断字符串是否为空(为空返回真) |
-n字符串 | 判断字符串是否为非空(非空返回真) |
字符串1 == 字符串2 | 判断字符串1是否和字符串2相等(相等返回真) |
字符串1 != 字符串2 | 判断字符串1是否和字符串2不相等(不相等返回真) |
例:[root@localhost ~]# [ -z name ] && echo “yes”|| echo “no”
[root@localhost ~]# [ $name == “abc” ] && echo “yes”|| echo “no”
6、多重条件判断
测试选项 | 作用 |
判断1 –a 判断2 | 逻辑与。 |
判断1 -o 判断2 | 逻辑或。 |
!判断 | 逻辑非,取反。 |
例:[root@localhost ~]# [ ! –n “$nu”-a “$nu”-gt 23 ] && echo “yes”|| echo “no”
[root@localhost ~]# [ ! –n “$nu”] && echo “yes”|| echo “no”
五、控制流程
1、if条件判断
if [条件判断式]
then
程序
fi
或
if [条件判断式];then
程序
fi
2、双分支if条件语句
if [条件判断式]
then
条件成立
else
条件不成立
fi
3、多分支if条件语句
if [条件判断式1]
then
条件1成立
elif [条件判断式2]
then
条件2成立
else
条件不成立
fi
4、多分支case条件语句
case $变量名 in
“值1”)
;;
“值2”)
;;
*)
;;
esac
5、for循环
语法一:
for 变量 in 值1 值2 ……
do
程序
done
语法二:
for((初始值;循环控制条件;变量变化))
do
程序
done
6、while循环
while [条件判断式]
do
程序
done
7、until循环
until [条件判断式]
do
程序
done
8、函数(function)
function 函数名 (){
程序
}
9、特殊流程控制语句
1)exit [返回值]
2)break语句(跳出循环)
3)continue 语句 (跳出本次循环)