背景
- AWK是一種處理文本文件的語言柱衔,是一個強大的文本分析工具
awk的基本用法
文本內(nèi)容:
2 this is a test
3 Are you like awk
This's a test10
There are orange,apple,mongo
-
用法一:
awk '{[pattern] action}' {filenames} #行匹配語句 awk 只能用單引號
示例:awk '{print $1,$4}' log.txt
2 a
3 like
This's
10 orange,apple,mongo -
用法二:
awk -F #-F相當(dāng)于內(nèi)置變量FS, 指定分割字符
示例: awk -F, '{print $1,$2}' log.txt
2 this is a test
3 Are you like awk
This's a test
10 There are orange apple -
用法三:
awk -v #設(shè)置變量
示例: awk -va=1 '{print $1,$1+a}' log.txt
2 3
3 4
This's 1
10 11
awk內(nèi)建變量
變量 | 描述 |
---|---|
$n | 當(dāng)前記錄的第n個字段悲柱,字段間由FS分隔 |
$0 | 完整的輸入記錄 |
ARGC | 命令行參數(shù)的數(shù)目 |
ARGIND | 命令行中當(dāng)前文件的位置(從0開始算) |
ARGV | 包含命令行參數(shù)的數(shù)組 |
CONVFMT | 數(shù)字轉(zhuǎn)換格式(默認(rèn)值為%.6g)ENVIRON環(huán)境變量關(guān)聯(lián)數(shù)組 |
ERRNO | 最后一個系統(tǒng)錯誤的描述 |
FIELDWIDTHS | 字段寬度列表(用空格鍵分隔) |
FILENAME | 當(dāng)前文件名 |
FNR 同NR挽荠, | 但相對于當(dāng)前文件 |
FS | 字段分隔符(默認(rèn)是任何空格) |
IGNORECASE | 如果為真,則進行忽略大小寫的匹配 |
NF | 當(dāng)前記錄中的字段數(shù) |
NR | 當(dāng)前記錄數(shù) |
OFMT | 數(shù)字的輸出格式(默認(rèn)值是%.6g) |
OFS | 輸出字段分隔符(默認(rèn)值是一個空格) |
ORS | 輸出記錄分隔符(默認(rèn)值是一個換行符) |
RLENGTH | 由match函數(shù)所匹配的字符串的長度 |
RS | 記錄分隔符(默認(rèn)是一個換行符) |
RSTART | 由match函數(shù)所匹配的字符串的第一個位置 |
SUBSEP | 數(shù)組下標(biāo)分隔符(默認(rèn)值是/034) |
正則表達式
~ 表示模式開始种冬, / /符號中為模式互例。
awk '/re/ ' log.txt
awk '$2 ~ /th/ {print $2,$4}' log.txt
awk腳本
- BEGIN{這里面放的是執(zhí)行前的語句}
- END{這里面放的是處理完所有的行后要執(zhí)行的語句}
- {這里面放的是處理每一行時要執(zhí)行的語句}
#!/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使用原理
- awk每次處理一行字符(通過文件或管道)绑雄,并將這一行賦給內(nèi)部的$0變量,默認(rèn)一行字符以換行符結(jié)束铅鲤。
- 每行數(shù)據(jù)默認(rèn)被空格分解成字段(通過內(nèi)部定義FS變量來獲取分隔符)划提,每個字段存儲在已經(jīng)編好的變量中,從$1開始邢享,可以多達100個字段鹏往。
- awk輸出時,逗號會被空格替換驼仪,改空格保存在OFS變量中(輸出字段分隔符)掸犬。