1、文件查找相关的命令
1.1、which命令
作用:用于查找命令的绝对路径
语法:which + 选项 + 命令
#查看ls命令
[root@Node1 ~]# which ls
alias ls='ls --color=auto'
/usr/bin/ls
1.2、whereis命令
作用:查找命令的路径以及相关信息
语法:whereis + 选项 + 命令
选项:
- -b:只搜索二进制文件
- -m:搜索手册文件
- -s:搜索源文件
#查找ls命令
[root@Node1 ~]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
1.3、locate命令
作用:查找文件的路径
- 这个命令是基于/var/lib/mlocate/mlocate.db库来搜索的
- 其中/etc/updatedb.conf这个文件制定了更新时间
- /etc/con.daily/mlocate:这里指定了更新得频率
语法:locate+ 选项 + 文件
#更新库
[root@Node1 ~]# updatedb
[root@Node1 ~]# locate passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
.........
1.4、grep命令
作用:查找文件内容的匹配关键词
语法:grep+ 选项+文件名
选项:
- -v:取反
- -i:忽略大小写
- -n:加上行号
- -c:统计行号
- -o:指定匹配名字
- -E:支持特使符号
可以配合正则使用
- ^$:表示空行
- ^#:表示以#号开头的
- #$:表示以#号结尾
- |:管道符
#查找sshd的进程
[root@Node1 ~]# ps -aux | grep sshd
#查找sshd进程,但是不包括grep命令-->-v取反
[root@Node1 ~]# ps -aux | grep sshd | grep -v grep
#查找/etc/passwd文件中liangjiawei用户
[root@Node1 ~]# grep "liangjiawei" /etc/passwd
liangjiawei:x:1000:1000:liangjiawei:/home/liangjiawei:/bin/bash
#查找以bash结尾的行
[root@Node1 ~]# grep "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
.............
#查找root开头的的行
[root@Node1 ~]# grep "^root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
#查找文件当中的空行
[root@Node1 ~]# grep "^$" /etc/passwd
#多条件查询-->使用E选项-->支持多条件查询
[root@Node1 ~]# grep -E "bash$|^$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
........
#或者是使用egrep命令-->支持多条件查询
[root@Node1 ~]# egrep "bash$|^$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
#忽略大小写地查询-->查找root开头的
[root@Node1 ~]# grep -i "^ROOT" /etc/passwd
root:x:0:0:root:/root:/bin/bash
#统计root在文件中出现多少行
[root@Node1 ~]# grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@Node1 ~]# grep -c "root" /etc/passwd
2
#统计passwd文件的行数
[root@Node1 ~]# grep -c "$" /etc/passwd
21
[root@Node1 ~]# grep -c "^" /etc/passwd
21
[root@Node1 ~]# grep -c ".*" /etc/passwd
21
[root@Node1 ~]# echo "$(cat /etc/passwd | wc -l)"
21
[root@Node1 ~]# echo "$(cat /etc/passwd | wc -l)" | bc
#统计文件中root的个数
[root@Node1 ~]# grep -o "root" /etc/passwd | wc -l
4
#统计nologin的个数
[root@Node1 ~]# grep -o "nologin" /etc/passwd | wc -l
15
1.5、find命令
作用:用于在指定的目录中查找文件
语法:find + 路径 + 选项 + 内容 + 输出
选项:
- -name:指定文件名查找
- -perm:指定文件权限查找
- -user:指定所有者查找
- -group:指定所属组查找
- -mtime:按照文件的更改时间来查找文件
- -n:文件更改距离现在N天之内
- +n:文件更改距离现在N天以前
- -atime:文件最后一次访问的时间
- -ctime:文件权限最后一次修改的时间
- -type:指定文件类型
- f: 文件
- d: 目录
- c: 字符设备
- l: 链接文件
- p:管道文件
- -size:按照文件大小
- find + 文件路径 - 选项 -exec 命令 {};–>固定格式
- -a:必须满足两个条件才能显示
- -o:只需要满足一个条件就能够显示
- –maxdepth:按照目录的深度查找
#创建基础环境
[root@Node1 ~]# cd test/
[root@Node1 test]# ls
aa.txt a.txt bb.txt disk.log error.txt passwd.txt right.txt
#查找文件
[root@Node1 test]# find /root/test/ -name error.txt
/root/test/error.txt
#查找.txt结尾的文件,并且长格式显示
[root@Node1 test]# find ./ -name "*.txt" -exec ls -l {} \;
-rw-r--r-- 1 root root 0 Jun 24 14:23 ./aa.txt
-rw-r--r-- 1 root root 18 Jun 24 14:17 ./a.txt
.............
#查找1天前访问的文件
[root@Node1 ~]# find /root/test/ -mtime -1
#查找.txt结尾的文件,并且删除
[root@Node1 ~]# find /root/test/ -name "*.txt" -exec rm -rf {} \;
#xargs和find命令结合操作
[root@Node1 ~]# find /root/test/ -name "*.txt" |xargs ls -l
-rw-r--r-- 1 root root 0 Jun 25 14:09 /root/test/1.txt
-rw-r--r-- 1 root root 0 Jun 25 14:09 /root/test/2.txt
.......
#或者-o的用法;查找目录下有.sh和.pdf的文件
[root@Node1 ~]# find /root/test/ -name "*.sh" -o -name "*.pdf"
/root/test/a.sh
......
/root/test/D.pdf
#查找/etc/目录下,大于20k并且小于50K的文件
[root@Node1 ~]# find /etc/ -size +20k -a -size -50k | wc -l
18
#权限查找-->系统中至少777的文件或者目录
[root@Node1 ~]# chmod 777 /root/test/a.sh
[root@Node1 ~]# chmod 4777 /root/test/b.sh
[root@Node1 ~]# find /root/test/ -perm 777
/root/test/a.sh
#查找不低于777的文件
[root@Node1 ~]# find /root/test/ -perm -777
/root/test/a.sh
/root/test/b.sh
#查找目录深度,1
[root@Node1 ~]# find /bin/ -maxdepth 1 -perm 755 | wc -l
703
1.6、xargs命令
作用:用于给其他命令传递参数的一个过滤器;
语法:命令 | xargs 选项 命令
选项:
- -a:从文件中读入作为stdin
- -d:自定义参数分隔符
- -i:逐行处理
- -t:在执行之前详细打印命令
[root@Node1 ~]# find /root/test/ -name "*.txt" | xargs -i ls
2、命令判断符号
2.1、;分号
前面的命令不管成功与否,都不会影响后面命令的执行;
用法:命令 | 命令
#不管前面执行怎么样,后面都一样会执行
[root@Node1 ~]# ls slkjdflsdkj; echo yes
ls: cannot access slkjdflsdkj: No such file or directory
yes
[root@Node1 ~]# ls /root/ ; echo "Yes"
anaconda-ks.cfg test
Yes
2.2、&&双与号
前面的命令执行成功了,后面的命令才会执行;
语法: 命令 && 命令
#前面报错,后面是不会执行的
[root@Node1 ~]# ls slkjdflsdkj && echo yes
ls: cannot access slkjdflsdkj: No such file or directory
#只有前面执行成功,后面命令才会执行
[root@Node1 ~]# ls /root/ && echo "Yes"
anaconda-ks.cfg test
Yes
2.3、||双竖杆
前面的命令执行失败了,后面的命令才会执行;
前面的命令执行成功了,后面的命令就不执行;
语法:命令 || 命令
#前面执行了成功了,后面不会执行
[root@Node1 ~]# ls /root/ || echo "Yes"
anaconda-ks.cfg test
#前面执行失败了,后面才会执行
[root@Node1 ~]# ls slkjdflsdkj || echo yes
ls: cannot access slkjdflsdkj: No such file or directory
yes
3、条件语句
3.1、if语句说明
单分支语句:
if [ 条件 ];then
命令
fi
双分支语句:
if [ 条件 ];then
命令1
else
命令2
fi
多分支语句:
if [ 条件1 ];then
命令1
elif [ 条件2 ];then
命令2
elif [ 条件3 ];then
命令3
.....................
else
命令n
fi
3.2、常见的判断
shell常见的判断:
比较字符:
- -eq:等于
- -ne:不等于
- -ge:大于等于
- -gt:大于
- -lt:小于
- -z:空串
- =:两个字符相等
- !=:两个字符不等
- -n:非空串
文件相关的判断语句
- -r:可读为真
- -w:可写为真
- -x:可执行为真
- -f:存在文件为真
- -d:是目录为真
- -e:如果文件存在为真
4、脚本实战
4.1、测试主机在线脚本
- 测试主机在线脚本变形
#编辑脚本
[root@Node1 sh]# vim ping_v1.sh
#!/bin/bash
#Author By Liangjiawei
#Time:2023年5月27日
#Usage:测试在线脚本
#命令检测ip,$1代表的是用户输入的IP
ping -c1 -w1 $1 &> /dev/null
#把结果的代码值赋予num
num=$?
#使用if进行判断,
if [ $num -eq 0 ];then
echo "$1 is up."
else
echo "$1 is down."
fi
#测试脚本
[root@Node1 sh]# chmod +x ping_v1.sh
[root@Node1 sh]# ./ping_v1.sh 192.168.75.131
192.168.75.131 is up.
4.2、删除某个目录下大小为0的文件
[root@Node1 sh]# vim delete_file.sh
#!/bin/bash
#Author By LiangGaRy
#Time:2023年5月27日
#Usage:找出空文件并且删除测试脚本
############################
rm -rf /var/run/yum.pid
yum makecache fast
yum install httpd -y
dir="/var/www/html"
touch $dir/a.txt
touch $dir/b.txt
ls $dir
find $dir -type f -size 0 -exec rm -rf {
} \;
echo "当前文件已经全部删除"
#测试脚本
[root@Node1 sh]# chmod +x delete_file.sh
[root@Node1 sh]# ./delete_file.sh
4.3、if语句判断成绩表脚本
#直接编写脚本
[root@Node1 sh]# vim score.sh
#!/bin/bash
#Author By LiangGaRy
#Time:2023年5月27日
#Usage:用于判断成绩的情况
#################################
read -p "请输入你的成绩:" num
if [ $num -ge 0 -a $num -le 59 ];then
echo "成绩不及格;"
elif [ $num -ge 60 -a $num -le 79 ];then
echo "成绩刚好及格"
elif [ $num -ge 80 -a $num -le 100 ];then
echo "你的成绩是优秀的;"
else
echo "请真实输入你的成绩:范围是[0-100]"
fi
#测试脚本
[root@Node1 sh]# chmod +x score.sh
[root@Node1 sh]# ./score.sh
请输入你的成绩:1
成绩不及格;