linux du -sh 脚本,Linux之shell脚本(2)
Linux之shell腳本(2)
一、printf命令:
printf是一個(gè)把從標(biāo)準(zhǔn)輸入的字符按照你所要求的格式輸出到標(biāo)準(zhǔn)輸出即屏幕的命令.在很多時(shí)候,我們可能需要將自己的數(shù)據(jù)給他格式化輸出的。
1.格式化輸出。(print ?format)
2.命令格式:printf'打印格式'實(shí)際內(nèi)容
3.打印格式:
1)\a(警告聲音輸出)
2)\b(退格鍵)
3)\f(清除屏幕,類似換紙)
4)\n(輸出新的一行)
5)\r(幀處于行的開始,即enter鍵)
6)\t(水平的table鍵)
7)\v(垂直的table鍵)
8)\xNN(x為ASCII碼十六進(jìn)制表示;NN為倆位數(shù)數(shù)字;可轉(zhuǎn)換數(shù)字成為字符)
9)%ns(n為數(shù)字;s代表string,即多少個(gè)字符)
10)%ni(n為數(shù)字;i代表integer,即多少整數(shù)字符)
11)%N.nf(n、N為數(shù)字;f代表floating浮點(diǎn),小數(shù)字?jǐn)?shù)即小數(shù)點(diǎn))
案例:
1)以整數(shù)形式輸出23并換行,以字符串形式輸出hello并換行
2)以2位整數(shù)形式輸出23并換行,以7位字符串形式輸出hello并換行
案例文本:
考試分?jǐn)?shù)的輸出:假設(shè)有一個(gè)文件test.txt記錄著考試分?jǐn)?shù),內(nèi)容如下圖所示:
3)如下圖所示,printf命令的輸出結(jié)果并沒(méi)有對(duì)齊,%s代表一個(gè)不固定長(zhǎng)度的字符串,而字符串與字符串中間就以\t這個(gè)[tab]分隔符來(lái)處理。既然每個(gè)字段的長(zhǎng)度不固定會(huì)造成上述的困擾,那我將每個(gè)字段固定就好啦。
將test.txt文件中的內(nèi)容,分別以字符串、整數(shù)、小數(shù)點(diǎn)來(lái)顯示:
上面的格式共分為五個(gè)字段,%10s代表的是一個(gè)長(zhǎng)度為10個(gè)字符的字符串字段,%5i代表的是長(zhǎng)度為5個(gè)字符的數(shù)字字段,至于那個(gè)%8.2f則代表長(zhǎng)度為8個(gè)字符的具有小數(shù)點(diǎn)的字段,其中小數(shù)點(diǎn)有兩個(gè)字符寬度;全部的寬度僅有8個(gè)字符,整數(shù)部分占有5個(gè)字符,小數(shù)點(diǎn)本身(.)占一位,小數(shù)點(diǎn)后的位數(shù)則有兩位。
二、awk命令:
awk也是一個(gè)數(shù)據(jù)處理工具!相較于sed常常作用于一整個(gè)行的處理,awk則比較傾向于一行當(dāng)中分成數(shù)個(gè)字段來(lái)處理。
.awk語(yǔ)言的最基本功能是在文件或字符串中基于指定規(guī)則來(lái)分解抽取信息,也可以基于指定的規(guī)則來(lái)輸出數(shù)據(jù)。
有三種方式調(diào)用awk
1)命令行方式
awk ??[-F ?field-separator] ?'commands'input-files
其中,[-F域分隔符]是可選的,因?yàn)閍wk使用空格或tab鍵作為缺省的域分隔符,因此如果要瀏覽域間有空格的文本,不必指定這個(gè)選項(xiàng),如果要瀏覽諸如passwd文件,此文件各域以冒號(hào)作為分隔符,則必須指明-F選項(xiàng),如:awk -F: 'commands' input-file。
注:在linux系統(tǒng)中用環(huán)境變量IFS存儲(chǔ)分隔符,但根據(jù)實(shí)際應(yīng)用也可以改變IFS的值.
例如:查看默認(rèn)分隔符。
注意:oldIFS=$IFS(把環(huán)境變量IFS存到oldIFS)
IFS=","(定義分隔符為,)
2)shel腳本方式
將所有的awk命令插入一個(gè)文件,并使awk程序可執(zhí)行,然后awk命令解釋器作為腳本的首行,以便通過(guò)鍵入腳本名稱來(lái)調(diào)用。
相當(dāng)于shell腳本首行的:#!/bin/sh可以換成:#!/bin/awk
3)將所有的awk命令插入一個(gè)單獨(dú)文件,然后調(diào)用:
Awk-fawk-script-fileinput-files
其中,-f選項(xiàng)加載awk-script-file中的awk腳本,input-files跟上面的是一樣的。
awk的模式和動(dòng)作
任何awk語(yǔ)句都由模式和動(dòng)作組成(awk_pattern { actions })。在一個(gè)awk腳本中可能有許多語(yǔ)句。
模式部分決定動(dòng)作語(yǔ)句何時(shí)觸發(fā)及觸發(fā)事件。處理即對(duì)數(shù)據(jù)進(jìn)行的操作。如果省略模式部分,動(dòng)作將時(shí)刻保持執(zhí)行狀態(tài)。即省略時(shí)不對(duì)輸入記錄進(jìn)行匹配比較就執(zhí)行相應(yīng)的actions。
模式可以是任何條件語(yǔ)句或正則表達(dá)式等。awk_pattern可以是以下幾種類型:
①正則表達(dá)式(/regexp/)
②布爾表達(dá)式用作awk_pattern,表達(dá)式成立時(shí),觸發(fā)相應(yīng)的actions執(zhí)行。
(1)表達(dá)式中可以使用變量(如字段變量$1,$2等)和/regexp/
(2)布爾表達(dá)式中的操作符:
關(guān)系操作符:< > <= >= == !=匹配操作符: value ~ /regexp/ 如果value匹配/regexp/,則返回真value !~ /regexp/ 如果value不匹配/regexp/,則返回真
(3)&&(與)和||(或)可以連接兩個(gè)/regexp/或者布爾表達(dá)式,構(gòu)成混合表達(dá)式。!(非)可以用于布爾表達(dá)式或者/regexp/之前。
例如:提取test.txt中chinese大于75為優(yōu)秀。
例如:提取passwd中匹配d開頭的顯示ok。
例如:模式包括兩個(gè)特殊字段BEGIN和END。使用BEGIN語(yǔ)句設(shè)置計(jì)數(shù)和打印頭。BEGIN語(yǔ)句使用在任何文本瀏覽動(dòng)作之前,之后文本瀏覽動(dòng)作依據(jù)輸入文本開始執(zhí)行。END語(yǔ)句用來(lái)在awk完成文本瀏覽動(dòng)作后打印輸出文本總數(shù)和結(jié)尾狀態(tài)標(biāo)志。
動(dòng)作:
實(shí)際動(dòng)作在大括號(hào){}內(nèi)指明。動(dòng)作大多數(shù)用來(lái)打印,但是還有些更長(zhǎng)的代碼諸如i f和循環(huán)語(yǔ)句及循環(huán)退出結(jié)構(gòu)。如果不指明采取動(dòng)作,awk將打印出所有瀏覽出來(lái)的記錄。
awk執(zhí)行時(shí),其瀏覽域標(biāo)記為$1,$2...$n。這種方法稱為域標(biāo)識(shí)。使用這些域標(biāo)識(shí)將更容易對(duì)域進(jìn)行進(jìn)一步處理。
使用$1 , $3表示參照第1和第3域,注意這里用逗號(hào)做域分隔。如果希望打印一個(gè)有5個(gè)域的記錄的所有域,不必指明$1 , $2 , $3 , $4 , $5,可使用$0,意即所有域。為打印一個(gè)域或所有域,使用print命令。這是一個(gè)awk動(dòng)作
awk的運(yùn)行過(guò)程:
①如果BEGIN 區(qū)塊存在,awk執(zhí)行它指定的actions。
②awk從輸入文件中讀取一行,稱為一條輸入記錄。(如果輸入文件省略,將從標(biāo)準(zhǔn)輸入讀取)
③awk將讀入的記錄分割成字段,將第1個(gè)字段放入變量$1中,第2個(gè)字段放入$2,以此類推。$0表示整條記錄。
④把當(dāng)前輸入記錄依次與每一個(gè)awk_cmd中awk_pattern比較,看是否匹配,如果相匹配,就執(zhí)行對(duì)應(yīng)的actions。如果不匹配,就跳過(guò)對(duì)應(yīng)的actions,直到比較完所有的awk_cmd。
⑤當(dāng)一條輸入記錄比較了所有的awk_cmd后,awk讀取輸入的下一行,繼續(xù)重復(fù)步驟③和④,這個(gè)過(guò)程一直持續(xù),直到awk讀取到文件尾。
⑥當(dāng)awk讀完所有的輸入行后,如果存在END,就執(zhí)行相應(yīng)的actions。
awk入門實(shí)例:
例1:顯示/etc/passwd文件中用戶名和登錄shell
例2:顯示/etc/passwd文件中用戶名和登錄shell,中間以tab分隔
例3:顯示/etc/passwd文件中用戶名和登錄shell,中間以逗號(hào)分隔
例4:顯示/etc/passwd文件中UID大于500的所有用戶的用戶名和登錄shell
例5:顯示/etc/passwd文件中的UID大于500的用戶名和登錄shell,而賬戶與shell之間以逗號(hào)分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。
注意:
1.awk后面接兩個(gè)單引號(hào)并加上大括號(hào){}來(lái)設(shè)定想要對(duì)數(shù)據(jù)進(jìn)行的處理動(dòng)作
2.awk工作流程是這樣的:先執(zhí)行BEGING,然后讀取文件,讀入有\(zhòng)n換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個(gè)域,$n表示第n個(gè)域,隨后開始執(zhí)行模式所對(duì)應(yīng)的動(dòng)作。接著開始讀入第二條記錄······直到所有的記錄都讀完,最后執(zhí)行END操作。
六、函數(shù)及腳本的綜合應(yīng)用
1、shell函數(shù):shell允許將一組命令集或語(yǔ)句形成一個(gè)可用塊,這些塊稱為shell函數(shù)。
函數(shù)由兩部分組成:函數(shù)標(biāo)題、函數(shù)體。
標(biāo)題是函數(shù)名。函數(shù)體是函數(shù)內(nèi)的命令集合。
標(biāo)題名應(yīng)該唯一;如果不是,將會(huì)混淆結(jié)果,因?yàn)槟_本在查看調(diào)用腳本前將首先搜索函數(shù)調(diào)用相應(yīng)的shell。
2、定義函數(shù)的格式為:
函數(shù)名(){
命令1
...
}
如果愿意,可在函數(shù)名前加上關(guān)鍵字function,這取決于使用者。
function函數(shù)名()
{
命令1
...
}
例如:
腳本案例:
案例一、刪除文件中的空行:
這個(gè)腳本(腳本名為del.lines)可以處理一個(gè)或多個(gè)文件。每個(gè)文件在用sed刪除空行之前要先核實(shí)是否存在。
sed的輸出被導(dǎo)入一個(gè)文件名中含有$ $的臨時(shí)文件,最后這個(gè)臨時(shí)文件又被移回到原來(lái)的文件中。
該腳本使用shift命令取得所有的文件名,用while循環(huán)逐個(gè)處理所有的文件,直至處理完
為止。可以使用del.lines --help獲得一個(gè)簡(jiǎn)短的幫助
chmod ?+x ?del.lines,增加執(zhí)行權(quán)限,
測(cè)試如下:
注:
1、basename命令能夠從路徑中分離出文件名。通常用于shell腳本中
2、shift語(yǔ)句用于遷移位置變量,將 $1~$9 依次向左傳遞
例如,若當(dāng)前腳本程序獲得的位置變量如下:
$1=file1、$2=file2、$3=file3、$4=file4
則執(zhí)行一次shift命令后,各位置變量為:
$1=file2、$2=file3、$3=file4
再次執(zhí)行shift命令后,各位置變量為:
$1=file3、$2=file4
案例二、日志文件超過(guò)長(zhǎng)度,備份,清除內(nèi)容:
腳本內(nèi)容
注:du 并不是顯示文件的實(shí)際大小,而是顯示文件所占用的block大小,默認(rèn)linux系統(tǒng)分區(qū)的block size是4k,也就是說(shuō)即使文件只有1個(gè)字節(jié),也會(huì)占用4k.ls -l則是文件的實(shí)際大小。
總結(jié)
以上是生活随笔為你收集整理的linux du -sh 脚本,Linux之shell脚本(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: webservice 服务器无法处理请求
- 下一篇: linux下c标准库位置,C 标准库 I