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