linux-shell指令碼命令:awk命令簡介

來源:互聯網
上載者:User

[ awk簡介: ]

awk可以從一個文本中擷取部分內容, 或者對這個文本進行排版, 使它按某種格式輸出.

[ awk工作流程: ]

awk會把檔案一行內容去到記憶體裡, 然後對這行內容進行分段 ( 預設按空格或tab分割, $1, $2, $3... ). 再刪了, 然後讀取第二行內容到記憶體...

格式: awk '{/pattern/ command1; command2; ...}' file        # 匹配模式的這一行執行命令

例如: who | awk '{print $1}'    # 把分段的第一塊內容列印出來, $1為第一段,  $0為一行所有內容

[ awk參數說明: ]

-F re:允許awk更改其欄位分隔符號。

-v  定義變數, 從shell給awk傳遞變數, 如-vDATE=$DATE, 即將shell中$DATE變數值傳遞給awk變數DATE。

-f progfile:允許awk調用並執行progfile程式檔案,當然progfile必須是一個符合awk文法的程式檔案。

[ awk內建變數: ]

ARGC  命令列參數的個數

ARGV  命令列參數數組

ARGIND  當前被處理檔案的ARGV標誌符

awk '{if(ARGIND==1){print $1} if(ARGIND==2){print $2}}' aaa.txt bbb.txt  # 先掃描aaa檔案, 再掃描bbb檔案

NR  已經讀出的記錄數

awk 'NR==1,NR==5{print}' aaa.txt  # 顯示aaa.txt檔案的 1 到 5 行

FNR  當前檔案的記錄數

awk 'NR==FNR{print "a"} NR > FNR{print "b"}' a.txt b.txt

# 輸入檔案a.txt和b.txt, 由於先掃描a.txt, 所以掃描a.txt的時候必然有NR==FNR;

# 然後掃描b.txt的時候, FNR從1開始計數, 而NR則接著a.txt的行數繼續計數, 所以NR > FNR

FS  輸入欄位分隔符號(預設為:space:),相當於-F選項

awk -F ':' '{print $1}' ccc.txt  # 輸入檔案以 : 作為分割符

OFS  輸出欄位分隔符號(預設為:space:)

# 輸出時以 ; 分割

① cat ccc.txt  如下:

1:2:3

4:5:6

② awk -F ':' 'BEGIN{OFS=";"}{print $1,$2,$3}' ccc.txt

③ 輸出結果如下:

1;2;3

4;5;6

NF  目前記錄中的分段個數

awk -F ':' '{print NF}' ccc.txt

RS  輸入記錄分隔字元, 預設為"\n", 預設情況下, awk把一行看作一個記錄; 如果設定了RS, 那麼awk按照RS來分割記錄

① cat ccc.txt:       hello world; I want to go swimming tomorrow;hiahia

② 運行 awk 'BEGIN{ RS = ";" } {print}' ccc.txt

③ 結果如下:

 hello world

 I want to go swimming tomorrow

 hiahia

ORS  輸出記錄分隔字元,預設為分行符號,控制每個print語句後的輸出符號

awk 'BEGIN{ FS="\n"; RS=""; ORS=";"} {print NF}' ddd.txt

[ awk內建函數: ]

blength[([s])]                計算字串長度(byte為單位)

length[([s])]                  計算字串長度(character為單位)

返回欄目頁:http://www.bianceng.cnhttp://www.bianceng.cn/OS/Linux/

rand()                            產生隨機數

srand([expr])                設定rand() seed

int(x)                             字串轉換為整型

substr(s, m [, n])           取子字串

index(s, t)                     在字串s中定位t字串首次出現的位置

match(s, ere)                在字串s中匹配正則ere,match修改RSTART、RLENGTH變數。

split(s, a[, fs])              將字串分割到數組中

sub(ere, repl [, in])       字串替換

gsub                              同上

sprintf(fmt, expr, ...)   拼字串

system(cmd)                在shell中執行cmd。

toupper(s)                    字串轉換為大寫

tolower(s)                    字串轉換為小寫

[ awk用法樣本: ]

1.  -F 表示以什麼作為分隔字元

awk -F: '{print $1}' ccc.txt                     # 以 : 作為分隔字元, 列印出ccc.txt檔案中每一行中的第一段字串

awk -F: '{print $1,$2}' ccc.txt               # 列印第一段和第二段字串, 如果這樣寫$1 $2 那麼列印的內容會連在一起

2. /pattern/ 模式比對

awk -F: '/A/{print $1}' ccc.txt               # 以 : 作為分隔字元, 列印出ccc.txt檔案中含有 A 的第一段字串

3. ^ 表示以什麼開頭

awk -F: '/^A/{print $1}' ccc.txt             # 以 : 作為分隔字元, 列印出ccc.txt檔案中以 A 開頭的第一段字串

4. ~ 表示匹配的意思

awk -F: '$4 ~ /A/{print $1}' ccc.txt      # 以 : 作為分隔字元, 列印出ccc.txt檔案中第四段中含有 A 的字串

5. awk在把第一行讀入記憶體之前, 可以先做其他的一些操作, 使用BEGIN

格式: awk 'BEGIN{command} /pattern/ {command1; command2; ...}' file

awk 'BEGIN{FS=":"}$1 ~ /A/{print $1}' ccc.txt   # 讀取ccc.txt檔案之前, 首先執行BEGIN裡的命令, 設定 : 作為分割符

awk 'BEGIN{FS=":"; OFS="-"}$1 ~ /A/{print $1,$2}' ccc.txt # 輸出的分隔字元以 - 進行隔開

6. awk在所有行處理完之後, 還可以先一些操作, 使用END

格式: awk 'BEGIN{command} /pattern/ {command1; command2; ...} END{command}' file

7. 統計每一行分段後的段數用NF

who | awk '{print NF}'

8. 擷取awk處理檔案內容在源檔案中是第幾行用NR

awk -F: '/^A/{print NR}' ccc.txt          # 擷取以 A 開頭的串在ccc.txt是第幾行

9. 自訂變數

awk 'BEGIN{a=0}/tb/{a++} END{print a}' ccc.txt

# 迴圈ccc.txt檔案之前, 先定義一個變數, 初始值為0; 然後迴圈每一行, 每找到一行含有tb的行就給 a 加 1, 直到最後列印 a 的值.

作者:csdn部落格 zdp072

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.