AWK 基本語法

2018-08-12 21:30 更新

基本語法

AWK 使用起來非常方便。我們可以直接通過命令行的方式為 AWK 程序提供 AWK 命令,也可以使用包括 AWK 命令的腳本文件。這篇教程將使用合適的例子分別介紹這兩種使用 AWK 的方法:

AWK 命令行

如下所示,在命令行中,我們可以使用如下的格式調(diào)用 AWK 命令,其中 AWK 命令由單引號括起來:

awk [options] file ...

例子

假設(shè)我們有一個名為marks.txt的文件需要處理,文件中的內(nèi)容如下:

1)    Amit     Physics    80
2)    Rahul    Maths      90
3)    Shyam    Biology    87
4)    Kedar    English    85
5)    Hari     History    89

我們可以按如下方式使用 AWK 命令輸出整個文件中的內(nèi)容:

[jerry]$ awk '{print}' marks.txt 

執(zhí)行上面的命令可以得到如下的結(jié)果:

1)    Amit     Physics    80   
2)    Rahul    Maths      90
3)    Shyam    Biology    87
4)    Kedar    English    85
5)    Hari     History    89  

AWK 程序文件

接下來講解的是另外一種提供 AWK 命令的方式——通過腳本文件提供:

awk [option] -f file ....

首先,創(chuàng)建一個文本文件 command.awk,在文件中輸入如下 AWK 命令:

{print}

現(xiàn)在,我們可以調(diào)用 AWK 從文本文件中讀入命令并執(zhí)行。這里,我們實現(xiàn)了與上面例子相同的效果:

[jerry]$ awk -f command.awk marks.txt

執(zhí)行上面的命令可以得到如下的結(jié)果:

1)    Amit     Physics    80
2)    Rahul    Maths      90
3)    Shyam    Biology    87
4)    Kedar    English    85
5)    Hari     History    89

AWK 標準選項

在命令行環(huán)境下,AWK 支持如下的標準選項:

-v 選項

這個選項可以為變量賦值。它允許在程序執(zhí)行之前為變量賦值。下面是一個 -v 選項使用的示例程序:

[jerry]$ awk -v name=Jerry 'BEGIN{printf "Name = %s\n", name}'

執(zhí)行上面的命令可以得到如下的結(jié)果:

Name = Jerry

--dump-variables[=file] 選項

此選項會將全局變量及相應(yīng)值按序輸出到指定文件中。默認的輸出文件名是 awkvars.out。

[jerry]$ awk --dump-variables ''
[jerry]$ cat awkvars.out 

執(zhí)行上面的命令可以得到如下的結(jié)果:

ARGC: 1
ARGIND: 0
ARGV: array, 1 elements
BINMODE: 0
CONVFMT: "%.6g"
ERRNO: ""
FIELDWIDTHS: ""
FILENAME: ""
FNR: 0
FPAT: "[^[:space:]]+"
FS: " "
IGNORECASE: 0
LINT: 0
NF: 0
NR: 0
OFMT: "%.6g"
OFS: " "
ORS: "\n"
RLENGTH: 0
RS: "\n"
RSTART: 0
RT: ""
SUBSEP: "\034"
TEXTDOMAIN: "messages"

--help 選項

此選項將幫助消息轉(zhuǎn)出到標準輸出中。

[jerry]$ awk --help

執(zhí)行上面的命令可以得到如下的結(jié)果:

Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options:      GNU long options: (standard)
    -f progfile     --file=progfile
    -F fs           --field-separator=fs
    -v var=val      --assign=var=val
Short options:      GNU long options: (extensions)
    -b          --characters-as-bytes
    -c          --traditional
    -C          --copyright
    -d[file]        --dump-variables[=file]
    -e 'program-text'   --source='program-text'
    -E file         --exec=file
    -g          --gen-pot
    -h          --help
    -L [fatal]      --lint[=fatal]
    -n          --non-decimal-data
    -N          --use-lc-numeric
    -O          --optimize
    -p[file]        --profile[=file]
    -P          --posix
    -r          --re-interval
    -S          --sandbox
    -t          --lint-old
    -V          --version

--lint[=fatal] 選項

這個選項用于檢查程序的可移植情況以及代碼中的可疑部分。如果提供了參數(shù) fatal,AWK 會將所有的警告信息當作錯誤信息處理。下面這個簡單的示例說明了 lint 選項的用法:

[jerry]$ awk --lint '' /bin/ls

執(zhí)行上面的命令可以得到如下的結(jié)果:

awk: cmd. line:1: warning: empty program text on command line
awk: cmd. line:1: warning: source file does not end in newline
awk: warning: no program text at all!

--posix 選項

這個選項會打開嚴格 POSIX 兼容性審查。 如此,所有共同的以及 GAWK 特定的擴展將被設(shè)置為無效。

--profile[=file] 選項

這個選項會將程序文件以一種很優(yōu)美的方式輸出(譯注:用于格式化 awk 腳本文件)。默認輸出文件是 awkprof.out。示例如下:

[jerry]$ awk --profile 'BEGIN{printf"---|Header|--\n"} {print} END{printf"---|Footer|---\n"}' marks.txt > /dev/null 
[jerry]$ cat awkprof.out

執(zhí)行上面的命令可以得到如下的結(jié)果:


\# gawk profile, created Sun Oct 26 19:50:48 2014

    # BEGIN block(s)

    BEGIN {
        printf "---|Header|--\n"
    }

    # Rule(s)

    {
        print $0
    }

    # END block(s)

    END {
        printf "---|Footer|---\n"
    }

--traditional 選項

此選項用于禁止 GAWK 相關(guān)的擴展。

--version 選項

此選項顯示 AWK 程序的版本信息。

[jerry]$ awk --version

上面的代碼執(zhí)行后,將產(chǎn)生下面的輸出結(jié)果(譯注:與具體的 AWK 版本相關(guān)):

GNU Awk 4.0.1
Copyright (C) 1989, 1991-2012 Free Software Foundation.
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號