linux系统中shell脚本
实验环境的搭建:设置一台ip为172.25.254.137的主机
vim /etc/sysconfig/network-scripts/ifcfg-ens3
DEVICE=ens3
ONBOOT=yes
BOOTPROTO=none
IPADDR=172.25.254.137
PREFIX=24
NAME=ens3
实验素材:
rm -fr /mnt
echo westos linux > westos
cat westos > westos1
echo 123 >> westos1
cat westos cat westos1
生成两个内容不同的文件
mkdir westosdir mkdir westosdir1 touch westosdir1/file
生成两个内容不同的目录
一、diff、cat、sort命令的使用
1.diff命令
diff westos westos1 ##显示两个文件的不同
diff -b 忽略文件中的空格不同
-B 忽略文件中的空行不同
-i 忽略大小写的不同
-c 显示对比文件的所有内容,并标识不同内容
-r 对比目录间的不同
合并时,需要用到打补丁的工具:
diff -u westos westos1 > westos.path ##生成westos的补丁文件
dnf install patch
patch westos westos.path ##将补丁文件打入
但是我们发现将补丁打入后,原文件被覆盖,为了保证数据的安全性,应该提前给原文件进行备份。
patch westos westos.path ##在打补丁的同时生成原文件的备份文件,后缀为.orig
2.cut命令
cut -d : -f 1 passwd ####显示文件内容的第一列,-d表示指定分隔符号,-f指定行数
cut -c 1 passwd ##显示文件的第一列的第一个字符,-c指字符
4.sort命令
实验素材:sort westos ##给westos排序,默认只排第一行
sort -n westos ##纯数字排序
sort -nr westos ##数字排序倒序
就给大家演示到这里,其他的大家可以自己尝试:
sort -nru westos ##忽略重复行
sort -nru westos -o test ##输出到指定文件
sort -n westos | uniq -c ##合并重复内容,并统计重复次数
sort -n westos | uniq -d ##显示重复的行
sort -n westos | uniq -u ##显示唯一的行
sort -t : -k 2 westos ##指定分隔符:根据二列排序
练习:
1 ifconfig 网卡 可以显示网卡信息
显示信息中包含此网卡使用的ip地址,用命令过滤此ip且输出时只显示ip不显示其
他信息
ifconfig |cut -d ’ ’ -f 10 |head -2
172.25.254.137
2 找出能登录系统用户中UID最大的用户,并显示其名称
grep /bin/bash /etc/passwd | sort -t : -nrk 3 |head -1|cut -d : -f 1
westos
二、&&与||的使用
二者的含义:
&& ##命令成功执行&&之后的命令
|| ##命令失败执行||之后的命令
1.&&与||使用的演示
检测用户是否存在的脚本:
#! /bin/bash ##设定脚本的运行环境
grep hellow /etc/passwd &&
echo hellow is exist
} || {
echo hellow is not exist
}
三、test、tr指令
1.tses指令
test指令===[空格 空格]
a=5 b=6
[ "$a" = "b"] && echo yes || echo no
!= ##不等于
-eq ##等于
-ne ##不等于
-lt ##小于
-le ##小于等于
-ge ##大于等于
-gt ##大于
-o ##或者
-a ##并且
这里给大家演示一下,其他的大家可以自己操作
2.tr指令
批量操作:
tr ‘a-z’ ‘A-Z’ < westos ##把westos文件中的小写字母转换成大写字母
单个操作:
tr ‘a’ ‘A’ < westos ##把westos文件中的小写字母a转换成大写字母A
脚本练习
1. 编写脚本nmm_check.sh,检测数字是否在0~9,或者大于等于10
#!/bin/bash
[ "$1" -ge "0" -a "$1" -lt "10" ] && {
echo $1 is in 0~9
} || {
echo $1 is not in 0~9
}
数字大于10,输出"$1" is not in 0~9
数字小于10且大于0,输出"$1" is in 0~9
**2.**检查文件是否存在,并判断文件的类型:
#!/bin/bash
[ -z "$1" ] && {
echo "未检测到文件,请指定"
exit
}
[ -e "$1" ] || { ##-e,检测文件是否存在
echo "Error:$1 is not exist !!"
exit
}
[ -L "$1" ] && { ##-L,检测文件是否是一个链接
echo "$1 is a link file"
exit
}
[ -f "$1" ] && { ##-f,检测文件是否是一个普通文件
echo "$1 is a common file"
exit
}
[ -d "$1" ] && { ##-d,检测是否是一个文件
echo "$1 is a directory"
exit
}
[ -S "$1" ] && { ##-S,检测是否是一个套接字
echo "$1 is a socket"
exit
}
[ -b "$1" ] && { ##-b,检测是否是一个块设备
echo "$1 is a device file"
exit
}
[ -c "$1" ] && { ##-c,检测是否是字符设备文件
echo "$1 is a char"
exit
}
四、字符过滤grep
实验素材:
cp /etc/passwd . ##复制/etc/passwd文件到当前环境下
1.grep的使用
grep root passwd ##显示含有关键字root的行
grep -i root passwd ##忽略搜索条件root大小写的行
grep -E “root|nologin” passwd ##显示含有root和nologin的行 ====grep -e root -e nologin passwd
grep -E “\<root” passwd ##显示root前面没有扩展字符的行
grep -E “root\<” passwd ##显示root后面没有扩展字符的行
grep -E “\<root\<” passwd ##显示root前后都没有拓展字符的行
grep -n root passwd ##显示搜索字符所在的行
grep -n 5 root passwd ##显示搜索字符所在行以及上下各5行
grep -B5 root passwd ##显示搜索关键字所在的行以及上5行
grep -A5 root passwd ##显示搜索关键字所在的行以及下5行
grep root passwd -v ##显示不含有关键字的行
2.grep字符数量匹配规则
^westos ##以westos开头
westos$ ##以westos结尾
w....s ##w开头四个任意字符s结尾
* ##字符出现任意
? ##0到1次
+ ##1到任意次
{n} ##n次
{m,n} ##m到n次
{,n} ##最多n次
{n,} ##最少n次
(ab){2} ##ab字符出现两次
脚本练习:
显示系统中能被su命令切换的用户名称,vim sh.sh:
#!/bin/bash
grep -E “bash
∣
s
h
|sh
∣sh” /etc/passwd | cut -d : -f 1
!!注意su命令可以切换的用户有bash和sh结尾的两种。
五、sed
1.sed的行内容处理
sed 参数 对象
s
ed 's/nologin/westos/g' passwd ##将文件中的nologin替换成westos
或者:
vim /etc/rule :s/nologin/westos/g
sed -f /etc/rule passwd ##将文件中的nologin替换成westos
p(显示):
sed 5p passwd ##打印passwd文件的第五行
sed -n 5p passwd ##只输出被处理行的内容
cat -b passwd | sed -n 3,5p ##处理3到5行
cat -b passwd | sed -n ‘3p;5p’ ##处理第三行和第五行
sed -n ‘/^root/p’ passwd ##处理以root开头的
sed -n ‘/root$/p’ passwd ##处理以root结尾的
d(删除):
sed ‘5d’ passwd ##删除第五行
cat -b passwd | sed ‘5d’ ##删除第五行,并显示
cat -b passwd | sed ‘5,8d’ ##删除第五行到第八行,并显示
cat -b passwd | sed -e ‘5d;8d’ ##删除第五行和第八行
sed -e ‘/^root/d’ passwd ##删除root开头的
sed -e '/root$/d' passwd ##删除root结尾的
sed -e ‘$d’ passwd ##删除最后一行
a(增加):
sed '2a666666' passwd ##将6666666添加到passwd的第二行后
sed '$a666666' passwd ##将6666666添加到passwd的最后一行
c(替换):
sed '1caaaaaa' passwd ##将passwd的第一行替换成aaaaaa
sed '/root/chahaha' passwd ##将文件中的root替换成hahaha
w(写入):
sed '/nologin$/westosgile' passwd ##将符合条件的行写入到指定文件
i(插入):
sed '2i6666' passwd ##将6666插入到passwd的第二行之前
r(整合文件):
文件lee:1223
sed '2rlee' passwd ##将文件lee的内容整合到passwd的第二行后
2.sed的文件内容处理
sed '4,5s/root/lee/g' passwd ##将passwd文件的第四行到第五行中的root替换>为lee
sed 's/bin/westos/g' passwd ##将全文的bin替换为westos
sed 's/\//#####/g' passwd ##将原文中所有的/替换为#####===sed ‘s@\/@#####@g' passwd
sed '条件' -i passwd ##将替换的条件写入到原文中
脚本练习:
vim Apache.sh
此脚本接入的数字,http的端口就改为这个数字。(假设selinux关闭)
#!/bin/bash
setenforce 0 &> /dev/null
[ -z "$1" ] && {
echo "Error:Please input port following script !!"
exit
}
rpm -q httpd &> /dev/null || {
echo "Error:Apache is not installed !!"
exit
}
systemctl status httpd | grep "running" &> /dev/null || {
echo "Error:Apache is not running !!"
exit
}
netstat -antlupe | grep -E ":$1\>" &> /dev/null && {
echo "Error:$1 is in used !!"
exit
}
sed "/^Listen/cListen $1" -i /etc/httpd/conf/httpd.conf
systemctl restart httpd
netstat -antlupe | grep http