编写一个简单脚本
在管理linux系统时,时用脚本通常能提高我们的效率,下面我们来看一下如何编写一个简单的脚本。
编写脚本时,直接用vim编写。
vim test.sh
第一行是指定脚本的运行环境为/bin/bash,之后就可以开始编写脚本了,这里写的是输出hello world。
调用脚本
调用脚本的方式有三种。
1.给脚本文件执行权限,用绝对路径或相对路径调用
2.用sh + 路径调用。
3.用source + 路径调用。
设置快捷脚本说明
在制作脚本是,我们通常需要做一些说明,如写脚本的日期,版本等,但每次写脚本时都要写这些东西就很浪费时间了,所以我们可以设置让这个脚本说明快速生成。
vim /etc/vimrc
编辑vim的配置文件。
map <F2> ms;call Redhat()<cr>'s
首先是第一行,设置快捷键F2,也就是我们在要使用这些信息的时候,按F2就会自动生成,其中的Rehat是我们下面要写的函数。
autocmd BufNewFile *.sh exec "call Redhat"
这里是自动调用Redhat函数,当我们用vim建立以.sh结尾的文件时,自动生成这些说明信息,注意,这里我已经注释掉了,所以是不生效的。
下面就是编写一个函数来生成这些说明信息了。
function 函数名
call append(0,"内容") ##第一行内容
call append(1,"内容") ##第二行内容
endfunction
格式是这样的,大家可以根据自己的要求自己设计
测试的效果是这样的。
编写shell脚本常用命令
这里我们知道了,脚本的内容其实也就是命令,把需要的命令集合到一起并能自动完成某项功能,这就是脚本的功能,下面,我们来学习一下编写shell脚本时常用的命令。
diff命令
diff命令可以用来比较两个文件或目录的不同
用法:
diff [参数] 文件1 文件2
参数:
-b 不检查空格字符的不同
-B 不检查空白行
-c 显示哦全部内文,并标出不同之处
-i 不检查大小写的不同
-p 若比较的文件为c语言程序码文件时显示差异锁在的函数名称
-q 仅显示有无差异,不显示详细的信息
-r 比较目录中的文件
-u 以合并的方式来显示文件内容的不同
例:
直接比较两文件有和不同
仅显示有无差异,不显示详细的信息
cut命令
cut命令多用与字符截取
用法:
cut [参数] 文件
-d ##指定分隔符
-f ##指定截取的列
-c ##指定截取的字符位置
例:
指定:为分隔符,截取第7,8列。
截取每行的1到三个字符
sort命令
sort命令多用于字符排序
用法:
sort [参数] 文件名
-n 纯数字排序
-r 倒序
-u 去掉重复数字
-o 输出到指定文件中
-t 指定分隔符
-k 指定要排序的列
例:
纯数字排序
uniq命令
uniq命令用于对重复的字符做相应的处理。
用法:
uniq [参数] 文件
参数:
-u 显示唯一的行
-d 显示重复的行
-c 每行显示一次并统计重复次数
&& 和 ||
&& 用来执行条件成立后执行的命令
|| 用来执行条件不成立后执行的命令
test 命令
使用test命令可以检查文件和比较值。
test 命令和 [] 等同 ,即test “$ A” = “$ B” 等同 [ “$ A” = “$ B” ]
用于对数值和文件的比较:
[ "$A" = "$B" ] ##等于
[ "$A" != "$B" ] ##不等于
[ "$A" -eq "$B" ] ##等于
[ "$A" -ne "$B" ] ##不等于
[ "$A" -le "$B" ] ##小于等于
[ "$A" -lt "$B" ] ##小于
[ "$A" -ge "$B" ] ##大于等于
[ "$A" -gt "$B" ] ##大于
例:
如果两个数相等输出yes,否则输出no。
[ "$A" -ne "$B" -a "$A" -gt "$B" ] ##$A不等于$B且$A大于$B
[ "$A" -ne "$B" -o "$A" -gt "$B" ] ##$A不等于$B或$A大于$B
用于判断文件是否为空。
[ -z "$A" ] ##文件为空
[ -n "$A" ] ##文件为非空
用来判断两个文件的创建时间
[ "file1" -ef "file2" ] ##file1和file2是否同一文件
[ "file1" -nt "file2" ] ##file1是否比file2新
[ "file1" -ot "file2" ] ##file1是否比file2老
用来比较文件类型
[ -e "file" ] 是否存在文件
[ -f "file" ] 是否文件
[ -L "file" ] 是否链接
[ -S "file" ] 是否套接字
[ -b "file" ] 是否块设备
[ -d "file" ] 是否目录
[ -c "file" ] 是否字符设备
shell 中的文本处理
1.文本过滤命令grep
grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模
式”对目标文本进行匹配检查 , 打印匹配到的行,由正则表达式或者字符及基本文本字符所编写的过滤条件
格式
grep 匹配条件 处理文件
grep的常用选项:
选项 | 描述 |
---|---|
-i | 忽略大小写 |
-h | 不显示文件名 |
-E | 等同于egrep,是一个可扩展的正则表达式 |
-v | 取反 |
grep常用正则表达式的元字符
元字符 | 功能 | 列子 | 描述 |
^ | 行首 | '^root' | 匹配所有以root开头的行 |
$ | 行尾 | 'root$' | 匹配所有以root结尾的行 |
/< | 词首 | '/< root' | 匹配所有任一单词以root开头的行 |
/> | 词尾 | 'root/>' | 匹配所有任一单词结尾为root的行 |
.(点) | 匹配任意一个字符 | r..t | 匹配所有包含r,紧跟任意2个字符,再跟一个t的行 |
* | 匹配0个或多个字符 | r*t | 匹配所有包含r,紧跟任意字符,再跟一个t的字符 |
例:
在文件中查找有root的行。
grep ^root passwd
查找root考开头的行。
grep root$ passwd
查找以root结尾的行。
grep -i root passwd
查找时忽略大小写。
sed 行编辑器
sed编辑器基于模式匹配过滤及修改文本,逐行处理并将结果输出到屏幕,可实现对文本的输出,删除,替换,复制,剪切,导入,导出等各种操作。
sed命令格式:
sed 选项 '编辑命令' 文件
常用的选项
选项 | 作用 |
---|---|
-n | 屏蔽默认输出 |
-i | 直接修改文件内容 |
-e | 可指定多个处理动作 |
-f | 使用sed脚本 |
sed对字符的处理
p ##显示
d ##删除
a ##添加
c ##替换
w ##写入
i ##插入
屏蔽默认输出,显示有root的行
屏蔽默认输出,显示2到6行。
删除有root的行,输出其他的行。
删除1到6行,输出其他的行。
所有以root开头的行后都添加hello world。
在所有以root开头的行前面插入hello world。
所有以root开头的行替换为hello world。
将/etc/passwd文件以root开头的行写到/mnt并命名为passwd.txt,同时隐藏输出。
输出以root开头的行在第几行。
使用-e参数同时执行两个动作,将文件中的root全部替换为hello,将文件中的sbin全部替换为wrold。
awk 报告生成器
awk 会逐行处理文本 , 支持在处理第一行之前做一些准备工作 , 以及在处理完最后一行做一些总结性质的工作,在命令格式上分别体现如下 :
BEGIN{}: 读入第一行文本之前执行 , 一般用来初始化操作
{} :逐行处理 , 逐行读入文本执行相应的处理 , 是最常见的编辑指令
END{} :处理完最后一行文本之后执行 , 一般用来输出处理结果
awk基本用法
awk '{pattern + action}' {filenames}
其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
下面用一些例子来看看这个命令的用法:
如上图,用-F参数来指定分隔符,之后输出每行的行号。
输出每一行有多少列。
以:为分隔符,输出第一列,同样的方法可以输出其他几列。
以:为分隔符,输出不是以bash结尾的那以行的第一列,awk的用法相当灵活,在这里就不一一列举了。
find命令
在编写脚本时,我们也通常用到find命令去查找文件内容并进行某些操作。
格式:
find 目录 参数 关键字
find命令的参数:
-name ##按名称查找
-maxdepth ##查找目录的最大深度
-mindepth ##查找目录的最小深度
-not ##取反
-user ##按用户查找
-group ##按用户组查找
-a ##与
-o ##或
-size ##按文件大小查找
-ctime ##按文件建立时间查找,单位为天
-cmin ##按文件创建时间查找,单位为分
-perm ##按文件权限查找。
下面再来具体看看这些参数都如何使用。
查找/etc下有关键字passwd的文件。
使用-maxdepth或-mindepth参数可以控制查找目录的深度,后面跟的数字就表示查找的深度,这里表示查找的最大深度为1,也就是/etc下的第一层目录。
查找/etc下所有者和所属组都不是root的文件。
查找/etc下文件大小为20k的文件,如果前面+号则表示查找大于20k的文件,如果前面有-号则表示查找文件小于20k的文件。
查找/etc下建立时间小于1天的文件,如果要查找大于1天的就在前面用+号,这个和上面用文件大小的方式查找是一样的,如果查找文件时间的单位为分钟,则要用-cmin参数。
查找/mnt/tmp下文件权限为444的文件,也就是这个文件对所有者,所属组,其他人都只有读权限,如果在444前面有-号,表示查找的文件对所有者,所属组,其他人都必须有读权限,而如果444前面有/则表示查找的文件所有者,所属组,其他人三者之一拥有读权限即可。