一、選擇執行(條件判斷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.www58058.com/36470
文章結構層次清晰,排版很精美,f有理論也有實踐,對腳本的語法總結很詳細,可以運用所學的腳本只是實現具體的功能來加深自己對腳本點理解。