一、选择执行(条件判断if)
流程控制
过程式编程语言: 顺序执行 选择执行 循环执行
使用read 命令来接受输入
使用read 来把输入值分配给一个或多个shell变量: -p 指定要显示的提示 -t TIMEOUT read 从标准输入中读取值,给每个单词分配一个变量所有剩余单词都被分配给最后一个变量 read -p “Enter a filename: “ FILE
条件选择if 语句
选择执行: 注意:if 语可嵌套 单分支 if 判断条件:then 条件为真的分支代码 fi 双分支 if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 fi
if 语句
多分支 if CONDITION1 ; then 、 if-true elif CONDITION2 ; then if-ture elif CONDITION3 ; then if-ture ... else all-false fi 逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后 结束整个if语句
if实例
根据命令的退出状态来执行命令 if ping -c1 -W2 station1 &> /dev/null; then echo 'Station1 is UP' elif grep "station1" ~/maintenance.txt &> /dev/null then echo 'Station1 is undergoing maintenance‘ else echo 'Station1 is unexpectedly DOWN!' exit 1 fi
条件判断:case 语句 (离散值匹配)
case 用变量引用 in PAT1) 分支1 ;; PAT2) 分支2 ;; ... *) 默认分支 ;; esac case 支持glob 风格的通配符: *: 任意长度任意字符 ?: 任意单个字符 []:指定范围内的任意单个字符 a|b: a 或b case $1 in start) ;; stop) ;; restart) ;; status) ;; esac
二、文件查找
文件查找
在文件系统上查找符合条件的文件; 文件查找:locate, find 非实时查找( 数据库查找) :locate 实时查找:find
locate
查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db依赖于事先构建的索引 索引的构建是在系统较为空闲时自动进行( 周期性 任务), 管理员手动更新数据库(updatedb) 索引构建过程需要遍历整个根文件系统,极 消耗资源 工作特点: • 查找 速度 快 • 模糊 查找 • 非实时查找 • 搜索的是文件的全路径,不仅仅是文件名 • 可能只搜索用户具备读取和执行权限的目录
locate 命令
locate KEYWORD 有用的选项 • -i 执行区分大小写的搜索 • -n N 只列举前N 个匹配项目 locate foo • 搜索名称或路径中带有“foo ”的文件 locate -r ‘\.foo$’ • 使用Regex 来搜索以“.foo ”结尾的文件 ***注意*** locate 可以指定搜索范围,结果尾模糊搜索 [root@6 ~]# locate / .sh -r --regexp 为全局搜索,扩展正则表达式较精确查找 [root@6 ~]# locate -r '\.sh$' |wc -l
find
实时查找工具,通过遍历指定路径完成文件查找; 工作特点: • 查找速度略慢 • 精确查找 • 实时查找 • 可能只搜索用户具备读取和执行权限的目录 语法: find [OPTION]... [ 查找路径] [ 查找条件] [ 处理动作]查找路径:指定具体目标路径;默认为当前目录 查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件 处理动作:对符合条件的文件做操作,默认输出至屏幕
查找条件
根据文件名和inode 查找: -name " 文件名称" :支持使用glob *, ?, [], [^] “ ” 需要加引号 -iname " 文件名称" :不区分字母大小写 -inum n 按inode 号查找 -samefile name 相同inode号的文件 [root@6 bin]# find / -samefile /dev -ls -links n 链接数为n的文件 [root@6 bin]# find / -links 10 -regex "PATTERN" :以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称 [root@6 ~]# find / -regex '.*.sh$' /tmp/keyring-NSUSmG/socket.ssh /tmp/keyring-89q2lx/socket.ssh /tmp/keyring-YaRraG/socket.ssh /tmp/keyring-IuDmPE/socket.ssh /tmp/keyring-ZeIVAk/socket.ssh /tmp/keyring-9TFDWv/socket.ssh /tmp/keyring-nLuDLL/socket.ssh /tmp/keyring-DEtZIt/socket.ssh /tmp/keyring-BRIf2d/socket.ssh
查找条件
根据属主、属组查找: -user USERNAME :查找属主为指定用户(UID) 的文件 -group GRPNAME: 查找属组为指定组(GID) 的文件 -uid UserID :查找属主为指定的UID 号的文件 -gid GroupID :查找属组为指定的GID 号的文件 -nouser :查找没有属主的文件 -nogroup :查找没有属组的文件 find / -nouser -nogroup 并且 根据文件类型查找: -type TYPE: • f: 普通文件 • d: 目录文件 • l: 符号链接文件 • s :套接字文件 • b: 块设备文件 • c: 字符设备文件 • p: 管道文件 组合条件: 与:-a 或:-o 非:-not, ! find ! 德· 摩根 定律: (非 P) 或 (非 Q) = 非(P 且 Q) (非 P) 且 (非 Q) = 非(P 或 Q) 示例:
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
find 示例
find -name snow.png • 搜索名为snow.png 的文件 find -iname snow.png • 不分大小写地搜索名为snow.png 、Snow.png、 SNOW.PNG 等的文件 find / -name “*.txt” find /var –name “*log*” find -user joe -group joe 搜索被用户joe 以及组群joe 所拥有的文件 • find -user joe -not -group joe • find -user joe -o -user jane • find -not \( -user joe -o -user jane \) • find / -user joe -o -uid 500 找出/tmp 目录下,属主不是root,且文件名不以f 开头的文件 find /tmp \( -not -user root -a -not -name 'f*' \) -ls find /tmp -not \( -user root -o -name 'f*' \) –ls ***排除 目录 • 示例:查找/etc/ 下,除/etc/sane.d 目录的其它所有.conf 后缀的文件 find /etc -path ‘/etc/sane.d’ -a -prune -o -name “*.conf” -print [root@6 bin]# find /root -path '/root/bin' -a -prune -o -name "*.sh" 根据文件大小来查找: -size [+|-]#UNIT 常用单位:k, M, G #UNIT: (#-1, #] 如:6k 表示(5k,6k] -#UNIT :[0,#-1] 如: :-6k 表示[0,5k] +#UNIT :(#, ∞ ) 如: :+6k 表示(6k ,∞) -10k [0.9k] 10k (9,10k] +10k (10k,+∞) 根据时间戳: 以“天”为单位; -atime [+|-]#, #: [#,#+1) +#: [#+1, ∞ ] -#: [0,#) -mtime -ctime 以“分钟”为单位: -amin -mmin -cmin -atime -7 [0,7) -atime 7 [7,8) -atime +7 [8,+∞) 根据权限查找: -perm [/|-]MODE MODE: 精确权限匹配 /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即 可,或关系,+ 从centos7 开始淘汰 -MODE:每一类对象都必须同时拥有指定权限,与关系 0 表示不关注 020 • find -perm 755 会匹配权限模式恰好是755 的文件 • 只要当任意人有写权限时,find -perm +222 就会匹配 • 只有当每个人都有写权限时,find -perm -222 才会匹配 • 只有当其它人(other )有写权限时,find -perm -002才会匹配 find -perm /002 === find -perm -002 *** 摩根定律同样适用 • 只要当所有人都没有写权限时,find -not -perm +222 才会匹配 • 只有当任意人没有写权限时,find -not -perm -222 就会匹配 • 只有当其它人(other )没有写权限时,find -not -perm -002才会匹配
处理动作
-print :默认的处理动作,显示至屏幕; -ls :类似于对查找到的文件执行“ls -l” 命令 -delete :删除查找到的文件; -fls file:查找到的所有文件的长格式信息保存至指定文件中 -ok COMMAND {} \; 对查找到的每个文件执行由find -perm -222 -ok rm {} \; COMMAND 指定的命令;对于每个文件执行命令之前,都会交互式要求用户确认 -exec COMMAND {} \; 对查找到的每个文件执行由COMMAND 指定的命令 {}: 用于引用查找到的文件名称自身 [root@6 bin]# find /testdir/bin -regex '^.*\.sh$' -exec chmod 111 {} \; find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令 有些命令不能接受过多参数,此时命令执行可能会失败,下面方式可规避此问题 find | xargs COMMAND [root@6 bin]# find /testdir/bin -regex '^.*\.sh$' |xargs chmod 777
find 示例
find -name “*.conf” -exec cp {} {}.orig \; • 备份配置文件,添加.orig 这个扩展名find /tmp -ctime +3 -user joe -ok rm {} \; • 提示删除存在时间超过3天以上的joe 的临时文件find ~ -perm -002 -exec chmod o-w {} \; • 在你的主目录中寻找可被其它用户写入的文件find / data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \;find /home –type d -ls
Gnome 搜索工具
位置-> 搜索文件…… 图形化搜索工具,可搜索 • 命令 • 内容 • 用户/ 组群 • 大小 • 修改时间
三、压缩、解压缩及归档工具
file-roller compress/uncompress: .Zgzip/gunzip: .gzbzip2/bunzip2: .bz2xz/unxz: .xzzip/unzip tar cpio
compress/uncompress
compress [-dfvcVr] [-b maxbits] [file ...] -d: 解压缩,相当于 -c: 结果输出至标准输出, 不删除原文件 -v: 显示详情uncompress 解压缩 zcat file.Z >file
gzip/gunzip
gzip [OPTION]... FILE ... -d: 解压缩,相当于gunzip -c: 将压缩或解压缩的结果输出至标准输出 -# :1-9 ,指定压缩比,值越大压缩比越大zcat :不显示解压缩的前提下查看文本文件内容 实例: gzip -c messages >messages.gz gzip -c -d messages.gz > messages zcat messages.gz > messages
bzip2/bunzip2/bzcat
bzip2 [OPTION]... FILE ... -k: keep, 保留原文件 -d :解压缩 -# :1-9 ,压缩比,默认为6bzcat :不显式解压缩的前提下查看 文本文件内容
xz/unxz/xzcat
xz [OPTION]... FILE ... -k: keep, 保留 原文件 -d :解压缩 -# :1-9 ,压缩比,默认为6xzcat: 不显式解压缩的前提下查看 文本文件内容
zip/unzip
打包压缩 zip –r sysconfig sysconfig/ 解包解压缩 unzip sysconfig.zip cat /var/log/messages | zip message - unzip -p message > message
积累应用
1 、查找/var 目录下属主为root ,且属组为mail 的所有文件
find /var -user root -a -group mail -ls
[root@6 ~]# find /var -user root -a -group mail -ls 394580 4 drwxrwxr-x 2 root mail 4096 8月 16 09:30 /var/spool/mail 393528 16 -rw------- 1 root mail 13723 8月 16 09:30 /var/spool/mail/root 393317 4 -rw-rw---- 1 root mail 2444 7月 31 22:21 /var/spool/mail/lvasu
2 、查找/var 目录下不属于root 、lp 、gdm 的所有文件
find /var -not \( -user root -o -user lp -o -user gdm\) -ls
[root@6 ~]# find /var -not \( -user root -o -user lp -o -user gdm\) -ls find: “gdm)” is not the name of a known user [root@6 ~]# find /var -not \( -user root -o -user lp -o -user gdm \) -ls 402941 4 drwxr-xr-x 2 ntp ntp 4096 5月 12 04:04 /var/log/ntpstats 400971 0 -rw-r--r-- 1 rpcuser rpcuser 0 5月 11 14:22 /var/lib/nfs/state 659692 4 drwx------ 4 rpcuser rpcuser 4096 7月 20 17:13 /var/lib/nfs/statd 799382 4 drwx------ 2 rpcuser rpcuser 4096 5月 11 14:22 /var/lib/nfs/statd/sm 922887 4 drwx------ 2 rpcuser rpcuser 4096 5月 11 14:22 /var/lib/nfs/statd/sm.bak 1183280 4 drwx------ 2 pulse pulse 4096 2月 3 2016 /var/lib/pulse 1179932 4 drwx------ 2 apache apache 4096 5月 12 03:29 /var/lib/dav 1050630 4 drwxr-xr-x 2 ntp ntp 4096 5月 12 04:04 /var/lib/ntp
3 、查找/var目录下最近一周内其内容修改过,同时属主不为root ,也不是postfix 的文件
find /var -mtime -7 -not \( -user root -o -user postfix \) -ls
[root@6 ~]# find /var -mtime -7 -not \( -user root -o -user postfix \) -ls 1184780 4 drwx--x--x 2 gdm gdm 4096 8月 16 08:54 /var/run/gdm/auth-for-gdm-BmBwqG 1184791 4 -rw------- 1 gdm gdm 58 8月 16 08:54 /var/run/gdm/auth-for-gdm-BmBwqG/database 400934 4 dr-x--x--x 2 lp sys 4096 8月 16 08:54 /var/run/cups/certs 393310 4 -rw-r--r-- 1 rpcuser rpcuser 5 8月 16 08:54 /var/run/rpc.statd.pid 393565 0 -rw-rw---- 1 tom mail 0 8月 15 20:11 /var/spool/mail/tom 393276 4 -rw------- 1 rpc rpc 164 8月 15 22:15 /var/cache/rpcbind/portmap.xdr 393274 4 -rw------- 1 rpc rpc 852 8月 15 22:15 /var/cache/rpcbind/rpcbind.xdr
4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件
find / \( -nouser -o -nogroup \) -atime -7
[root@6 ~]# find / \( -nouser -o -nogroup \) -atime -7 -ls 666130 4 drwx------ 2 1001 1001 4096 8月 1 16:55 /home/ha2 666129 4 drwx------ 2 1000 1000 4096 8月 1 16:55 /home/ha1 666131 4 drwx------ 2 1002 1002 4096 8月 1 16:55 /home/ha3 666105 4 drwx------ 4 4322 4322 4096 8月 2 16:55 /home/app 666107 4 drwxr-xr-x 4 4322 4322 4096 7月 20 16:58 /home/app/.mozilla 666108 4 drwxr-xr-x 2 4322 4322 4096 8月 18 2010 /home/app/.mozilla/extensions 666109 4 drwxr-xr-x 2 4322 4322 4096 8月 18 2010 /home/app/.mozilla/plugins 666112 4 drwxr-xr-x 2 4322 4322 4096 11月 12 2010 /home/app/.gnome2
5 、查找/etc 目录下大于1M 且类型为普通文件的所有文件
find /etc -type f -size +1k
[root@6 ~]# find /etc -type f -size +1k -ls 2098541 8 -rw-r--r-- 1 root root 4922 5月 11 02:37 /etc/oddjobd.conf 2098686 4 -rw-r--r-- 1 root root 2108 11月 11 2010 /etc/bluetooth/main.conf 2098455 4 -rwxr-xr-x 1 root root 3078 5月 11 06:33 /etc/dhcp/dhclient.d/nis.sh 2098427 4 -rwxr-xr-x 1 root root 2140 1月 26 2016 /etc/dhcp/dhclient.d/ntp.sh 2097538 4 -rw-r--r-- 1 root root 1833 8月 2 16:32 /etc/login.defs 2098786 8 -rw-r--r-- 1 root root 6682 5月 11 02:41 /etc/screenrc
6 、查找/etc 目录下所有用户都没有写权限的文件
find /etc -not -perm /222
[root@6 ~]# find /etc -not -perm /222 -ls 2097528 4 -r-------- 1 root root 45 7月 20 17:00 /etc/openldap/certs/password 2097181 4 ---------- 1 root root 749 8月 15 08:57 /etc/gshadow- 2098680 4 -r--r--r-- 1 root root 324 5月 11 01:32 /etc/ld.so.conf.d/kernel-2.6.32-642.el6.x86_64.conf 2099393 4 -r--r----- 1 root root 3729 12月 8 2015 /etc/sudoers 2099204 4 -r--r--r-- 1 root root 76 2月 22 07:18 /etc/lvm/profile/thin-generic.profile 2099205 4 -r--r--r-- 1 root root 80 2月 22 07:18 /etc/lvm/profile/thin-performance.profile 2099201 4 -r--r--r-- 1 root root 338 2月 22 07:18 /etc/lvm/profile/cache-smq.profile 2099202 4 -r--r--r-- 1 root root 2391 5月 11 18:18 /etc/lvm/profile/command_profile_template.profile
7 、查找/etc 目录下至少有一类用户没有执行权限的文件
find /etc -not -perm -111
[root@6 ~]# find /etc -not -perm -111 -ls 2099350 4 -rw-r--r-- 1 root root 291 5月 11 06:10 /etc/rsyslog.d/spice-vdagentd.conf 2098425 4 drwxr-x--- 3 root root 4096 5月 12 03:22 /etc/dhcp 2097538 4 -rw-r--r-- 1 root root 1833 8月 2 16:32 /etc/login.defs 2098786 8 -rw-r--r-- 1 root root 6682 5月 11 02:41 /etc/screenrc 2098783 4 -rw-r--r-- 1 root root 98 8月 16 08:54 /etc/resolv.conf 2097522 4 -rw-r--r-- 1 root root 662 8月 29 2007 /etc/logrotate.conf
8 、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
find /etc/init.d/ -perm -111 -a -perm -002
find /etc/init.d/ -perm -113
[root@6 ~]# find /etc/init.d/ -perm -111 -a -perm -002 -ls 2098781 0 -rwxr-xrwx 1 root root 0 8月 16 12:45 /etc/init.d/a [root@6 ~]# find /etc/init.d/ -perm -113 /etc/init.d/a
原创文章,作者:lvasu,如若转载,请注明出处:http://www.178linux.com/36470
评论列表(1条)
文章结构层次清晰,排版很精美,f有理论也有实践,对脚本的语法总结很详细,可以运用所学的脚本只是实现具体的功能来加深自己对脚本点理解。