shell 脚本中常用命令
diff 命令
diff 命令是用来比较两个文件或目录的不同
diff [options] target1 target2
diff file1 file2
diff direcory1 directory2
diff 在比较文件过程中结果读取方式
[num1 , num2][a|c|d][num3,num4]
num1,num2 表示在第一个文件中的行数
a 表示添加 ----add
c 表示更改 ----change
d 表示删除 ----delete
< 表示第一个文件中的内容, > 表示第二个文件中的内容, — 分割线
num3,num4 表示在第二个文件中的行数
2,4c2,4 表示改变第一个文件中的第二行和第四行才能匹配第二个文件中
的第二行和第四行
diff 中常用的参数
-b 或 --ignore-space-change 不检查空格字符的不同
-B 或 --ignore-blank-lines 不检查空白行
-c 显示全部内文,并标出不同之处
-i 或 --ignore-case 不检查大小写的不同
-p :若比较的文件为 C 语言的程序码文件时,显示差异所在的
函数名称;
-q 或 --brief :仅显示有无差异,不显示详细的信息
-r 或 --recursive :比较子目录中的文件
-u 以合并的方式来显示文件内容的不同
patch
用于文件不同文件打布丁
patch [options] file.old file.path-b
cut
cut 命令多用与字符截取
cut -d 指定分隔符
cut -f 1,7|1-7 指定截取的列
cut -c 1,4|1-4 指定截取的字符位置
将/etc/passwd copy到/mnt
并简化文件
cut -d: -f 1 passwd
截取以:为分隔符的第一列
cut -d: -f 1,3 passwd
截取以:为分隔符的第一列和第三列
cut -d: -f 1-3 passwd
截取以:为分隔符的第一列到第三列
cut -c 1,3 passwd
截取字符的第一列和第三列
cut -c 1-3 passwd
截取字符的第一列到第三列
sort
多用于字符排序
sort -n
纯数字排序
sort -r
倒序
sort -u
去掉重复数字
sort -o
输出到指定文件中
sort -t
指定分隔符
sort -k
指定要排序的列
创建一个纯数字的文件
sort file
只是第一个字符排序
sort -n file
将文件内容以纯数字形式排序
由于刚才的文件没有重复的数字
所以将文件中加上重复的数字
sort -nu file
将文件去除重复的数字以及以纯数字的形式排序
sort -nur file
将文件去除重复的数字以及以纯数字的形式倒序排序
sort -nur file -o westos
将文件去除重复的数字以及以纯数字的形式倒序排序并输出为新文件westos
新写文件
如果将文件以纯数字的形式排列那只会对第一列的数字其作用
sort -t : -k 2 -n file
将文件以:为分隔符的第二列以纯数字的形式排序
uniq
对重复字符做相应的处理
uniq -u
显示唯一的行
uniq -d
显示重复的行
uniq -c
每行显示一次并统计重复次数
sort-n file | uniq -c
以纯数字形式排列并显示每个数字出现的次数
sort-n file | uniq -d
以纯数字形式排列并显示重复的数字
sort-n file | uniq -u
以纯数字形式排列并显示不重复的数字
实验
用命令查看登陆本主机次数最多外部的ip和次数
last -i
可以查看本机的登陆情况
如果需要查看登陆最多外部的ip和次数,需要将本机的ip和装机时间进行过滤,并挑选出ip以及查看登陆次数并排倒序,最后将第一的ip和次数列举出来
输入的命令是last -i |grep 0.0.0.0 -v | grep wtmp -v | cut -d " " -f 14 | uniq -c | sort -nr -t " " -k 5 | head -n 1
顺序就是上述顺序
&& 和 ||
&& 用来执行条件成立后执行的命令
|| 用来执行条件不成立后执行的命令
例如:
ping -c1 -w1 172.25.254.111 && echo up
ping -c1 -w1 172.25.254.111 || echo up
实验
写一个脚本ping一个ip如果ping的通显示该ip is up 如果ping不同显示该ip is down
脚本写法:
测试
硬链接软连接
硬链接ln /mnt/westos /mnt/westos
节点号相同的文件,与源文件内容一致
软连接ln -s /mnt/westos /mnt/westos
节点不同由新创建的文件指向源文件,删除源文件会损坏
在这里插入图片描述
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” ]大于
["$ A" -ne " $ B" -a “$ A” -gt “$ B” ]and
["$ A" -ne “$ B” -o “$ A” -gt “$ B” ]or
[-z “$ A” ]是不是为空
[-n “$A” ]是不是不为空
[“file1” -ef “file2” ]
[“file1” -nt “file2” ]
[“file1” -ot “file2” ]
[-e “file” ]存在
[-f “file” ]是不是普通文件
[-L “file” ]是不是软链接
[-S “file” ]是不是套接字
[-b “file” ]是不是块设备
[-d “file” ]是不是目录
[-c “file” ]是不是字符文件
实验
监控cpu的使用情况并在超过一定数字报警
脚本写法
测试
实验
上面实验说到能ping通是up,ping不通是down,不过没有考虑脚本测试后面没有ip的情况,也就是为空,现在加如如果ip为空的警告
脚本写法
测试
实验
写一个脚本当文件写进去时判断是什么文件
脚本写法
测试
实验
将输入的内容转化大小写
脚本写法
测试
将脚本反过来写就是大写变小写
grep
Global search regular expression and print out the
line
全面搜索研究正则表达式并显示出来
grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模
式”对目标文本进行匹配检查 , 打印匹配到的行
由正则表达式或者字符及基本文本字符所编写的过滤条件
grep root passwd
查找passwd文件中的root
grep ^root passwd
以root开头
grep root$ passwd
以root结尾
grep -i root passwd
忽略大小写
grep -E "root|ROOT" passwd
root或者ROOT
grep -v 关键字
反向过滤
grep 关键字 -数字
显示行以及上下
grep 关键字 -A数字
上几行
grep 关键字 -B数字
下几行
grep 'w....s'
以w开头s结尾中间4个字符
grep 'w.....'
以w开头后面5个字符
grep '.....s'
以s结尾前面5个字符
grep 中字符的匹配次数设定
字符出现 [0- 任意次 ]
?
字符出现 [0-1 次 ]
+
字符出现 [1- 任意次 ]
{n}
字符出现 [n 次 ]
|{m,n} 字符出现 [ 最少出现 m 次,最多出现 n 次 ]
{0,n}
字符出现 [0-n 次 ]
{m,}
字符出现 [ 至少 m 次 ]
(xy){n}xy 关键字出现 [n 次 ]
.*
关键字之间匹配任意字符
grep 中字符的匹配位置设定
^ 关键字 开头
关键字 $ 结尾
\(为了显示斜杠)< 关键字
关键字 \(为了显示斜杠)>
\(为了显示斜杠)< 关键字 \(为了显示斜杠)>
sed
行编辑器
stream editor
用来操作纯 ASCII 码的文本
处理时 , 把当 前处理的行存储在临时缓冲区中 , 称为“模式空
间” (pattern space) 可以指定仅仅处理哪些行
sed 符合模式条件的处理 不符合条件的不予处理
处理完成之后把缓冲区的内容送往屏幕
接着处理下一行 , 这样不断重复 , 直到文件末尾
Sed 命令格式
调用 sed 命令有两种形式:
sed [options] ‘command’ file(s)
sed [options] -f scriptfile file(s)
sed 对字符的处理
p显示
d删除
a添加
c替换
w写入
i插入
p 模式操作
sed -n ‘/:/p’ fstab
sed -n ‘/UUID$/p’ fstab
sed -n ‘/^UUID/p’ fstab
sed -n ‘2,6p’ fstab
sed -n ‘2,6!p’ fstab
将/etc/fstab拷贝到/mnt
查看文件并放入模式空间,并查看模式空间中的第5行
查看3-5行
查看第三行和第五行
将带#的行复制
查看#并不要求重复
查看不包含#
不看$开头,不看#和 $开头的
实验
d 模式操作
sed ‘/^UUID/d’ /etc/fstab
sed ‘/^#/d’ /etc/fstab
sed ‘/^$/d’/etc/fstab
sed ‘1,4d’/etc/fstab
sed –n ‘/^UUID/!d’ /etc/fstab
除过#开头的
除过3和5行
除过3到5行
a 模式操作
sed '/^UUID/a \hello sed /etc/fstab
sed ‘/^UUID/a \hello sed\nwestos /etc/fstab’
替换UUID开头的行为hello westos
替换为两行
c 模式操作
sed ‘/^UUID/c\hello sed\nwestos /etc/fstab’
将#开头的全替换为…
i 模式操作
为输出模式将放在模式空间中的东西存入一个文件,可以是原文件或者新文件
sed ‘/^UUID/i\hello sed\nwestos /etc/fstab’
将#开头的全替换为…,并保存到原来的文件中
w 模式操作插入模式
sed ‘/^UUID/w /tmp/fstab.txt’ /etc/fstab
sed -n’/^UUID/w /tmp/fstab.txt’ /etc/fstab
sed ‘/^UUID/=’/etc/fstab
sed ‘6r /etc/issue’ /etc/fstab
将file插入fstab第六行
插入最后一行
sed 的其他用法
sed -n ‘/^UUID/=’ fstab
sed -n -e ‘/^UUID/p’ -e ‘/^UUID/=’ fstab
sed -e ‘s/brown/green/; s/dog/cat/’ data
sed -f rulesfile file
sed ‘s/^//#/’/etc/fstab
sed ‘s@^/@#@g’/etc/fstab
sed ‘s///#/’/etc/fstab
sed ‘s///#/g/’/etc/fstab
sed ‘G’ data
sed ‘$ !G’ data
sed ‘=’ data | sed ‘N; s/\n/ /’
sed -n ‘$p’ data
查看UUID开头并显示在第几行
产看另一个文件与这个文件重复的内容在第几行
全文替换
同理
同时使用
首尾加空行
只给文件首加空格,尾不加
加入行号不过在上一行显示
在行首显示行号
显示最后一行行号
实验
修改http的端口
脚本写法
将listen开头的替换成自己要修改的 并输出回原来的文件
测试
记得重启httpd systemctl restart httpd
不然不生效