[ 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.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