4第四章 Shell程式設計之sed與awk

2021-10-10 01:31:40 字數 3149 閱讀 7590

4第四章:shell程式設計之sed與awk

正規表示式分為:

基礎正規表示式

擴充套件正規表示式

基礎正規表示式:

常見的轉義字元

用法:例:echo -e 「abc\nbcd」

擴充套件正規表示式:

預設可以直接使用擴充套件正規表示式的命令:

awk如果需要sed和grep使用擴充套件正規表示式,則需要加額外選項:

sed -r

grep -e 或者egrep

示例:sed命令:

格式:sed [選項] 『(模式)(動作)』檔名

sed的程式構成:

模式空間:用於載入每一行資料,並且執行處理命令的記憶體空間

保持空間:只能用來存放資料,不能用於資料的處理的記憶體空間

注:保持空間中的資料可以和模式空間的資料相互交換

sed常用動作:

p:列印

d:刪除

s:替換

c:替換整行

r:讀取其他檔案中的資料內容到相應的行後

a:追加到指定行後

i:插入到指定行前

n:表示讀取下一行內容

h:將模式空間中的內容複製到保持空間(覆蓋)

h:將模式空間中的內容複製到保持空間(追加)

g:將保持空間的內容複製到模式空間(覆蓋)

g:將保持空間的內容複製到模式空間(追加)

=:列印行號

{}:將大括號中的動作看做是乙個整體,對前面的匹配模式執行

示例:awk命令:

檢視作業系統的系統版本:

cat /etc/redhat-release

或:cat /etc/centos-release

檢視作業系統的核心版本

uname -r

awk書寫的標準模式:

awk 【選項】 『模式 』 檔名

常用選項:

-f:指定列分隔符

–posix:可以使用{}的方式表示匹配次數

awk使用注意事項:

對於行的控制取決於模式

對於列的控制取決於動作

常見的預定義變數:

nr:行數

nf:列數

rs:記錄分隔符

示例:fs:字段分隔符

ors:輸出記錄分隔符

ofs:輸出字段分隔符

rs與ors的配合使用原理:

當awk命令在處理文字時,一讀到rs變數所指定的符號時,就會去執行ors所指定的符號

例:rs=「 」 //rs變數定義為空格

ors=「.」 //ors變數指定為冒號

則一旦awk在讀到空格的時候,就會在螢幕上列印乙個冒號

fs與ofs的配合使用原理:

當awk命令在處理文字時,一讀到fs變數所指定的符號時,就會記錄為乙個字段,當用print命令列印列的時候,如果碰到了,(逗號),在列印時,逗號會被轉換成ofs變數所定義的內容

例子:fs=「 」 //fs變數定義為空格

ofs=「.」 //ofs變數指定為冒號

awk 『begin(fs=」 」;ofs=」:」) 』 2.txt

輸出效果:

$1:$2:$3 //$1,$2,$3代表相應的內容,用ofs變數指定的冒號分隔

awk常用的組合命令:

sort:排序

常用選項:

-n:以數字大小排序

-r:降序排列(預設公升序)

uniq:去重

常用選項:

-c:去重的同時顯示重複的個數

補充命令:

tr:替換命令

格式:tr 「」 「」

awk命令完整格式:awk [選項] 『begin{} 【模式】 end{}』 檔名

begin模組的使用:(文字內容處理之前執行begin模組)

1、定義awk中將會使用到的變數

2、可以當做計算器使用

3、可以直接列印一些你想要的字元

注意:begin模組中的所有設定都算是動作的一種,比如變數的賦值,字串的列印都屬於動作,每個動作和動作紙質件用分號(;)分隔

注意:在awk命令中,所欲的字母或字母組成的單詞,直接使用他們時,都將會以呼叫變數的形式來處理(awk預設認為字母就是變數),如果需要列印普通的英文本元,則需要用雙引號(」」)括起來,單引號不行

end模組的使用:(在文字內容處理完成後執行end模組中的命令)

1、可以直接列印一些字串

2、可以統計文字的處理結果(需要配合遞增操作)

知識補充:

動作中可以使用整數函式進行整數計算:int()

awk中的流程控制語句:

流程控制語句在awk中均屬於動作,可以寫在begin模組,動作模組,end模組

for迴圈語句格式:

for(迴圈條件)

舉例:for(i=1;i<=10;i++)

if判斷語句格式:

if(條件)

舉例:if(nr>=2)

while迴圈語句格式:

while(迴圈條件)

舉例:while(i<=10)

awk陣列:

格式:陣列名[元素名]=值

應用:排序去重,統計數量(需要配合迴圈語句完成)

文件案例解析:

h[$2]=h[$2]+1

讀入第一行時:執行以下動作

h[www.etiantian.org]=h[www.etiantian.org]+1

讀完第一行後,陣列的值為:

h[www.etiantian.org]=1

讀入第二行時:執行以下動作

h[www.etiantian.org]=h[www.etiantian.org]+1

結果:h[www.etiantian.org]=2

讀入第三行時:執行以下動作

h[post.etiantian.org]=h[post.etiantian.org]+1

結果:h[post.etiantian.org]=1

讀入第四行時:執行以下動作

h[***.etiantian.org]=h[***.etiantian.org]+1

結果:h[***.etiantian.org]=1

最終結果:

h[www.etiantian.org]=3

h[post.etiantian.org]=2

h[***.etiantian.org]=1

第四章 程式設計

選擇語言的原則 最少的工作量原則 最少技巧性原則 最少錯誤原則 最少維護原則 減少記憶原則 總原則 先求正確後求快 先求清晰後求快 求快不忘保持程式正確性 保持程式整潔以求快 不要因效率而犧牲清晰 好程式標準 易於測試和除錯 易於維護 易於修改 設計簡單 高效率結構化程式設計主要包括兩方面 在編寫程...

程式設計珠璣第四章

正文裡面涉及到程式設計方法學的內容。不再細述 1 加及條件是0 l u n 1 2 這個函式可以寫成如下形式 int bs int a,int begin,int end,int v if e a end e v return e a return 1 再給一段測試 include include ...

MFC Windows 程式設計 第四章 選單

編譯一次後就不用再編譯了,而已加快程式編譯速度,一般將不更改的標頭檔案 c執行時標頭檔案和其他靜態型別標頭檔案包含在裡面。2 基於檢視的應用程式體系結構wm paint和使用者區滑鼠訊息 鍵盤訊息處理程式都必須在檢視中進行處理,所有在框架視窗使用onsetfocus 焦點傳遞給檢視 和過載oncmd...