shell學習 - awk入門

來源:互聯網
上載者:User

標籤:awk   shell   

一. awk應用情境

格式化資料或從一個大的文字檔中抽取記錄

二. 使用方法

  1. 命令列方式
    $awk [-F field-separator] ‘commands’ input-file(s)
    commands是真正的awk命令
    [-F域分割符]是可選的,如果無-F選項,awk預設用空格作為分隔字元,如果域分隔字元不為空白格,比如要瀏覽以”:”作為分隔字元的password檔案則必須指明-F選項,如:
    awk -F: ‘commands’ input-file

  2. awk指令檔
    將1中的命令列寫入一個檔案,用bash或sh去解釋它,執行命令為shawkscriptfile或./awk_script_file, 後者需要給指令檔加執行許可權。

  3. 將所有awk命令寫入一個檔案awk_script_file,用$awk -f awk_script_file input-file(s),例如,

#record.txtzhangsan 21 M Hubeilisi     30 F Beijingwangwu   34 M Anhuiwangmazi 50 M Sichuanglilei    20 M Hubei#awk_script_file$2 > 30 {print $0}$awk -f awk.sh record.txtwangwu   34 M Anhuiwangmazi 50 M Sichuang

三. awk指令碼組成

awk語句都是由模式和動作組成。

模式即動作的執行條件,可以是條件陳述式或Regex,模式包括2個特殊欄位BEGIN和END。使用BEGIN語句設定計數和列印頭。BEGIN語句在文本瀏覽之前執行。END語句用來在awk完成文本瀏覽動作後列印出文本總數和結尾狀態。

動作大多數用來列印,在{}內指明,可以包含if和迴圈等,如果不指明動作awk將列印出所有瀏覽出來的記錄。

域和記錄
域即用分隔字元分割的欄位,用$1,$2,$3...,$n表示第一個、第二個、第三個,第n個欄位, $0表示所有欄位。

儲存awk輸出

$awk ‘$2 > 30 {print $1, $2}‘ record.txt > tmp.txt

動作中的Regex
動作中的Regex用表示方式為:/這則運算式/,域號匹配Regex用~後緊跟Regex,也可以用if()。例如,列印名字中包含“zhangsan”的所有記錄,

$ awk ‘{if ($1~/zhangsan/)print $0}‘ record.txt

$ awk ‘$1~/zhangsan/‘ record.txt#預設列印所有滿足條件的欄位

條件運算中常用的運算子和正則式

+, -, *, /, %, +=, -=, %=, ^=++, --~模糊比對,即**包含**!~不匹配==精確匹配 >, <, >=, <=, !=||, &&

Regex列舉

[Gg]reen或(Green|green) 匹配Green或green^...a 行首前三個字元任意,第四個是a

列印報告頭和報告尾

awk ‘BEGIN{print "Name    Age\n-------------------------"} $2>30 && $3 == "M" {print $1, $2} END {print "end-of-report"}‘ record.txt

awk內建變數

AGRC          命令列參數個數ARGV          命令列參數列表ENVIRON       系統內容變數FNR           瀏覽檔案的記錄數FILENAME      瀏覽檔案名稱FS            網域名稱分隔字元,等價於-F選項NF            瀏覽記錄域個數NR            已讀記錄數OFS           輸出域分隔字元ORS           輸出記錄分隔字元RS            控制記錄分隔字元

awk內建字串函數

gsub(r, s)        在整個$0中用s替代rgsub(r, s, t)     在整個t中用s替代rindex(s, t)       返回s中字串t的第一個位置length(s)         返回s長度match(s, r)       測試s是否包含匹配的r字串split(s, a, fs)   用fs把s分割成序列asprintf(fmt, exp) 返回經fmt格式化的串substr(s, p)      返回字串s中從p開始的部分substr(s, p, n)   返回字串s中從p開始長度為n的部分

awk變數
變數提高了awk程式可讀性,下面是變數使用的簡單例子

awk ‘{name=$1;age=$2;sex=$3;if(age>30 && sex=="M")print "Name:" name " Age:" age}‘ record.txt 

修改數範圍的值

#將姓名為"lilei"的年齡增加1,然後列印出所有記錄awk ‘{if ($1=="lilei") $2+=1;print "Name:"$1 " Age:"$2}‘ record.txt #將姓名為"lilei"的姓名修改為"Lilei",列印出修改後的記錄awk ‘$1=="lilei" {$1="Lilei";print "Name:"$1 " Age:"$2}‘ record.txt 

統計

awk ‘{(tot += $2)};END{print "Total age:" tot}‘ record.txt 

本文只是簡單的介紹了awk的基本文法,閱讀本文後可以用awk完成簡單的文本處理功能,awk博大精深,如果要深入學習建議閱讀更專業的awk文檔和相關書籍。

shell學習 - awk入門

相關文章

聯繫我們

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