自學Linux Shell19.2-gawk程序高級特性

點擊返回 自學Linux命令行與Shell腳本之路html

19.2-gawk程序高級特性

linux世界中最普遍使用的兩個命令行編輯器:linux

  • sed
  • gawk

1. gawk使用變量

編程語言共有的特性是使用變量來存取值。gawk編程語言支持兩種不一樣類型的變量:正則表達式

  • 內建變量
  • 自定義變量

1.1 內建變量

gawk程序使用內建變量來引用程序數據裏的一些特殊功能。shell

1.1.1 字段和記錄分隔符變量編程

變量 描述
FIELDWIDTHS 由空格分隔開的定義了每一個數據字段確切寬度的一列數字
FS  輸入字段分隔符
RS                     輸入數據行分隔符/記錄分隔符
OFS                     輸出字段分隔符
ORS 輸出數據行分隔符/記錄分隔符
  •  變量FS OFS定義了gawk如何處理數據流中的數據字段
  •  變量RS ORS定義了gawk如何處理數據流中的記錄分隔行

 變量OFS時用在print命令的輸出上面, 默認狀況下gawk將OFS設置成空格。經過設置OFS的值,能夠再輸出中使用任意字符串來分割字段。數組

FIELDWIDTHS變量容許不使用字段分隔符來讀取記錄,一旦設置了FIELDWIDTHS變量,gawk就會忽略FS變量,並根據提供的字段寬度來計算字段。編程語言

 

默認狀況下,gawk將RS、ORS設爲換行符  。    默認RS代表輸入數據流中的每行新文本就是一條新紀錄。編輯器

典型例子就是,FS變量設置成換行符,代表數據流中的每行都是一個單獨的字段,每行的全部數據都屬於同一個字段。
       RS變量設置成空字符串,而後在數據記錄中留一個空白行,便是把每一個空白行當作一個記錄分隔符。函數

 1.1.2 數據變量spa

變量

描述

ARGC

出現的命令行參數的個數

ARGIND

當前正在處理的文件在ARGV中的索引

ARGV

命令行參數數組

CONVFMT

數字的轉換格式(參見printf語句)。默認值爲%.6g

ENVIRON

當前shell環境變量及其值的關聯數組

ERRNO

當讀取或關閉輸入文件時發生錯誤時的系統錯誤

FILENAME

用於輸入到gawk程序的數據文件的文件名

FNR

數據文件的當前記錄號

IGNORECASE

若是設置爲非0,則忽略gawk命令中使用的字符串的大小寫

NF

數據文件中數據字段的個數

NR

已處理的輸入記錄的個數

OFMT

顯示數字的輸出格式。默認爲%,6g

RLENGTH

匹配函數中匹配上的子字符串的長度

RSTART

匹配函數中匹配上的子字符串的開始索引

 

以上代表,AGRC變量代表命令行上面有兩個參數,gawk和adta.txt 。ARGV數組從索引0開始,ARGV[1]就是data.txt

1.2 自定義變量

  • gawk自定義變量名可使任意數目的字母、數字和下劃線,但不能以數字開頭
  • gawk變量名區分大小寫

 1.2.1 在腳本中給變量賦值

gawk程序給變量賦值跟在shell腳本中賦值相似,都用賦值語句。

gawk變量能夠保存數值或文本值,也可包含數學算式來處理數字值。

 

 1.2.2 在命令行上給變量賦值

gawk程序能夠在命令行上給變量賦值。

 

存在一個問題: 若設置了變量後,這個值在打碼的BEGIN部分不可用。

解決辦法:

可使用-v命令行參數,它容許你在BEGIN代碼以前設定變量,在命令行上,-v命令行參數必須放在腳本代碼以前。

2. gawk處理數組

關聯數組和數字數組不一樣之處就是它的索引值可使任意文本字符串。

關聯數組用各類字符串來引用值,每一個索引字符串都必須可以惟一地表示出賦給它的數據元素。

2.1 定義數組變量

1 var[index]= element  

index 是關聯數組的索引值,element是數據元素值。

2.2 遍歷數組變量

