shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)

一、书写shell脚本时的常用命令

脚本是一种解释型语言。一般以 .sh 结尾用shell脚本保存执行动作;用脚本判定命令的执行条件;用脚本来实现动作的批量执行。

##脚本的执行一般有两种方法(这里以/mnt/westos.sh 这个脚本为例):
    
    (1) sh  westos.sh			   ##这个命令可以直接执行脚本
    
    (2)	chmod +x westos.sh		   ##给脚本可执行权限
    	/mnt/westos.sh			   ##以绝对路径运行脚本即可  
1.diff 命令(diff比较两个文件或目录,并输出两个文件的不同的行。)
diff file1 file2				##会显示文件不同行内容
diff direcory1 directory2		##比较目录中不同内容

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第1张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第2张图片

diff -b file1 file2 			##不检查空格字符的不同
diff -B file1 file2 			##不检查空白行,当file1只有空白行和一行字时,file2有file1的那行字时,两个文件内容没有不同

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第3张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第4张图片

diff -c file1 file2 			##显示全部内容,并标出不同行
diff -i file1 file2				##不检查大小写的不同
diff -p file1 file2 			##若比较的文件为c语言的程序码文件时,显示差异所在的函数名称,普通文件的话与-c相同

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第5张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第6张图片

diff  -u  file1  file2				##以合并的方式来显示文件内容的不同
diff  -r  							##比较子目录下的不同
diff  -C1  file1 file2 				##显示出不同内容的行及邻近的上下行

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第7张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第8张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第9张图片

2.patch(与diff命令经常一起使用,给文件打补丁)

yum  install  patch -y					##安装patch打补丁软件
diff -u test1.c test.c  >  test.path    ##生成补丁文件(即包含两个文件的所有内容)
patch  -b  test1.c  test.path			##用补丁文件给test1.c打补丁,test1.c的文件内容变的和test.c相同,同时还会生成一个原来的test1.c内容的副本保存下来

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第10张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第11张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第12张图片

3.cut(对行的处理,多用于字符截取)

cut -d : -f 1 passwd 			##-d指定分隔符为:,-f指定第一列
cut -d : -f 1,3 passwd			##把passwd的第一列和第三列显示出来
cut -d : -f 1-3 passwd			##把passwd的第一列到第三列显示出来

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第13张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第14张图片

cut -c1,2 passwd			##把passwd的第一列字符和第二列字符显示出来
cut -c1-3 passwd			##把passwd的第一列字符到第三列字符显示出来

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第15张图片

4.sort(多用于字符排序)

sort test 				##将数字按第一个字符从小到大排序
sort -n	test			##纯数字从小到大排序
sort -r	test			##倒序(从大到小排序)

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第16张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第17张图片

sort -u	test				##去掉重复数字
sort -n test1   -o	test	##将排序的结果输出到指定文件中

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第18张图片shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第19张图片

sort -t					##指定分隔符
sort -k					##指定要排序的列
例子		sort  -t : -k 2 -n test 		##从小到大排序以:为分隔符的test文件中的第二列内容

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第20张图片

5.uniq(对重复字符做相应的处理)

uniq -u	test				##显示唯一行
uniq -d	test				##显示重复的行
uniq -c	test				##每行显示一次并统计重复次数

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第21张图片

6.&& 和 ||

&& 用来执行条件成立后执行的命令
|| 用来执行条件不成立后执行的命令

1、ping -c1 -w1 中-c1是指ping的次数,-w是指执行的最后期限,也就是执行的时间,单位为秒
2&>/dev/null 是指标准输出和错误输出都输出到/dev/null上,而不在界面上显示输出过程;
#例如:
#ping -c1 -w1 172.25.254.111   > /dev/null && echo up || echo down
##ping 一个ip,成功即输出up,不成功则输出down

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第22张图片

7.test比较命令(test命令和[]等同)

例如:test " $A " == "$B" 等同 [ "$A" == "$B" ],这两个命令是相同的

[ "$A" = "$B" ]				##是否相等
[ "$A" != "$B" ]			##是否不等
[! "$A" = "$B" ]			##是否不成立

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第23张图片
在这里插入图片描述

[ "$A" -eq "$B" ]			##是否相等
[ "$A" -ne "$B" ]			##是否不等
[ "$A" -le "$B" ]			##A是否小于或等于B
[ "$A" -lt "$B" ]			##A是否小于B

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第24张图片

["$A" -ge "$B" ]			##A是否大于或等于B
["$A" -gt "$B" ]			##A是否大于B

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第25张图片

