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