1 forvar in array)
2 {
3    statements
4 }
  • for循環會在每次循環時將數組array的下一個索引值賦值給變量var,而後執行一遍statements
  • 變量儲存的是索引值而不是數組元素值。
  • 索引值不會按任何特定的順序返回,但他們都能指定對應的數據元素值。

2.3 刪除數組變量

1 delete array[index]

刪除命令會從數組中刪除關聯索引值和相關的數據元素值。

 

3. gawk使用模式

3.1 正則表達式

 gawk使用正則表達式時,正則表達式必須出如今它要控制的程序腳本的左側花括號前面

 

以上正則表達式/11/匹配了數據字段中含有字符串11的記錄。

3.2 匹配操做符~ !

  • 匹配操做符容許將正則表達式限定在記錄中的特定數據字段。能夠指定匹配操做符、數據字段變量及要匹配的正則表達式。
  • 可使用!符號來排除正則表達式的匹配。

3.3 數學表達式

  •  可使用普通數學表達式,x == y; x<=y;x>y 等等
  • 也能夠對文本數據使用數學表達式,可是必定要徹底匹配(若無匹配,沒有任何記錄)

 

以上顯示腳本查看第4個數據字段含有值爲0的記錄,即顯示屬於root用戶組的系統用戶。

4. gawk使用結構化命令

4.1 gawk使用if語句

1 if (condition)
2    statement1
if (condition) statement1
1 if (condition)
2    statement1;
3 else
4    statement2
if (condition) statement1; else  statement2
  • 若是須要在if語句執行多條語句,必須用花括號將它們括起來
  • 不能混用if語句的花括號和用來表示程序腳本開始和結束的花括號
  • gawk的if語句支持else子句,容許在if語句條件不成立的狀況下執行一條或多條語句

4.2 gawk使用while語句

while (condition)
{
   statements
}
  • while循環容許遍歷一組數據,並檢查迭代的結束條件。
  • gawk容許在while循環內使用break和continue語句從循環內跳出。

4.3 gawk使用do - while語句

1 do
2 {
3   statements
4 } while (condition)

保證了語句在條件被求值以前至少執行一次。

4.4 gawk使用 for 語句(支持C風格的for循環)

1 for (variable assignment;condition;iteration process)

5. gawk使用格式化打印printf

 printf format, item1, item2, ...
  •  format是必須的;
  •  不會自動換行,需顯式給定行分隔符;
  •  format中須要分別爲後面的每一個item指定一個格式符;

 格式化指定符采用以下格式:

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

 除了以上控制字母,還有3中修飾符:

  • width 指定了輸出字符最小寬度的數字值
  • prec 一個數值,指定了浮點數中小數點後面的位數或者文本字符串中顯示的最大字符數
  • -(減號) 指明在向格式化空間中放入數據時採用左對齊仍是右對齊(默認是右對齊)

 

6. gawk經常使用的內建函數

6.1 gawk數學函數

  • exp(x)      x的指數函數
  • int(x)       x的整數部分
  • rand()      0至1之間的隨機浮點數

6.2 gawk字符串函數

  • asort(s [,d])           將數組s按數據元素值排序
  • index(s,t)              返回字符串t在字符串s中的索引值
  • length([s])             返回字符串s的長度

6.3 gawk時間函數

  • mktime(datespec)        將一個按YYYY MM DD HH MM SS格式的日期轉換成時間戳
  • systime()               返回當前時間的時間戳
  • strftime(format [,timestamp])         將時間戳轉成date()格式化日期

7. gawk自定義函數 

7.1 gawk自定義函數

1 function name([variables])
2 {
3    statements
4 }
  • name是用戶定義函數的名稱。
  • 函數名稱應以字符的字母而且其他部分能夠是數字,字母或下劃線的任意組合。
  • gawk的保留字不能被用做函數名稱。
  • 函數能夠接受以逗號分隔的多個參數。參數不是強制性的。咱們也能夠建立一個用戶定義的函數不帶任何參數。

7.2 gawk使用自定義函數

在定義函數時,必須出如今代碼塊以前(包括BEGIN代碼塊)。

7.3 gawk使用庫函數

 gawk可使用將多個函數放置在一個庫文件中,經過調用庫文件使用全部的函數。

....

相關文章
相關標籤/搜索