["$A" -ne "$B" -a "$A" -gt "$B" ]	##与,必须两个条件都满足
["$A" -ne "$B" -o "$A" -gt "$B" ]	##或,满足一个条件即可

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第26张图片

[ -z "$A" ]				##是否为空,空的意思即为是否存在
[ -n "$A" ]				##是否不为空

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第27张图片

8. tr(英文字母大小写的转换)

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第28张图片

9.文件的软硬链接

链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法。

硬链接和软链接的区别:
原理上,硬链接和源文件的inode节点号相同,两者互为硬链接。软连接和源文件的inode节点号不同,进而指向的block也不同,软连接block中存放了源文件的路径名。
实际上,硬链接和源文件是同一份文件,而软连接是独立的文件,类似于快捷方式,存储着源文件的位置信息便于指向。
使用限制上,不能对目录创建硬链接,不能对不同文件系统创建硬链接,不能对不存在的文件创建硬链接;可以对目录创建软连接,可以跨文件系统创建软连接,可以对不存在的文件创建软连接。

ln -s  file  westos			##创建软链接

#软链接类似windows系统的快捷方式;
#软链接里面存放的是源文件的路径,指向源文件;
#删除源文件,软链接依然存在,但无法访问源文件内容;
#软链接失效时一般是白字红底闪烁;
#软链接和源文件是不同的文件,文件类型也不同,inode号也不同;
#软链接的文件类型是“l”,可以用rm删除。

在这里插入图片描述

ln file  westos1			##创建硬链接

#具有相同inode节点号的多个文件互为硬链接文件;
#删除硬链接文件或者删除源文件任意之一,文件实体并未被删除;
#只有删除了源文件和所有对应的硬链接文件,文件实体才会被删除;
#硬链接文件是文件的另一个入口;
#可以通过给文件设置硬链接文件来防止重要文件被误删;
#硬链接文件是普通文件,可以用rm删除;
#对于静态文件(没有进程正在调用),当硬链接数为0时文件就被删除。注意:如果有进程正在调用,则无法删除或者即使文件名被删除但空间不会释放。

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第29张图片

二、shell中的文本处理

#文本处理的三大命令(grep、sed、awk)

1.grep(文本过滤命令)

其实 grep 是一段话的缩写:Global search regular expression and printout the line(全面搜索研究正则表达式并显示出来)。
grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模式”对目标文本进行匹配检查 , 打印匹配到的行由正则表达式或者字符及基本文本字符所编写的过滤条件。

正则表达式:基本上是一种【表示法】,只要程序支持这种表示法,那么该程序就可以用来作为正则表达式的字符串处理只用

分两类:1.基本正则表达式(BRE):grep
2.扩展正则表达式 (ERE): egrep  =  grep –E
grep  匹配条件   处理文件                    ##命令书写格式
cat passwd | grep root          ##在passwd中只要是出现root的行都打印出来

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第30张图片

cat passwd | grep -v root		##在passwd中只要没有root的行就输出(反向过滤)

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第31张图片

cat passwd | grep -v root | cut -d  ':' -f 1            ##以:为分隔符只显示过滤后的第一列内容

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第32张图片

cat passwd | grep -A 1 root          ##除了列出该行外,后续的1行也列出来
cat passwd | grep -B 1 root			 ##除了列出该行外,前面的1行也列出来

在这里插入图片描述

grep 中的正则表达式
^westos				##以westos字符串开头的行
westos$				##以westos字符串结尾的行
'w....s'			##以w开头,s结尾,中间有4个字符的行
'w.....'			##以w开头,后面有4个字符的行
'.....s'			##以s结尾,前面有4个字符的行

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第33张图片

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第34张图片

grep 中字符的匹配次数设定
*   					##字符出现 [0- 任意次 ]
\?  					##字符出现 [0-1]
\+						##字符出现 [1- 任意次 ]
\{n\}					##字符出现 [n 次 ]
|{m,n\} 				##字符出现 [ 最少出现 m 次,最多出现 n 次 ]
\{0,n\}					##字符出现 [0-n 次 ]
\{m,\}					##字符出现 [ 至少 m 次 ]
\(xy\)\{n\}xy 			##关键字出现 [n 次 ]
.*						##关键字之间匹配任意字符

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第35张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第36张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第37张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第38张图片

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第39张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第40张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第41张图片

grep 中字符的匹配位置设定(因为grep是贪婪模式的搜索)

##非正则表达是加 -E

