跟馬哥學linux (lesson 8)awk & sed功能總結

一.awk

1.什麼是awk

awk 是一種程序語言. 它具有一般程序語言常見的功能。 
因awk語言具有某些特點, 如 : 使用直譯器(Interpreter)不需先行編譯; 變量無類型之分(Typeless), 可使用文字當數組的下標(Associative Array)...等特色. 因此, 使用awk撰寫程序比起使用其它語言更簡潔便利且節省時間. awk還具有一些內建功能, 使得awk善於處理具數據行(Record), 字段(Field)型態的資料; 此外, awk內建有pipe的功能, 可將處理中的數據傳送給外部的 Shell命令加以處理, 再將Shell命令處理後的數據傳回awk程序, 這個特點也使得awk程序很容易使用系統資源。

2.awk語法

SYNOPSIS  

awk [options] 'program' file file ...  
awk [options] 'PATTERN{action}' file file ...    

注:linux版本的awk爲一個軟鏈接,鏈接到gawk

Pattern:一般常使用 "關係表達式"(Relational expression) 來充當

Actions:是由許多awk指令構成 包含:print, printf

3.awk內建變量

變量名變量說明
$0整個一行
$1第一個字段
$2第二個字段
NF字段數
NR行數,所有文件的一併計數
FNR行數,各文件分別計數
ARGV數組,保存命令本身這個字符
ARGC保存awk命令中參數的個數
FILENAME正在處理的當前文件的名稱


自定義變量:

-v VAR_NAME=VALUE

變量名區分字符大小寫;

(1) 可以program中定義變量;  
(2) 可以命令行中通過-v選項自定義變量;

4.printf

命令的使用格式:printf format, item1, item2,...

(1) 要指定format;  
(2) 不會自動換行;如需換行則需要給出\n    
(3) format用於爲後面的每個item指定其輸出格式;

format格式的指示符都%開頭,後跟一個字符:  
%c: 顯示字符的ASCII碼;    
%d, %i: 十進制整數;    
%e, %E: 科學計數法顯示數值;    
%f: 顯示浮點數;    
%g, %G: 以科學計數法格式或浮點數格式顯示數值;    
%s: 顯示字符串;

%u: 顯示無符號整數;  
%%: 顯示%自身;

修飾符:  
#:顯示寬度    
-:左對齊    
+:顯示數值的符號    
.#: 取值精度

image    

5.awk輸出重定向

將awk輸出的結果直接寫入文件

print items > output-file  
print items >> output-file

例  
image

 

6.模式

(1) Regexp: 格式爲/PATTERN/  
僅處理被/PATTERN/匹配到的行;    
(2) Expression: 表達式,其結果爲非0或非空字符串時滿足條件;    
僅處理滿足條件的行;    
(3) Ranges: 行範圍,此前地址定界,    
NR    
僅處理範圍內的行    
(4) BEGIN/END: 特殊模式,僅在awk命令的program運行之前(BEGIN)或運行之後(END)執行一次;    
(5) Empty:空模式,匹配任意行;

image

image

7.

action

(1) Expressions  
(2) Control statements    
(3) Compound statements    
(4) input statements    
(5) output statements

8.控制語句

if—else

格式:if (condition) {then body} else {else body}

image

while  
            格式:while (condition) {while body}

image

注:沒有設置結束條件容易產生死循環

do-while循環  
            格式:do {do-while body} while (condition)

for循環  
            格式:for (variable assignment; condition; iteration process) {for body}

image

case語句  
            語法:switch (expression) {case VALUE or /RGEEXP/: statement1;... default: stementN}

 

二.sed

1.sed簡介

sed 是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並沒有 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操作;編寫轉換程序等。

2.sed語法

sed [options] 'command' file(s)  
sed [options] -f scriptfile file(s) 

3. 元字符集

^:錨定行的開始 如:/^sed/匹配所有以sed開頭的行。   
$:錨定行的結束 如:/sed$/匹配所有以sed結尾的行。   
.:匹配一個非換行符的字符 如:/s.d/匹配s後接一個任意字符,然後是d。   
*:匹配零或多個字符 如:/*sed/匹配所有模板是一個或多個空格後緊跟sed的行。 
[]:匹配一個指定範圍內的字符,如/[Ss]ed/匹配sed和Sed。 
[^]:匹配一個不在指定範圍內的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行。 
\(..\):保存匹配的字符,如s/\(love\)able/\1rs,loveable被替換成lovers。 
&:保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**。   
\< :錨定單詞的開始,如:/\<love/匹配包含以love開頭的單詞的行。   
\>  :錨定單詞的結束,如/love\>/匹配包含以love結尾的單詞的行。   
x\{m\} :重複字符x,m次,如:/0\{5\}/匹配包含5個o的行。   
x\{m,\} :重複字符x,至少m次,如:/o\{5,\}/匹配至少有5個o的行。   
x\{m,n\} :重複字符x,至少m次,不多於n次,如:/o\{5,10\}/匹配5--10個o的行。 

4.vim編輯中文本的查找替換:

地址定界s/要查找的內容/替換爲的內容/  
要查找的內容:可使用正則表達式    
替換爲的內容:不支持正則表達式,但支持引用前面正則表達式分組中的內容    
地址定界:%, startline,endline

5.sed工作機制

每次讀取一行文本至“模式空間(pattern space)”中,在模式空間中完成處理;將處理結果輸出至標準輸出設備;

-r: 支持擴展正則表達式;  
-n: 靜默模式;    
-e script1 -e script2 -e script3:指定多腳本運行;    
-f /path/to/script_file:從指定的文件中讀取腳本並運行;    
-i: 直接修改源文件;

6.sed編輯命令

d 刪除

s 替換 %爲全部文件

i 插入,直接編輯文件

a 附加

7.練習

(1) 刪除/boot/grub/grub.conf文件中所有行的行首的空白字符;

image    
(2) 刪除/etc/fstab文件中所有以#開頭,後跟至少一個空白字符的行的行首的#和空白字符;

image    
(3) 把/etc/fstab文件的奇數行另存爲/tmp/fstab.3;

image    
(4) echo一個文件路徑給sed命令,取出其基名;進一步地,取出其路徑名;

image

image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章