關於shell awk 的學習

2021-10-02 06:26:28 字數 4520 閱讀 7431

正所謂,知己知彼百戰不殆,想要拿下awk,必需了解它的前世今生;

一、它可以做什麼

1、 awk 是一種程式語言, 可以用作linux或者unix的bash指令碼中;也可以單獨放在乙個檔案中,通過awk命令直譯器執行;

【這裡只關注awk用作bash指令碼中】

2、awk 主要功能是,基於指定的規則,對文字或者資料做瀏覽和提取操作;  其處理原則為:逐行掃瞄檔案,從第一行到最後一行,尋找匹配指定規則的內容。   【awk命令的主要功能是對文字做提取操作,所以,bash指令碼編寫中,awk經常與其它指令聯合是使用:通過awk提取指定行,然後對該行做你所需要的操作。

二、它怎麼使用呢 

1、語法結構

awk    選項部分    '命令部分'    檔名

1)選項部分:為一些指定的引數,或者正規表示式;

2)命令部分:為需要執行的操作和指令,一般是用『 '{}' 』包圍起來,用來表示執行的所有操作;

3)檔名: 就是我們要處理的檔案;

【基本的awk 指令語法構成就是如上所示,也有一些更高階的操作,這個後續再學習】

2、一些基本概念 【寫在前面的東西】

1)分隔符和域   

分隔符,就是語法結構中的『選項』部分,  awk指令中,通過 -f   來定義欄位的分隔符; awk指令預設的分隔符為空格,如果要處理的檔案時以空格分割,則無需指定選項 -f ;  如果是通過除空格之外的其它字元分割,則必需指定-f ;

域: 定義了分隔符,則比如會有文字被分割成一段一段的, 這裡統稱為域; 域的標記符為:$1,  $2,  $3 ...  $n  ;  其中,$0 表示所有的域;   乙個栗子:

一、定義檔案【檔案包含多列,列之間通過逗號分割】:

vim 1

序號,姓名,年齡,職業$

1,張三,19,學生$

2,李四,25,程式設計師$

3,王五,40,教師$

執行: awk -f , '' 1

輸出結果為:

序號,姓名,年齡,職業

1,張三,19,學生

2,李四,25,程式設計師

3,王五,40,教師

執行:awk -f , '' 1

輸出結果為:序號1

23【解析】: -f 定義分隔符為逗號; 如果是以其它字元分割,則直接更換即可;

$0 定義域,這裡輸出全部域; 【可以通過域識別符號,更換輸出的域, 比如$1, 則只輸出第一列】

1 為我定義的檔案名字;

【備註】若是以其他分隔符做為分割,則直接替換 引數-f 的取值即可;如下:

定義檔案【檔案包含多列,以\t分割】

vim 3

序號^i姓名^i年齡^i職業^i去年工資^i今年工資$

1^i張三^i19^i學生^i1200^i1000$

2^i李四^i25^i程式設計師^i10000^i15000$

3^i王五^i40^i教師^i5000^i6000$

執行:awk -f \t '' 3

輸出結果為:

姓名張三

李四王五

【解析】: 此處,檔案以\t分割,則對應-f 引數值改為\t, 則可以正確提取;

同理,可以以\n 分割;

2)模式和動作

模式和動作,位於語法結構中的『命令部分』, 故需要使用 ''   包含起來;

他們說,awk語句,是由『模式』和『動作』兩部分組成的;那麼什麼是模式,什麼是動作呢?

動作:就是,定義對資料的具體操作;【也就是一些列的操作指令】;

模式:則定義了『動作』被觸發的條件; 

【可以是條件語句、正則匹配、復合語句等】;

【當然了,這並非必需的,若沒有定義模式,則動作將保持時刻被觸發的狀態】

乙個栗子:

還是檔案: 1;

執行如下指令:

$ awk -f , 'begin end ' 1

輸出結果為:

---start print the file---

姓名張三

李四王五

---the end---

#解析:

1、-f: 定義分隔符,不做解釋;

2、'begin end ' 為模式定義和動作定義; 單引號不能省略;

1)其中 begin 定義動作開始前執行的操作;

2) 為動作定義;

3) end ' 定義動作結束後執行的操作;

4)每乙個操作,需要{};

三、一些常用到的操作符 和  內建變數、內建函式;

