前言
AWK是一種處理文本文件的語言,是一個強大的文本分析工具。
之所以叫AWK是因爲其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
語法
awk [選項參數] 'script' var=value file(s)
或
awk [選項參數] -f scriptfile var=value file(s)
基本用法
awk的基本用法格式: awk [options] ‘program’ FILE…
語句之間用分號分隔
[options]
-F : 指明輸入時用到的字段分隔符
-v var=VALUE : 自定義變量
在awk中變量的引用不需要加$,而是直接引用
爲了方便後面的講解,我們新建一個測試的txt文件。
這裏每行的數據我們以空格進行分割。
用法1: awk ‘{[pattern] action}’ {filenames} # 行匹配語句 awk ‘’ 只能用單引號
例如 查看每一行數據的第一列和第四列的內容:
用法2:awk -F #-F相當於內置變量FS, 指定分割字符
例如,使用逗號,進行分割。
用法3:awk -v # 設置變量
用法4:基本的運算符
例如判斷大於或者相等:
用法5:使用正則表達式進行字符串匹配
例如,下面的例子
- 輸出第二列包含“th”,並打印第二列和第四列 或者打印整行
- 輸出該文件中國包含"a"的行數據
模式取反
內置變量
變量:分爲內置變量和自定義變量;輸入分隔符FS和輸出分隔符OFS都屬於內置變量。
內置變量就是awk預定義好的、內置在awk內部的變量,而自定義變量就是用戶定義的變量。
FS(Field Separator):輸入字段分隔符, 默認爲空白字符
OFS(Out of Field Separator):輸出字段分隔符, 默認爲空白字符
RS(Record Separator):輸入記錄分隔符(輸入換行符), 指定輸入時的換行符
ORS(Output Record Separate):輸出記錄分隔符(輸出換行符),輸出時用指定符號代替換行符
NF(Number for Field):當前行的字段的個數(即當前行被分割成了幾列)
NR(Number of Record):行號,當前處理的文本行的行號。
FNR:各文件分別計數的行號
ARGC:命令行參數的個數
ARGV:數組,保存的是命令行所給定的各參數
自定義變量的方法
方法一:-v varname=value ,變量名區分字符大小寫。
方法二:在program中直接定義。
awk腳本
關於awk腳本,我們需要注意兩個關鍵詞BEGIN和END。
- BEGIN{ 這裏面放的是執行前的語句 }
- END {這裏面放的是處理完所有的行後要執行的語句 }
- {這裏面放的是處理每一行時要執行的語句}
假設有這麼一個文件(學生成績表):
$ cat score.txt
Marry 2143 78 84 77
Jack 2321 66 78 45
Tom 2122 48 77 71
Mike 2537 87 97 95
Bob 2415 40 57 62
我們的awk腳本如下:
$ cat cal.awk
#!/bin/awk -f
#運行前
BEGIN {
math = 0
english = 0
computer = 0
printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n"
printf "---------------------------------------------\n"
}
#運行中
{
math+=$3
english+=$4
computer+=$5
printf "%-6s %-6s %4d %8d %8d %8d\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#運行後
END {
printf "---------------------------------------------\n"
printf " TOTAL:%10d %8d %8d \n", math, english, computer
printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR
}
我們來看一下執行結果:
$ awk -f cal.awk score.txt
NAME NO. MATH ENGLISH COMPUTER TOTAL
---------------------------------------------
Marry 2143 78 84 77 239
Jack 2321 66 78 45 189
Tom 2122 48 77 71 196
Mike 2537 87 97 95 279
Bob 2415 40 57 62 159
---------------------------------------------
TOTAL: 319 393 350
AVERAGE: 63.80 78.60 70.00
關於awk sed和grep三者的比較
awk、sed、grep更適合的方向:
- grep 更適合單純的查找或匹配文本
- sed 更適合編輯匹配到的文本
- awk 更適合格式化文本,對文本進行較複雜格式處理
可參考資料:
1.Linux awk 命令
2.Linux之awk詳解