一、脚本编程
1、if语句怎样用
人生面临许多选择,在编程世界里同样也有许多选择。同其他编程语言一样,当我们想写一个功能健壮的脚本时,通过条件判断来选择适合的操作尤为重要。在我们执行某些重要的操作之前,判断当前环境是否适合执行这一操作是非常重要的。我们可以用&&和||来做简单的判断,不过shell有更用的语句。shell有两种常见的条件选择语句if和case。我们先来看一下if该怎样用吧。
if语句的单分支语法:
if 条件判断 ;then;执行命令;fi
[root@localhost ~]# type if if is a shell keyword [root@localhost ~]# type fi fi is a shell keyword [root@localhost ~]# type then then is a shell keyword
首先可以看到,if、fi和then在shell中都是关键词
双分支:
if 条件判断 ;then 执行代码 else 执行代码 fi 多分支: if 条件判断;then 执行代码 elif 条件判断;then 执行代码 elif 条件判断;then 执行代码 ......... else 执行代码 fi
if语句逐一判断,当遇到条件为真时则执行该条件下的分支命令,而后结束整个if语句
当然,if语句本身很简单的,但使用if语句必须要熟练掌握条件测试语句,并且当if语句和其他语句嵌套使用时必须要理清逻辑关系否则将很难排错。
2、shell的case语句
当我们要判断的条件是连续的逻辑关系时可以很方便的使用if来操作,但是如果是离散关系时,if语句将会显得臃肿而繁琐,这时使用case语句将非常高效。在Linux中特别是写一些服务的启动脚本时将会遇到很多的case语句,掌握case语句是做运维,至少是脚本开发要掌握的一个基本知识。
和if语句不同,case语句的逻辑关系更加清晰
case 变量引用 in pat1) 分支1 ;; pat2) 分支2 ;; ......... *) 最后的分支 ;; esac
case支持通配符,如*,?,[],|等
注意最后要写esac,将case倒转和if相同,如果不写将报错
二、文件查找
1、loacte通过名字查找文件
locate通过updatedb库来查找文件,默认使用包含通配符的pattern,如果没用通配符默认匹配全路径包括路径名。如果刚创建的文件没有同步到数据库中locate命令将无法查找。
locate默认的查找库是/var/lib/mlocate/mlocate.db,系统设置默认计划执行数据库的同步任务,当整个文件系统很复杂且变化很大时时同步任务将会耗费大量的系统资源。
locate的特点:
查找速度块
模糊查找
非实时查找
只搜索用户具备读取和执行权限的目录
整个locate工作其实是由四部分组成的:
/usr/bin/updatedb 主要用来更新数据库,这个工作是通过crontab自动完成的。
/usr/bin/locate(mlocate) 是作来完成查询功能的程序。
/etc/updatedb.conff 是配置要查询哪些目录、哪些文件。
/var/lib/mlocate/mlocate.db 存放文件信息的文件。
locate命令的选项:
-A:--all 后面有多个模式,只打印符合所有匹配模式的文件
-b:--basename 只匹配基名符合pattern的文件,和--wholename的用法相反
-c:--count 只显示匹配到的文件的数量,不显示匹配到的文件
-d:--database 使用指定的搜索数据库替换默认的,-表示从标准输入读取库
-e:--existing 只显示当locate运行时已存在的文件
-L:--follow 当文件存在时跟随蔓延的符号链接(默认)
-i:--ignore-case 匹配模式时忽略大小写区别
-l:--limit -n LIMIT限制为LIMIT项目的输出(或计数)
-m:--mmap 忽略向后兼容性
-P:--nofollow, -H当检查文件时不跟随蔓延的符号链接
-0:--null 输出时以NUL分隔项目
-S:--statistics 不搜索项目,显示有关每个已用数据库的统计信息
-q:--quiet 不报告关于读取数据库的错误消息
-r:--regexp REGEXP搜索基本正则表达式REGEXP来代替glob模式
--regex 模式是扩展正则表达式
-s:--stdio 忽略向后兼容性
-w:--wholename 匹配完整路径名(默认)
二、find实时查找工具,通过遍历指定路径完成文件查找
查找特点:
查找速度慢
精确查找
实时查找
只查找用户有相应权限的目录
语法:find [options] [查找起始路径] [查找条件] [处理动作]
查找条件:选项+测试条件
条件测试:结果通常是布尔型
组合测试:
与:-a 或:-o 非:-no或!
德·摩根定律:
!(-pat1 -o -pat2) = ! -pat1 -a ! -pat2
!(pat1 -a pat2) = ! pat1 -o ! pat2
根据文件名判断
-name pattern,通配符匹配,精确匹配,pattern要加引号
-iname 不区分大小写
-inum 查找所有分区某个inode号的所有文件
-samefile 查找inode相同的文件
[root@localhost ~]# find / -samefile test.sh find: ‘/proc/3732/task/3732/fd/7’: No such file or directory find: ‘/proc/3732/task/3732/fdinfo/7’: No such file or directory find: ‘/proc/3732/fd/7’: No such file or directory find: ‘/proc/3732/fdinfo/7’: No such file or directory /root/test.sh /opt/t
注意:find只找磁盘文件,对于/proc里的内存文件无法查找
-links n 链接数为n的文件或目录
-regex 匹配整个路径而不是基名,所以正则模式要把完整的目录路径也包括进去。find默认使用的是emacs正则,如果要换其他的正则可以用-regextype选项来指定
根据文件的从属关系
-user username 查找某个用户的所有文件
-group groupname 查找某个组所有的文件
-uid 根据uid来查找
-gid 根据gid来查找
-nouser 查找没有属主的文件
-nogroup 查找没有属组的文件
注意:Linux使用id来标识文件的从属关系
根据文件类型查找
-type 后面接文件的类型,注意文件和目录包括符号链接,所以判断时最好将符号连接写在前面
根据文件大小查找:
-size [+|-]#UNIT 常用单位:K、M、G默认为字节
注意:只有字节为单位才能够精确超找,如果以其他单位找,在两个相邻整数间的数一律看作大的那一个
#UNIT:(#-1,#]
-#UNIT:[0,#-1]
+#UNIT:(#,)
根据时间查找
根据时间查找有两个单位,且他们的计算方法是不一样的
1、以天为单位
-atime [+|-]#
-mtime
-ctime
2、以分钟为单位
-amin [+|-]#
-mmin
-cmin
当#为1时,mmin 1和mmin -1的区域将会重叠
根据权限查找:
-perm:[/|-]mode 数字
mode 精确匹配权限
/mode 任何一类用户的任何一位权限符合条件即可
-mode 所有用户每一位权限都必须符合
注意:/000和-000一样,0表示不关心权限
处理动作
-print:输出到stdout,默认打印
-ls:显示文件的长格式信息
-delete 删除查找的文件
-fls /PATH 将查找的文件保存到指定文件
-ok command {} \;将查找的文件执行command命令,{}代表查找到的文件,但每操作一个文件都会有提示。
-exec command {} \;没有提示,其中\;代表结束
注意:-ok和-exec是将find找到的所有文件一个一个的处理,即给每一个文件执行一次命令,我们知道一个命令就是一个进程,当找到的文件有很多时,将会消耗较多的资源并导致效率的下降,为了避免这个问题可以用xargs
find 查找条件 |xargs command
xargs是将find找到的所有结果当成一个参数传给command,即command只执行了一次,效率更高。但是 由于将所有的结果用一个空格隔开然后变成一个变量的模式,当遇到查找到的文件名中有空格将会出错
排除目录:
-path PATH -prune 组合排除,并且的关系
[root@localhost ~]# find /etc -path '/etc/sane.d' -prune -o -name "*.conf" /etc/resolv.conf /etc/fonts/conf.d/65-0-lohit-marathi.conf /etc/fonts/conf.d/59-liberation-mono.conf /etc/fonts/conf.d/67-lohit-malayalam.conf /etc/fonts/conf.d/59-liberation-sans.conf /etc/fonts/conf.d/65-0-lohit-punjabi.conf /etc/fonts/conf.d/10-scale-bitmap-fonts.conf /etc/fonts/conf.d/60-open-sans.conf /etc/fonts/conf.d/20-unhint-small-vera.conf /etc/fonts/conf.d/65-0-madan.conf /etc/fonts/conf.d/25-no-bitmap-fedora.conf /etc/fonts/conf.d/66-ucs-miscfixed.conf ......
练习
1、查找/var目录下属主为root,且属组为mail的所有文件
[root@localhost ~]# find /var/ -user root -group mail -ls 201327104 0 drwxrwxr-x 2 root mail 50 Aug 14 10:37 /var/spool/mail 206330921 8 -rw------- 1 root mail 4219 Aug 14 10:37 /var/spool/mail/root
2、查找/var目录下不属于root、lp、gdm的所有文件
[root@localhost ~]# find /var/ ! \( -user root -o -user lp -o -user gdm \) -ls 135969642 0 drwxr-xr-x 3 colord colord 50 Aug 2 21:22 /var/lib/colord 203103112 0 drwxr-xr-x 2 colord colord 6 Nov 20 2015 /var/lib/colord/icc 139609985 4 -rw-r--r-- 1 colord colord 4096 Aug 2 21:22 /var/lib/colord/mapping.db 139609986 8 -rw-r--r-- 1 colord colord 7168 Aug 2 21:22 /var/lib/colord/storage.db 68217670 0 drwx------ 2 tss tss 6 Nov 21 2015 /var/lib/tpm 135970004 0 drwxr-xr-x 2 unbound unbound 21 Aug 3 06:10 /var/lib/unbound 135970006 4 -rw-r--r-- 1 unbound unbound 409 Nov 20 2015 /var/lib/unbound/root.key 204613039 0 drwxr-x--x 7 qemu qemu 69 Aug 2 21:18 /var/lib/libvirt/qemu 10634 0 drwxr-xr-x 2 qemu qemu 6 Aug 2 21:18 /var/lib/libvirt/qemu/save 70295736 0 drwxr-xr-x 2 qemu qemu 6 Aug 2 21:18 /var/lib/libvirt/qemu/snapshot 139609974 0 drwxr-xr-x 2 qemu qemu 6 Aug 2 21:18 /var/lib/libvirt/qemu/dump 206290799 0 drwxr-xr-x 3 qemu qemu 19 Aug 2 21:18 /var/lib/libvirt/qemu/channel 10635 0 drwxr-xr-x 2 qemu qemu 6 Aug 2 21:18 /var/lib/libvirt/qemu/channel/target .........
3、查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
[root@localhost ~]# find /var/ -mtime -7 -not \( -user root -o -user postfix \) -ls 67136164 4 -rw------- 1 setroubleshoot setroubleshoot 3286 Aug 10 22:34 /var/lib/setroubleshoot/setroubleshoot_database.xml 1485002 0 drwxrwx--T 6 gdm gdm 79 Aug 10 22:33 /var/lib/gdm 136239626 4 -rw-r--r-- 1 gdm gdm 43 Aug 10 22:33 /var/lib/gdm/.pulse/9987c5b50f134797b202165f43b10443-default-sink 136239627 4 -rw-r--r-- 1 gdm gdm 42 Aug 10 22:33 /var/lib/gdm/.pulse/9987c5b50f134797b202165f43b10443-default-source 10663 4 -rw------- 1 gdm gdm 930 Aug 10 22:33 /var/lib/gdm/.ICEauthority .........
4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
[root@localhost ~]# find / -atime -7 \( -nouser -o -nogroup \) -ls find: ‘/proc/2924/task/2924/fd/6’: No such file or directory find: ‘/proc/2924/task/2924/fdinfo/6’: No such file or directory find: ‘/proc/2924/fd/6’: No such file or directory find: ‘/proc/2924/fdinfo/6’: No such file or directory 139610001 0 drwx------ 2 1000 1000 6 Aug 2 21:26 /tmp/.esd-1000 10683 0 drwxr-xr-x 2 1000 1000 6 Aug 2 21:26 /tmp/hsperfdata_nieda 10680 0 drwx------ 2 1000 1000 6 Aug 2 21:26 /tmp/tracker-extract-files.1000 10648 4 drwx------ 14 1000 1000 4096 Aug 2 21:26 /home/nieda 67136350 0 drwxr-xr-x 4 1000 1000 37 Aug 3 06:08 /home/nieda/.mozilla 139173477 0 drwxr-xr-x 2 1000 1000 6 Jun 10 2014 /home/nieda/.mozilla/extensions 203103518 0 drwxr-xr-x 2 1000 1000 .........
5、查找/etc目录下大于1M且类型为普通文件的所有文件
[root@localhost ~]# find /etc/ -size -1M -type f |xargs ls -lh -rw-r--r--. 1 root root 0 Sep 10 2011 /etc/akonadi/mysql-local.conf -rw-------. 1 root root 0 Jul 27 2015 /etc/cron.deny -rw-------. 1 root root 0 Aug 3 06:08 /etc/crypttab -rw-------. 1 root lp 0 Nov 20 2015 /etc/cups/classes.conf -rw-r--r--. 1 root lp 0 Nov 20 2015 /etc/cups/client.conf -rw-r--r--. 1 root lp 0 Nov 20 2015 /etc/cups/lpoptions -rw-------. 1 root lp 0 Nov 20 2015 /etc/cups/printers.conf -rw-r--r--. 1 root root 0 Aug 12 2015 /etc/environment -rw-r--r--. 1 root root 0 Jun 7 2013 /etc/exports -rw-r--r--. 1 root root 0 Mar 6 2015 /etc/ghostscript/9.07/cidfmap.local -rw-r--r--. 1 root root 0 Mar 6 2015 /etc/ghostscript/9.07/CIDFnmap.local -rw-r--r--. 1 root root 0 Mar 6 2015 /etc/ghostscript/9.07/Fontmap.local -rw-r--r--. 1 root root 0 Jun 7 2013 /etc/motd -rw-------. 1 root root 0 Aug 3 06:10 /etc/.pwd.lock -rw-r--r--. 1 root root 0 Nov 20 2015 /etc/qemu-kvm/target-x86_64.conf -rw-r--r--. 1 root root 0 Nov 20 2015 /etc/security/console.apps/xserver -rw-------. 1 root root 0 Aug 18 2015 /etc/security/opasswd -rw-r--r--. 1 root root 0 Nov 21 2015 /etc/selinux/targeted/contexts/files/file_contexts.local -rw-r--r--. 1 root root 0 Nov 21 2015 /etc/selinux/targeted/contexts/files/file_contexts.subs -rw-------. 1 root root 0 Nov 21 2015 /etc/selinux/targeted/modules/active/netfilter_contexts -rw-r--r--. 1 root root 0 Nov 21 2015 /etc/selinux/targeted/modules/semanage.read.LOCK -rw-r--r--. 1 root root 0 Nov 21 2015 /etc/selinux/targeted/modules/semanage.trans.LOCK -rw-r--r--. 1 root root 0 Jun 10 2014 /etc/sysconfig/run-parts -rw-r--r--. 1 root root 0 Jun 10 2014 /etc/wvdial.conf
6、查找/etc目录下所有用户都没有写权限的文件
[root@localhost ~]# find /etc/ -not -perm /222 -ls 134499699 196 -r--r--r-- 1 root root 198453 Aug 3 06:09 /etc/pki/ca-trust/extracted/java/cacerts 201850195 352 -r--r--r-- 1 root root 359773 Aug 3 06:09 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt 330861 264 -r--r--r-- 1 root root 266702 Aug 3 06:09 /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem 330862 216 -r--r--r-- 1 root root 217510 Aug 3 06:09 /etc/pki/ca-trust/extracted/pem/email-ca-bundle.pem 330863 208 -r--r--r-- 1 root root 211626 Aug 3 06:09 /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem 625260 4 -r-------- 1 root root 45 Aug 3 06:09 /etc/openldap/certs/password 136242234 4 ---------- 1 root root 785 Aug 16 2016 /etc/gshadow 134317908 4 ---------- 1 root root 795 Aug 13 18:26 /etc/gshadow- 134317916 4 ---------- 1 root root 1303 Aug 16 2016 /etc/shadow- 136242221 4 ---------- 1 root root 1183 Aug 16 2016 /etc/shadow 1058222 4 -r--r--r-- 1 root root 531 Sep 6 2015 /etc/lvm/profile/cache-mq.profile 1058223 4 -r--r--r-- 1 root root 338 Sep 6 2015 /etc/lvm/profile/cache-smq.profile 1058224 4 -r--r--r-- 1 root root 2249 Nov 21 2015 /etc/lvm/profile/command_profile_template.profile 1058225 4 -r--r--r-- 1 root root 828 Nov 21 2015 /etc/lvm/profile/metadata_profile_template.profile 1058226 4 -r--r--r-- 1 root root 76 Sep 6 2015 /etc/lvm/profile/thin-generic.profile 1058227 4 -r--r--r-- 1 root root 80 Sep 6 2015 /etc/lvm/profile/thin-performance.profile 136009869 4 -r--r--r-- 1 root root 460 Nov 20 2015 /etc/dbus-1/system.d/cups.conf 1788506 4 -r--r--r-- 1 root root 63 Nov 20 2015 /etc/ld.so.conf.d/kernel-3.10.0-327.el7.x86_64.conf 139173483 6852 -r--r--r-- 1 root root 7014922 Aug 3 06:18 /etc/udev/hwdb.bin 135840874 4 -r--r--r-- 1 root root 33 Aug 3 06:10 /etc/machine-id 1058267 4 -r--r--r-- 1 root root 146 Nov 20 2015 /etc/pam.d/cups 139259112 8 -r--r----- 1 root root 4188 Jul 7 2015 /etc/sudoers
7、查找/etc目录下至少有一类用户没有执行权限的文件
[root@localhost etc]# find /etc/ -not -perm -111 -ls
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
[root@localhost etc]# find /etc/init.d -perm -113 -ls 134370978 0 lrwxrwxrwx 1 root root 11 Aug 3 06:08 /etc/init.d -> rc.d/init.d [root@localhost etc]# ls /etc/init.d/ -l total 32 -rw-r--r--. 1 root root 13948 Sep 16 2015 functions -rwxr-xr-x. 1 root root 2989 Sep 16 2015 netconsole -rwxr-xrwx. 1 root root 6630 Sep 16 2015 network -rw-r--r--. 1 root root 1160 Nov 20 2015 README [root@localhost etc]# find /etc/init.d/ -perm -113 -ls 203103221 8 -rwxr-xrwx 1 root root 6630 Sep 16 2015 /etc/init.d/network
注意:查找目录下的文件时,在目录的后面必须要加上/,否则将查看目录本身
转载于:https://blog.51cto.com/11551196/1837785