1、定義了乙個檔案 1 ,檔案中包含內容為:

2、定義檔案nihao,檔案中包含內容為:

1、 awk指令中可以使用的操作符:     

操作符操作指令  【指令部分,需要用雙引號表示字串】

作用 、 >=

awk -f , ''    1

輸出:李四工資漲了

王五工資漲了

比較檔案中,第6列和第5列數值大小,滿足要求,則輸出;

==  、 != 

awk -f ,  ''  1

輸出:李四在表中

用於精確匹配; 和 精確不匹配

/[pp]/

awk '/[pp]/'  nihao 

輸出:前兩行,因為前兩行中包含了p 或者p

用來匹配大小寫,

~   『匹配正規表示式』

待補充!~ 『不匹配正規表示式』

待補充2、awk 指令的內建變數

1)nf

[作用及其應用場景]:

a、awk按行讀取文字, nf標識每一行的字段數【即列數】;【 直接輸出'',    則可以輸出該行的列數;】

b、$nf 標識,該行的最後一列; 處理文字時,可能每一行列數不同,獲取最後一列時,可以使用該方法;

c、這裡的字段數,是根據指定分隔符分割後的字段數

[舉個栗子]:         

檔案內容:

序號,姓名,年齡,職業,去年工資,今年工資

1,張三,19,學生,1200,1000

2,李四,25,程式設計師,10000,15000

3,王五,40,教師,5000,6000

執行1:awk -f , '' 1

結果為:【輸出每一行的列數】66

66執行2:awk -f , '' 1

結果為:【輸出最後一列】

今年工資

1000

15000

6000

2)nr

[作用及其應用場景]:

a、awk 按行讀取文字,  nr 標識每一行的行號;  

b、可以根據行號,實現對應的篩選;

【舉個栗子】:

檔案內容:

序號,姓名,年齡,職業,去年工資,今年工資

1,張三,19,學生,1200,1000

2,李四,25,程式設計師,10000,15000

3,王五,40,教師,5000,6000

執行1:awk '' 1

結果為:12

34執行2: awk '' 1

結果為:輸出行號大於3的記錄:3,王五,40,教師,5000,6000

3)fnr

[作用及其應用場景]:

a、fnr 也標識 文字的行號; 

b、同nr的區別在於:

讀取多個檔案時, nr會將多個檔案的行號都依次連起來,順序獲取;  

fnr,則可以識別不同的檔案開端, 每讀到乙個新的檔案,行號從1開始; 

【舉個栗子】

檔案a.txt

a,aa,aaa,1

b,bb,bbb,2

c,cc,ccc,3

d,dd,ddd,4

e,ee,eee,5

檔案b.txt

a,aa,aaa,1

b,bb,bbb,2

c,cc,ccc

a,dd,ddd,4

e,ee,eee,5

執行1:awk '' a.txt b.txt

結果為:

nr:1fnr:1

nr:2fnr:2

nr:3fnr:3

nr:4fnr:4

nr:5fnr:5

nr:6fnr:1

nr:7fnr:2

nr:8fnr:3

nr:9fnr:4

nr:10fnr:5

執行2:

awk -f ,' else}}' a.txt b.txt

結果為:

34

shell awk和sed使用中遇到的問題

1.awk給shell變數賦值 var cat info.txt awk f nr 2 注釋 將info.txt檔案第二行,以 為分隔符,分割後的第二個字段賦值給變數var.注 第乙個 並不是單引號 而是 那個鍵上的 2.sed引用shell變數進行替換 eval sed i s s1 s2 g i...

shell awk讀取檔案中的指定行的指定字段

awk指定讀取檔案中的某一行的某個字段 awk 可以設定條件來輸出檔案中m行到n行中每行的指定的k欄位,使用格式如下 awk nr m,nr n path filename m,n,k表示實在的數值。如果要用變數來表示m,n的值,則變數需要用單引號將其引起來。nr,是awk命令在此用法下的規定字段 ...

關於FTP的學習

因為port方式在傳送資料時,由伺服器主動連線客戶端,所以,如果客戶端在防火牆或nat閘道器後面,用port方式將無法與internet上的ftp伺服器傳送檔案。這種情況需要使用pasv方式。幾乎所有的ftp客戶端軟體都支援這兩種方式。特殊的典型例子是ie,ie預設是用port方式的。如果要在ie裡...