linux shell之a(chǎn)wk

1 awk

awk 是一款設(shè)計(jì)用于數(shù)據(jù)流的工具, awk有很多內(nèi)建的功能,比如數(shù)組、函數(shù)等,這是它和C語(yǔ)言的相同之處
awk 腳本的結(jié)構(gòu)基本如下所示:

awk ' BEGIN{print "start" } pattern { commands } END{ print "end" } file

awk 腳本通常由3部分組成。 BEGIN , END 和帶模式匹配選項(xiàng)的常見(jiàn)語(yǔ)句塊。這3個(gè)部分都是可選項(xiàng),在腳本中可省略任意部分。

 
2 命令執(zhí)行過(guò)程

awk 命令的工作方式如下所注。
(1) 執(zhí)行 BEGIN { commands } 語(yǔ)句塊中的語(yǔ)句。
(2) 從文件或 stdin 中讀取一行,然后執(zhí)行 pattern { commands } 。重復(fù)這個(gè)過(guò)程,直到文件全部被讀取完畢。
(3) 當(dāng)讀至輸入流末尾時(shí),執(zhí)行 END { commands } 語(yǔ)句塊。
 

3 一般使用

1)普通執(zhí)行一個(gè)最簡(jiǎn)單的命令

    echo -e "hello\nword" | awk 'BEGIN{print "chenyu"} {print} END{print "linux shell"}'
    chenyu
    hello
    word
    linux shell

要記得打印是print "chenyu",這里是雙引號(hào)


2)帶參數(shù)打印

    echo | awk '{var1="v1"; var2="v2"; var3="v3"; print var1 "-" var2 "-" var3}{}{}'
    v1-v2-v3
     
    echo | awk '{var1="v1"; var2="v2"; var3="v3"; print var1, var2, var3}{}{}'
    v1 v2 v3

參數(shù)要用雙引號(hào),打印print后面用,隔開(kāi)


 
3 特殊變量

以下是可以用于 awk 的一些特殊變量。
NR :表示記錄數(shù)量,在執(zhí)行過(guò)程中對(duì)應(yīng)于當(dāng)前行號(hào)。
NF :表示字段數(shù)量,在執(zhí)行過(guò)程中對(duì)應(yīng)于當(dāng)前行的字段數(shù)。
$0 :這個(gè)變量包含執(zhí)行過(guò)程中當(dāng)前行的文本內(nèi)容。
$1 :這個(gè)變量包含第一個(gè)字段的文本內(nèi)容。
$2 :這個(gè)變量包含第二個(gè)字段的文本內(nèi)容。


    echo -e "chen gong yu\n chen cai feng\n chen zi xuan" | awk '{print "Line no:" NR ", all field:" NF, "$0 =" $0, "$1="$1, "$2="$2 "$3="$3}'
    Line no:1, all field:3 $0 =chen gong yu $1=chen $2=gong$3=yu
    Line no:2, all field:3 $0 = chen cai feng $1=chen $2=cai$3=feng
    Line no:3, all field:3 $0 = chen zi xuan $1=chen $2=zi$3=xuan
     
    echo -e "chen gong \n chen cai feng\n chen zi xuan" | awk '{print "Line no:" NR ", all field:" NF, "$0 =" $0, "$1="$1, "$2="$2 "$3="$3}'
    Line no:1, all field:2 $0 =chen gong  $1=chen $2=gong$3=
    Line no:2, all field:3 $0 = chen cai feng $1=chen $2=cai$3=feng
    Line no:3, all field:3 $0 = chen zi xuan $1=chen $2=zi$3=xuan

awk 的一些基本用法


1) 打印每一行的第2和第3個(gè)字段
 

    cat 1.txt
    1111 22 33
    111  44 55
     
     
    awk '{print $2, $3}' 1.txt
    22 33
    44 55

 或者我們打印字一行字符串的第二個(gè)字符串

    echo "hello word" | awk '{print $1}'
    hello

輸出的命令得到的結(jié)果和awk組合使用

    info1=$(md5sum 1.cpp | awk '{print $1}')
    info2=$(md5sum 1.cpp | awk '{print $2}')
    echo $info1
    2f56b3e40c1bdd15feb924049e127b23
    echo $info2
    1.cpp


2) 要統(tǒng)計(jì)文件中的行數(shù)

    awk 'END{ print NR }' file
    awk 'END{print NR}' 1.txt
    2


3) awk默認(rèn)是的字段定界符是空格,我們也可以用-F進(jìn)行來(lái)指定如下

    echo "chen*yu*ni*hao" | awk -F '*' '{print $3}'
    ni

 
4 將外部變量值傳遞給 awk

方式1

    value=chenyu
    echo | awk -v vvv=$value '{print vvv}'
    chenyu

方式2

    var1="chen" ; var2="yu"
    echo | awk '{ print v1,v2 }' v1=$var1 v2=$var2
    chen yu


 
五:總結(jié)

一般我們要得到打印的字符串或者文本里面的第幾行的第幾個(gè)字段一般使用awk命令。

經(jīng)典簡(jiǎn)單用法如下:

    value=$(echo "chen*yu*ni*hao" | awk -F '*' '{print $3}')
    echo $value
    ni


    value1=$(echo "chen yu ni hao" | awk '{print $3}')
    echo $value1
    ni

 


 

 
作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門(mén)到禿頭 或掃描下面二維碼
零基礎(chǔ)入門(mén)進(jìn)階人工智能(鏈接)