grep -E ^root passwd 					##把passwd中以root字符开头的行显示出来	
grep -E root$ passwd					##把passwd中以root字符结尾的行显示出来	
grep -i root  passwd					##不区分大小写的把root行显示出来 
grep -E "^root|login$" passwd			##把passwd中以root开头或者以login结尾的行显示出来

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第42张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第43张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第44张图片

grep -E "\ passwd					##只显示root开头的行,root字符前不能有其他字符
grep -E "root\>" passwd					##只显示以root字符结尾的行,root字符后不能有其他字符
grep -E "\" passwd				##只显示含有字符串root的行,root是个单独的字符串

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第45张图片

2.sed(stream editor 行编辑器)

是一种在线编辑器,它一次处理一行内容。处理时,把当 前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space)(为什么叫模式空间呢:因为 sed(不是所有的行都处理)可以指定仅仅处理哪些行,所以 sed 可以像 grep 一样做模式过滤的 符合模式条件的处理 不符合条件的不予处理 ),接着用sed 编辑命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不/断重复,直到文件末尾。

没有特殊指令不会改变源文件内容

cat -n fstab | sed 5p			##把第五行复制一行在原来行的上面显示
cat -n fstab | sed -n 5p  		##只显示指定的第五行内容(-n,静默状态)

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第46张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第47张图片

d模式操作

sed -n '/^$/!p' fstab  						##显示除空行外的所有内容
sed -n '/^$/!p' fstab | sed -n '/^#/!p'		##显示除空行和#开头行的所有内容
cat -n fstab | sed '3d'						##删除第三行内容
cat -n fstab | sed '3,5d'					##删除35行的内容
cat -n fstab | sed '3d;5d'					##删除第三和第五行内容	

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第48张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第49张图片

a模式操作

sed '/^#/ahello\nwestos' fstab  		##在#开头的行后加上两行内容hello,westos, \n是换行符

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第50张图片

i模式操作

sed '4ihello\nwestos' fstab  			##在第四行插入两行内容hello,westos
sed '/#/c**' -i fstab					##将模式空间修改的内容保存到原文件中

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第51张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第52张图片

c模式操作

sed '/#/c**' fstab 					##把文件中的#全部替换成**						

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第53张图片

w模式操作

sed -n '/^UUID/w file' fstab			##把UUID开头的行内容保存到file文件中
sed '$=' fstab							##统计文件的行数,并在最后一行的上一行显示总行数
sed  -n '$=' fstab						##只显统计文件的行数
sed '7r /mnt/file' fstab				##把file文件的内容插入到fstab第7行的上面

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第54张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第55张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第56张图片

sed的其他用法

sed -n '/^UUID/p' fstab							##只显示UUID开头的那一行
sed -n -e '/^UUID/p' -e '/^#/p' fstab			##显示UUID开头和#开头的行,-e可以在同意行执行多条命令
sed -n -f rule fstab							##-f调用命令文件来直接操作文件
sed 's/sbin/westos/g' passwd					##把文件中所有行所有列的sbin换成westos
sed '1,5s/sbin/westos/g' passwd 				##把文件中15行的sbin替换成westos

在这里插入图片描述
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第57张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第58张图片

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第59张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第60张图片

sed的其他用法

sed '/lp/,/halt/s/sbin/westos/g' passwd					##只替换lp行和halt行的sbin
sed 's/\///g' passwd									##把文件中的/转换成空,即删掉/,加\是因为/有特殊的含义,需要转义以下
sed 's@sbin@westos@g' passwd							##把文件中的所有sbin转换成westos,在这里与/的含义相同

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第61张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第62张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第63张图片

sed的其他用法

sed 'G' fstab 						##给每一行后面都加一个空行
sed '=' fstab						##给每一行的上面都加一个行号
sed '=' fstab | sed 'N;s/\n/ /g'	##让行号显示在每行的前面,取消换行

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第64张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第65张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第66张图片

三、几个简单的脚本应用实例

1.编写一个脚本,可以检测能否ping通ip,可以则输出up,不可以则输出no,没有输入ip时会报错

vim ping.sh					##编写一个脚本
chmod +x ping.sh			##给脚本加上执行权限

shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第67张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第68张图片
2.执行脚本后将本机的ip显示,可以显示不同网卡的ip,没有网卡时报错
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第69张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第70张图片
3.有一个内含用户名的文件,不知道一共有多少个用户名,执行脚本后可以从文件的第一行执行到最后一行,建立所有的用户。
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第71张图片
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第72张图片

4.当系统的cpu占用超过设定值时,在日志里显示报警信息
shell脚本编写时的必备命令(文章末尾含几个简单应用的脚本实例)_第73张图片
在这里插入图片描述

你可能感兴趣的:(shell)