AWK

AWK

# 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

 


print 

# 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會被當作文本輸出命令行


BEGIN和END

 

 

# 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]
三 十 年

NF分隔符

輸入分隔符,英文原文爲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

變量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

內置變量FNR

各文件分別計數的行號

# 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

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]

內置變量ORS

輸出行分隔符

# awk -v ORS="/**/" '{print FNR,$0}' test 
1 [Wed Oct 23 10:59:46 2019]/**/2 [Wed Oct 23 10:59:46 2019]/**/

內置變量FILENAME

# awk '{print FILENAME}' test 
test
test

內置變量ARGC與ARGV

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

---恢復內容結束---

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息