正所謂,知己知彼百戰不殆,想要拿下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裡...