Shell脚本基础
一、基本命令
1)grep:过滤文本文件内容
-E 扩展正则表达式
-i 忽略大小写
-n 打印行号
-o 只打印匹配的内容
-c 只打印每个文件匹配的行数
-B 打印匹配的前几行
-A 打印匹配的后几行
-C 打印匹配的前后几行
-color 匹配的字体的颜色
-v 打印不匹配的行
2)cut:从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出
-c 以字符为单位进行分割
-d 自定义分隔符
-f 与-d一起使用,指定显示哪个区域
3)sort:将文本文件内容进行排序
-k 根据切割后的那一段进行排序
-n 依照数值的大小排序(默认是根据字符进行排序)。
-r 以相反的顺序来排序。
-t <分隔字符> 指定排序时所用的栏位分隔字符。
-u 去除重复的行(只要那个指定的字段重复,就认定是重复的行)
4)uniq:去除重复的行(相邻且相同,认定为重复)
-c 在行首用数字表示该行出现了多少次
-u 仅仅显示那些没有出现重复过的行
5)seq:生成一个数组序列
seq 起始 步长 终止
seq 1 3 21 表示从1开始输出每第三个数一直到21为止
6)tr:替换或删除文档中的字符
-d 删除字符
二、基本运算
1)整数比较符
1.-eq:相等
2.-ne:不相等
3.lt:小于
4.gt:大于
5.le:小于等于
6.ge:大于等于
2)字符串比较符
== : 判断两个字符串是否相等
!=: 判断两个字符串是否不相等
-n: 判断字符串是否不为空
-z: 判断字符串是否为空
3)文件测试
-e: exist 存在即为真 #可以判断目录和文件
-f: 存在且为普通文件
-d: 存在且为目录
4)布尔运算符
!: 取反
-a: && 和
-o:|| 或
布尔运算符通常用在[ ]条件判断中
5)逻辑判断符
&&: 前面的命令执行成功就会执行后面的命令
||: 前面的命令执行失败就会执行后面的命令
6)整数运算——let
let num++
let num=+1
let num=num+1
三、流程控制
1)if条件控制语句
1.if单分支
if 条件表达式;then
CMD
...
fi
2.if双分支
if 条件表达式;then
CMD
else
CMD
fi
3.if多分支
if 条件表达式;then
CMD
elif
CMD
elif
CMD
else
CMD
fi
2)for循环语句
for 变量 in 取值范围
do
CMD
...
done
3)while循环
条件为真则进入死循环,为假则退出循环
while true
do
CMD
done
4)break与continue
break终止当前循环
continue跳过本次循环进入下一次
5)case
case 模式名 in
模式1) CMD;;
模式2) CMD;;
模式3) CMD;;
esac
四、正则表达式
1).表示匹配单个字符且该字符必须存在
2)^表示匹配以某个字符开头的行
3)$表示匹配以某个字符结尾的行
4)*表示匹配前面的字符出现零次或多次
5)[ ]表示匹配括号内的单个字符而非字符串
6)^[^ ]表示匹配非括号内字符开头的行
7)\<锚定单词首部:单词前必须存在特殊字符或空格 \>锚定单词尾部:单词后必须存在特殊字符或空格
如:\<root\>只可匹配root单词无法匹配onroot或rootble等
8)\{m,n\}表示匹配前面的字符至少出现m次,至多出n次
9)\(\)表示对某个单词进行分组,\1表示对第一个分组进行调用
扩展正则:egrep 或 grep -E
10)+表示前面的字符出现一次的情况
11)| 或
12)?表示前面的字符最多出现一次的情况(包括零次)
五、sed与awk命令
1)sed
sed [选项] [sed命令] 输入文件
选项:
-n 取消默认的sed软件输出
-e 一条语句可以执行多个命令
-r 使用扩展正则表达式
-i 直接修改文件内容而不输出在终端
sed命令
a 行后增加
i 行前插入
c 替换字符
d 删除字符
p 打印字符
sed正则
删除root开头的行 [root@ken ~]# sed ‘/^root/d’ test
仅仅匹配以root开头的行的root [root@ken ~]# sed ‘/^root/{s/root/ken/g}’ test
使用sed开启selinux [root@ken ~]# sed -i “s/\(SELINUX=\)disabled/\1enforcing/g” /etc/sysconfig/selinux
2)awk
awk执行过程
读取文本第一行,首先会和匹配模式进行相匹配,如果发现第一行内容不和模式相匹配的话,就继续读取下一行
读取到第二行发现和模式相匹配,就会执行花括号里面的动作
然后继续读取下一行,发现和模式相匹配,就会执行花括号里面的动作
FS(Field Separator):字段分隔符(默认是以空格为分隔符=)
NR(Number of Rrecord):记录的编号(awk每读取一行,NR就加1==)
NF(Number of Field):字段数量(记录了当前这条记录包含多少个字段==)
打印一冒号为分隔符的最后一个字段 [root@ken ~]# awk -F “:” ‘{print $NF}’ test
第五个字段包含root的行 [root@ken ~]# awk -F “:” ‘$5~/root/{print $0}’ test
begin
[root@ken ~]# awk -F “:” ‘BEGIN{print “user shell”}NR==2{print $1,$NF}’ test
user shell
bin /sbin/nologin
end
[root@ken ~]# awk ‘BEGIN{i=0}/root/{i++}END{print i}’ test
2