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)階人工智能(鏈接)