运维基础(8)shell脚本
歡迎關(guān)注微信公眾號【廈門微思網(wǎng)絡(luò)】。www.xmws.cn專業(yè)IT認證培訓(xùn)19周年
主要課程:思科、華為、紅帽、ORACLE、VMware、CISP、PMP等認證培訓(xùn)及考證
shell 中各個命令的區(qū)別
?01 xargs作用
(1)將前一個命令的標準輸出傳遞給下一個命令,作為它的參數(shù),xargs的默認命令是echo,空格是默認定界符
(2)將多行輸入轉(zhuǎn)換為單行
?02 使用模式
front?command?|?xargs?-option?later?command
front command:前一個命令
-option:xargs的選項
later command:后一個命令
一般與管道“|”結(jié)合使用
03 xargs常用選項
-n:指定一次處理的參數(shù)個數(shù)
-d:自定義參數(shù)界定符
-p:詢問是否運行 later command 參數(shù)
-t :表示先打印命令,然后再執(zhí)行
-i :逐項處理
…更多參數(shù)查看man xargs
04 xargs與管道的區(qū)別
管道“|” 用來將前一個命令的標準輸出傳遞到下一個命令的標準輸入。
xargs 將前一個命令的標準輸出傳遞給下一個命令,作為它的參數(shù)。
可見,標準輸入與命令參數(shù)是不同的。個人理解,命令參數(shù)就是直接跟在命令后面的,標準輸入可以是鍵盤,文件等。
所以,管道符 | 所傳遞給程序的不是簡單地在程序名后面輸入的參數(shù),它們會被程序內(nèi)部的讀取功能如scanf和gets等接收,而xargs則是將內(nèi)容作為普通的參數(shù)傳遞給程序,相當于直接跟在命令后面。況且,有些命令是不接受標準輸入的,比如kill,rm等命令。
總結(jié):管道符后不加xargs相當于先將xargs后面的命令回車執(zhí)行一下再從鍵盤里輸入管道符前面命令執(zhí)行的結(jié)果內(nèi)容
加上xargs 相當于執(zhí)行命令(xargs后面的命令)后,直接從鍵盤輸入管道符前面命令執(zhí)行的結(jié)果內(nèi)容再回車,即管道前面的結(jié)果直接跟在xargs 后面的命令后面
再總結(jié)一下,就是回車的先后順序不太一樣。
?05 xargs與-exec的區(qū)別
-exec:{}表示命令的參數(shù)即為所找到的文件,以;表示comman命令的結(jié)束。\是轉(zhuǎn)義符,因為分號在命令中還有它用途,所以就用一個\來限定表示這是一個分號而不是表示其它意思。
-ok:和 -exec 的作用相同,格式也一樣,只不過以一種更為安全的模式來執(zhí)行該參數(shù)所給出的shell給出的這個命令之前,都會給出提示,讓用戶來確定是否執(zhí)行。
xargs將參數(shù)一次傳給echo,即執(zhí)行:echo begin ./xargs.txt ./args.txt
find?.?-name?'*.txt'?-type?f?|?xargs?echo?begin
exec一次傳遞一個參數(shù),即執(zhí)行:echo begin ./xargs.txt;echo begin ./args.txt
find?.?-name?'*.txt'?-type?f?-exec?echo?begin?{}?\;
xargs 要結(jié)合管道來完成
格式:find [option] express |xargs command
很明顯,exec是對每個找到的文件執(zhí)行一次命令,除非這單個的文件名超過了幾k,否則不會出現(xiàn)命令行超長出報錯的問題。
而xargs是把所有找到的文件名一股腦的轉(zhuǎn)給命令。當文件很多時,這些文件名組合成的命令行參數(shù)很容易超長,導(dǎo)致命令出錯。
另外, find | xargs 這種組合在處理有空格字符的文件名時也會出錯,因為這時執(zhí)行的命令已經(jīng)不知道哪些是分割符、哪些是文件名中的空格!而用exec則不會有這個問題。
總結(jié)
相比之下,也不難看出各自的缺點。
(1)exec 每處理一個文件或者目錄,它都需要啟動一次命令,效率不好;
(2)exec 格式麻煩,必須用 {} 做文件的代位符,必須用 \; 作為命令的結(jié)束符,書寫不便。
(3)xargs 不能操作文件名有空格的文件;
(4)exec參數(shù)是一個一個傳遞的,傳遞一個參數(shù)執(zhí)行一次命令;xargs一次將參數(shù)傳給命令,可以使用-n控制參數(shù)個數(shù)。
(5)exec文件名有空格等特殊字符也能處理;xargs不能處理特殊文件名,如果想處理特殊文件名需要特殊處理
綜上,如果要使用的命令支持一次處理多個文件,并且也知道這些文件里沒有帶空格的文件,那么使用 xargs比較方便; 否則,就要用 exec了。
常用shell腳本實例
?01 用shell腳本批量建立Linux用戶
實現(xiàn)要求:創(chuàng)建用戶student1到student50,指定組為student組!而且每個用戶需要設(shè)定一個不同的密碼!
腳本實現(xiàn)如下:
說明:
Linux下 Passwd有參數(shù)--stdin This option is used to indicate that passwd should read the new password from standard input, which can be a pipe.
所以linux下自動改變用戶密碼的辦法就是:Echo 密碼 |passwd –stdin 用戶名
說明:
echo -n 不換行輸出:
$echo -n "123"
$echo "456"
最終輸出 123456
而不是
123
456
?echo -e 處理特殊字符:?\n 換行且光標移至行首
?
ok,就這么一個簡單的腳本,就可以再系統(tǒng)里批量生成賬號了。而且密碼跟賬號的名字一樣。
這就是for do done語句用法。
?02 編寫shell腳本
將/usr/local/test目錄下大于100k的文件轉(zhuǎn)移到/tmp目錄下:
03 通過apache訪問日志access.log 統(tǒng)計IP和每個地址訪問的次數(shù),按訪問量列出前10名。
日志格式樣例如下:
192.168.1.247 ?---【02/jul/2010:23:44:59 + 8080 】 "GET /HTTP/1/1" ? 200 19
答案:
cat ?access.log | awk '{print ?$1}' |sort| uniq -c |sort -rn |head -10(uniq 參數(shù)說明:– c 顯示輸出中,在每行行首加上本行在文件中連續(xù)出現(xiàn)的次數(shù)。
sort參數(shù)說明:sort默認的排序方式是升序,-r 參數(shù)就會改變成倒敘;你有沒有遇到過10比2小的情況。我反正遇到過。出現(xiàn)這種情況是由于排序程序?qū)⑦@些數(shù)字按字符來排序了,排序程序會先比較1和2,顯然1小,所以就將10放在2前面嘍。這也是sort的一貫作風。)
04 一臺監(jiān)控主機,一臺被監(jiān)控主機
被監(jiān)控主機分區(qū)使用率大于80%,就發(fā)告警郵件。放到crontab里面,每10分鐘執(zhí)行一次。
a、 首先兩臺機器要建立服務(wù)器間的信任關(guān)系。
b、腳本:
05 監(jiān)控主機的磁盤空間
當使用空間超過90%就通過發(fā)mail來發(fā)警告:
06 自動ftp上傳 ?
07 編寫shell腳本,獲取本機的網(wǎng)絡(luò)地址。
比如:本機的ip地址是:
192.168.100.5/255.255.255.0
那么他的網(wǎng)絡(luò)地址是:
192.168.100.1/255.255.255.0
IP地址也可這樣獲取:IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "
子網(wǎng)掩碼:NETMASK= `ifconfig eth0 | grep "inet addr"|cut -f 4 -d ":"
?08 某系統(tǒng)管理員需要每天做一定的重復(fù)工作,編制一個解決方案:
(1)從下午4:50 刪除/abc 目錄下的全部子目錄和全部文件;
(2)從早上8:00~下午6:00 每小時讀取/xyz 目錄下x1 文件中每行第一個域的全部數(shù);據(jù)加入到/backup 目錄下的back01.txt 文件內(nèi);
(3)每逢周一下午5:50 將/data 目錄下的所有目錄和文件歸檔并壓縮為文件;backup.tar.gz;
(4)在下午5:55 將IDE 接口的CD-ROM 缷載(假設(shè)CD-ROM 的設(shè)備名為hdc);
(5)在早上8:00 前開機后啟動。
用vi創(chuàng)建編輯一個名為prgx的crontab文件;
prgx文件的內(nèi)容:
50 16 * * * rm -r /abc/*
0 8-18/1 * * * cut -f1 /xyz/x1 >> ?/backup/bak01.txt
50 17 * * * tar zcvf backup.tar.gz /data
55 17 * * * umount /dev/hdc
(c)超級用戶登錄,用crontab執(zhí)行 prgx文件中的內(nèi)容:
?root@xxx:#crontab prgx;在每日早晨8:00之前開機后即可自動啟動crontab
09 設(shè)計一個shell程序
添加一個新組為class1,然后添加屬于這個組的30個用戶,用戶名的形式為stdxx,其中xx從01到30?
10 編寫shell程序
實現(xiàn)自動刪除50個賬號的功能。賬號名為stud1至stud50。?
11 設(shè)計一個shell程序
在每月第一天備份并壓縮/etc目錄的所有內(nèi)容,存放在/root/bak目錄里,且文件名為如下形式y(tǒng)ymmdd_etc,yy為年,mm為月,dd為日。Shell程序fileback存放在/usr/bin目錄下。
參考答案:
(1)編寫shell程序fileback:?
(2)編寫任務(wù)定時器:?
echo "0 0 1 * * /bin/sh /usr/bin/fileback" >; /root/etcbakcron?
crontab /root/etcbakcron?
或使用crontab -e 命令添加定時任務(wù):?
0 1 * * * /bin/sh /usr/bin/fileback?
12 有一普通用戶想在每周日凌晨零點零分定期備份/user/backup到/tmp目錄下,該用戶應(yīng)如何做?
參考答案:
(1)第一種方法
用戶應(yīng)使用crontab –e 命令創(chuàng)建crontab文件。格式如下:?
0 0 * * sun cp –r /user/backup /tmp?
(2)第二種方法
用戶先在自己目錄下新建文件file,文件內(nèi)容如下:?
0 * * sun cp –r /user/backup /tmp?
然后執(zhí)行 crontab file 使生效。?
13 設(shè)計一個Shell程序
在/userdata目錄下建立50個目錄,即user1~user50,并設(shè)置每個目錄的權(quán)限,其中其他用戶的權(quán)限為:讀;文件所有者的權(quán)限為:讀、寫、執(zhí)行;文件所有者所在組的權(quán)限為:讀、執(zhí)行。?
參考答案:?
建立程序 Pro16如下:?
往期回顧:
運維基礎(chǔ)(1)Nginx
運維基礎(chǔ)(2)實用工具篇
運維基礎(chǔ)(3)備份篇
運維基礎(chǔ)(4)流量監(jiān)控工具篇
運維基礎(chǔ)(5)Ansible
運維基礎(chǔ)(6)CI / CD
運維基礎(chǔ)(7)Ansible Tower
總結(jié)
以上是生活随笔為你收集整理的运维基础(8)shell脚本的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 必看 | VLAN划分和网络配置实例
- 下一篇: 项目实战丨某高校校园网络升级改造方案