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為單位)
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 的值.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.