您好,登錄后才能下訂單哦!
一、腳本編程
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
注意:查找目錄下的文件時,在目錄的后面必須要加上/,否則將查看目錄本身
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。