# ll /usr/bin/awk
lrwxrwxrwx. 1 root root 14 Sep 3 03:33 /usr/bin/awk -> ../../bin/gawkhtml
awk實際上是一門編程語言,它支持條件判斷、數組、循環等功能。因此,咱們也能夠把awk理解成一個腳本語言解釋器。node
grep 更適合單純的查找或匹配文本正則表達式
sed 更適合編輯匹配到的文本編程
awk 更適合格式化文本,對文本進行較複雜格式處理數組
awk是逐行處理的,逐行處理的意思就是說,當awk處理一個文本時,會一行一行進行處理,處理完當前行,再處理下一行,awk默認以"換行符"爲標記,識別每一行,也就是說,awk跟咱們人類同樣,每次遇到"回車換行",就認爲是當前行的結束,新的一行的開始,awk會按照用戶指定的分割符去分割當前行,若是沒有指定分割符,默認使用空格做爲分隔符。編程語言
awk [options] 'Pattern{Action}' file函數
# awk -W help Usage: awk [POSIX or GNU style options] -f progfile [--] file ... Usage: awk [POSIX or GNU style options] [--] 'program' file ... POSIX options: GNU long options: -f progfile --file=progfile -F fs --field-separator=fs -v var=val --assign=var=val -m[fr] val -O --optimize -W compat --compat -W copyleft --copyleft -W copyright --copyright -W dump-variables[=file] --dump-variables[=file] -W exec=file --exec=file -W gen-po --gen-po -W help --help -W lint[=fatal] --lint[=fatal] -W lint-old --lint-old -W non-decimal-data --non-decimal-data -W profile[=file] --profile[=file] -W posix --posix -W re-interval --re-interval -W source=program-text --source=program-text -W traditional --traditional -W usage --usage -W use-lc-numeric --use-lc-numeric -W version --version To report bugs, see node `Bugs' in `gawk.info', which is section `Reporting Problems and Bugs' in the printed version. gawk is a pattern scanning and processing language. By default it reads standard input and writes standard output. Examples: gawk '{ sum += $1 }; END { print sum }' file gawk -F: '{ print $1 }' /etc/passwd
# cat test [Wed Oct 23 10:59:46 2019] [Wed Oct 23 10:59:46 2019] # awk '{print $1,$2}' test [Wed Oct [Wed Oct
$0 表示顯示整行 ,$NF表示當前行分割後的最後一列($0和$NF均爲內置變量)ui
# awk '{print $1,$2,$NF}' test [Wed Oct 2019] [Wed Oct 2019]
除了輸出文本中的列,還可以添加本身的字段,將本身的字段與文件中的列結合起來spa
# awk '{print $1 "星期三",$2 "10月",$NF "年"}' test [Wed星期三 Oct10月 2019]年 [Wed星期三 Oct10月 2019]年
$1這種內置變量的外側不能加入雙引號,不然$1會被當作文本輸出命令行
# awk 'BEGIN{print "星期","月","年"} {print $1,$2,$NF}' test 星期 月 年 [Wed Oct 2019] [Wed Oct 2019]
# awk 'BEGIN{print "星期","月","年"} {print $1,$2,$NF} END{print "三","十","年"}' test 星期 月 年 [Wed Oct 2019] [Wed Oct 2019] 三 十 年
輸入分隔符,英文原文爲field separator,此處簡稱爲FS
輸入分割符,默認是空白字符(即空格),awk默認以空白字符爲分隔符對每一行進行分割。
輸出分割符,英文原文爲output field separator,此處簡稱爲OFS
awk將每行分割後,輸出在屏幕上的時候,以什麼字符做爲分隔符,awk默認的輸出分割符也是空格
# cat test [Wed Oct 23 10:59:46 2019] [Wed Oct 23 10:59:46 2019] # awk -F 2 '{print $1"--"$2"--"$3}' test [Wed Oct --3 10:59:46 --019] [Wed Oct --3 10:59:46 --019]
變量 | 描述 |
---|---|
$n | 當前記錄的第n個字段,字段間由FS分隔 |
$0 | 完整的輸入記錄 |
ARGC | 命令行參數的數目 |
ARGIND | 命令行中當前文件的位置(從0開始算) |
ARGV | 包含命令行參數的數組 |
CONVFMT | 數字轉換格式(默認值爲%.6g)ENVIRON環境變量關聯數組 |
ERRNO | 最後一個系統錯誤的描述 |
FIELDWIDTHS | 字段寬度列表(用空格鍵分隔) |
FILENAME | 當前文件名 |
FNR | 各文件分別計數的行號 |
FS | 字段分隔符(默認是任何空格) |
IGNORECASE | 若是爲真,則進行忽略大小寫的匹配 |
NF | 一條記錄的字段的數目 |
NR | 已經讀出的記錄數,就是行號,從1開始 |
OFMT | 數字的輸出格式(默認值是%.6g) |
OFS | 輸出記錄分隔符(輸出換行符),輸出時用指定的符號代替換行符 |
ORS | 輸出記錄分隔符(默認值是一個換行符) |
RLENGTH | 由match函數所匹配的字符串的長度 |
RS | 記錄分隔符(默認是一個換行符) |
RSTART | 由match函數所匹配的字符串的第一個位置 |
SUBSEP | 數組下標分隔符(默認值是/034) |
變量NR表示每一行的行號,內置變量NF表示每一行中一共有幾列
# cat test [Wed Oct 23 10:59:46 2019] [Wed Oct 23 10:59:46 2019] # awk '{print NR,NF}' test 1 5 2 5
各文件分別計數的行號
# awk '{print FNR,$0}' test test2 1 [Wed Oct 23 10:59:46 2019] 2 [Wed Oct 23 10:59:46 2019] 1 total 16 2 -rw-r--r-- 1 root root 1991 Oct 23 11:03 access_log 3 -rw-r--r-- 1 root root 1614 Oct 23 11:00 error_log 4 -rw-r--r-- 1 root root 0 Oct 23 10:59 ssl_access_log 5 -rw-r--r-- 1 root root 220 Oct 23 10:59 ssl_error_log
RS是輸入行分隔符,若是不指定,默認的"行分隔符"就是咱們所理解的"回車換行"。
# awk -v RS=" " '{print FNR,$0}' test 1 [Wed 2 Oct 3 23 4 10:59:46 5 2019] [Wed 6 Oct 7 23 8 10:59:46 9 2019]
輸出行分隔符
# awk -v ORS="/**/" '{print FNR,$0}' test 1 [Wed Oct 23 10:59:46 2019]/**/2 [Wed Oct 23 10:59:46 2019]/**/
# awk '{print FILENAME}' test test test
ARGC:命令行參數的個數
# awk '{print ARGC}' test 2 2
ARGV:數組,保存的是命令行所給定的各參數
# awk '{print ARGV[1]}' test test test # awk '{print ARGV[0]}' test awk awk
awk就是這麼規定的,'pattern{ action }'並不被看作是參數,awk被看作爲參數。
方法一:-v varname=value 變量名區分字符大小寫。
方法二:在program中直接定義。
# awk -v myVar="testVar" 'BEGIN{print myVar}' test testVar # awk 'BEGIN{myVar="testVar"; print myVar}' test testVar
printf命令的做用是安裝指定的格式輸出文本
# awk '{printf "%-8s %-10s\n",$2,$4}' test Oct 10:59:46 Oct 10:59:46
運算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 賦值 |
?: | C條件表達式 |
|| | 邏輯或 |
&& | 邏輯與 |
~ 和 !~ | 匹配正則表達式和不匹配正則表達式 |
< <= > >= != == | 關係運算符 |
空格 | 鏈接 |
+ - | 加,減 |
* / % | 乘,除與求餘 |
+ - ! | 一元加,減和邏輯非 |
^ *** | 求冪 |
++ -- | 增長或減小,做爲前綴或後綴 |
$ | 字段引用 |
in | 數組成員 |
https://www.runoob.com/w3cnote/awk-built-in-functions.html
---恢復內容結束---