您好,登錄后才能下訂單哦!
AWK語言
v 選項:
-F :指明輸入時用到的字段分隔符
-v var=value: 定義變量
v 分割符、域和記錄
awk 執(zhí)行時,由 分隔符分隔的字段(域)標(biāo)記$1,$2..$n稱 稱
為域標(biāo)識。$0 為所有域,注意:和shell 中變量$ 符含義不同
文件的每一行稱為記錄
省略action行 ,則默認(rèn)執(zhí)行 print $0 的 的
$0:打印所有
v 示例:
awk '{print "hello,awk"}'
awk –F: '{print}' /etc/passwd
awk –F: ‘{print “wang”}’ /etc/passwd
awk –F: ‘{print $1}’ /etc/passwd
awk –F: ‘{print $0}’ /etc/passwd
awk –F: ‘{print $1”\t”$3}’ /etc/passwd
tail –3 /etc/fstab |awk ‘{print $2,$4}’
awk 變量
v 變量:內(nèi) 置 和自定義變量
v FS :輸入字段分隔符,默認(rèn)為空白字符
awk -v FS=':' '{print $1,FS,$3}’ /etc/passwd
awk –F: '{print $1,$3,$7}’ /etc/passwd
v OFS :輸出字段分隔符,默認(rèn)為空白字符
awk -v FS=‘:’ -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd
vRS:輸入記錄分隔符,指定輸入時的換行符,原換行符仍有效
awk -v RS=' ' ‘{print }’ /etc/passwd
v ORS :輸出記錄分隔符,輸出時用指定符號代替換行符
awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd
打印奇數(shù)行或者偶數(shù)行:
計算的一些簡單方法
統(tǒng)計一文件里單詞出現(xiàn)的次數(shù):
NF :字段數(shù)量
awk -F:: ‘{print NF}’ /etc/fstab, 引用內(nèi)置變量不用$
awk -F: '{print $(NF-1)}' /etc/passwd
v NR :行號
FNR :各文件分別計數(shù), 行號
awk '{print FNR}' /etc/fstab /etc/inittab
FILENAME :當(dāng)前文件名
awk '{print FILENAME}’ /etc/fstab
打印出來時將所屬文件名也打印出來
ARGC :命令行參數(shù)的個數(shù)
awk '{print ARGC}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab
v ARGV:數(shù)組,保存的是命令行所給定的各參數(shù)
自定義變量( 區(qū)分 字符大小寫)
(1) -v var=value
(2) 在program
變量放在{}里和外邊的區(qū)別:
{}內(nèi):每次執(zhí)行時都要賦值一次
{}外:執(zhí)行之前先賦值,以后循環(huán)使用
-f :調(diào)用腳本
printf命令
后邊有幾個變量,前邊就應(yīng)該有幾個格式的定義,即幾個%定義,百分號定義和變量要一一對應(yīng)
v 格式化輸出:printf “FORMAT ” , item1, item2, ...
(1) 必須指定FORMAT
(2) 不會自動換行,需要顯式給出換行控制符,\n
(3) FORMAT 中需要分別為后面每個item 指定格式符
v 格式符:與item 一一對應(yīng)
%c: 顯示字符的ASCII碼 碼
%d, %i: 顯示十進(jìn)制整數(shù)
%e, %E: 顯示科學(xué)計數(shù)法數(shù)值
%f :顯示為浮點數(shù)
10.3:總共10位,包括3個0,一個小數(shù)點
%g, %G :以科學(xué)計數(shù)法或浮點形式顯示數(shù)值
%s :顯示字符串
%u :無符號整數(shù)
下圖為10個字符:
%%: 顯示% 自身
v 修飾符:
#[.#] :第一個數(shù)字控制顯示的寬度;第二個# 表示小數(shù)點后精度,%3.1f
-: 左對齊(默認(rèn)右對齊) %-15s
+號:顯示數(shù)值的正負(fù)符號 %+d
BEGIN:在前面加一個表頭
操作符
v 算術(shù)操作符:
x+y, x-y, x*y, x/y, x^y, x%y
-x: 轉(zhuǎn)換為負(fù)數(shù)
+x: 轉(zhuǎn)換為數(shù)值
v 字符串操作符:沒有符號的操作符,字符串連接
v 賦值操作符:
=, +=, -=, *=, /=, %=, ^=
++, --
v 比較操作符:
==, !=, >, >=, <, <=
v 模式匹配符:~
將/etc/passwd中匹配的是root的打印出來:
將df里以/dev/sd開頭的打印出來
左邊不和右邊匹配包含 !~:不包含bash的行
++在前:先加再打印
++在后:先打印再加:(--同理)
邏輯操作符:與 與&& ,或||,非!
cmd1 與cmd2:兩個命令都要執(zhí)行,都執(zhí)行完再決定最終的結(jié)果為真還是假
cmd1 && cmd2:先看第一個為真,假;如果第一個為假,那么后邊的不管真假與第一個都是假,所以有可能后續(xù)的不執(zhí)行
在awk里的&&的意思與cmd1 與cmd2的含義一樣:
條件表達(dá)式(三目表達(dá)式):
selector?if-true-expression:if-false-expression
如果selector?成立,則執(zhí)行if-true-expression
如果selector?不成立,則執(zhí)行if-false-expression
因為?和:將條件表達(dá)式分成了三段,所以稱為三目表達(dá)式
relational expression: 關(guān)系表達(dá)式,結(jié)果為“真”才會被處理
真:結(jié)果為非0 值,非空字符串
假:結(jié)果為空字符串或0值
數(shù)字里:0為假,非0為真
字符串:只要不為空都為真
line ranges:: 行范圍
startline,endline :/pat1/,/pat2/ 不支持直接給 出數(shù)字
格式
awk -F: ‘/^root\>/,/^nobody\>/{print $1}'
/etc/passwd
awk -F: ‘(NR>=10&&NR<=20){print NR,$1}'
/etc/passwd
NR:文件的行號
NF:文件每行的以符號分割的列數(shù)
v (5) BEGIN/END 模式
BEGIN{}: 僅在開始處理文件中的文本之前執(zhí)行一次
END{} :僅在文本處理完成之后執(zhí)行
awk 控制語句if-else
v 語法:if(condition){statement;…}[else statement]
if(condition1){statement1}else if(condition2){statement2}
else{statement3}
v 使用場景:對awk 取得的整行或某個字段做條件判
查看是否有防火墻以及查看端口號
將9000端口改為默認(rèn)80
awk 控制語句
v while 循環(huán)
v 語法:while(condition){statement;…}
v 條件“真”,進(jìn)入循環(huán);條件“假”, 退出循環(huán)
v 使用場景:
對一行內(nèi)的多個字段逐一類似處理時使用
對數(shù)組中的各元素逐一處理時使用
打印以root開頭的,從第一列開始一直循環(huán)到最后一列,當(dāng)小于最后一列時,將該字符長度和名字打印出來,然后i++,一直循環(huán)到最后一列
do-while 循環(huán)
v 語法:do {statement;…}while(condition)
v無論真假,至少執(zhí)行一次循環(huán)體
-s后可以指定分隔符
for 循環(huán)
v 語法:for(expr1;expr2;expr3) {statement;…}
v 常見用法:
for(variable assignment;condition;iteration process)
{for-body}
v 特殊用法:能夠遍歷數(shù)組中的元素
語法:for(var in array) {for-body}
next:
提前結(jié)束對本行處理而直接進(jìn)入下一行處理(awk 自身循環(huán))
awk 數(shù)組
v 關(guān)聯(lián)數(shù)組:array[index-expression]
v index-expression:
(1) 可使用任意字符串;字符串要使用雙引號括起來
(2) 如果某數(shù)組元素事先不存在,在引用時,awk 會自動創(chuàng)建
此元素,并將其值初始化為“空串”
若要判斷數(shù)組中是否存在某元素,要使用“index in array”格 格
式進(jìn)行遍歷
第一步:第一行1進(jìn)來,$0為1,abc[1]沒有賦值為空,為0;!Abc[1]為1 ,abc[1]++為1;(1,1)
第二步:第二行進(jìn)來,$0為2,abc[2]沒有賦值為空,為0;!Abc[2]為1,abc[2]++為1;(2,1)
第三步:第三行進(jìn)來,$0為1,abc[1]為1,因為第一步已經(jīng)對abc[1]賦值!Abc[1]為0,abc[1]++為2 ;所以(1,2)
第四步:第四行2進(jìn)來,$0為2,abc[2]為1,因為第二步已經(jīng)對abc[2]賦值,
!Abc[2]為0,abc[2]++為2 ;所以(2,2)
第五步:第五行3進(jìn)來,$0為3,abc[3]沒有賦值為空,等于0;!Abc[3]為1,abc[3]++為1;所以(3,1)
以下的同上
awk 數(shù)組
v 若要遍歷數(shù)組中的每個元素,要使用for 循環(huán)
v for(var in array) {for-body}
v 注意:var 會遍歷array
統(tǒng)計單詞出現(xiàn)的次數(shù):(通用代碼,統(tǒng)計別的文件也通用)
統(tǒng)計男生和女生平均成績多少?
awk 函數(shù)
v 數(shù)值處理:
rand() :返回0 和1 之間一個隨機數(shù)
v 字符串處理:
length([s]) :返回指定字符串的長度
sub(r,s,[t]) :對t 字符串進(jìn)行搜索r 表示的模式匹配的內(nèi)容,并將第一個匹
配的內(nèi)容替換為s
echo "2008:08:08 08:08:08" | awk 'sub(/:/,“-",$1)'
gsub(r,s,[t]) :對t 字符串進(jìn)行搜索r 表示的模式匹配的內(nèi)容,并全部替換
為為s 所表示的內(nèi)容
echo "2008:08:08 08:08:08" | awk ‘gsub(/:/,“-",$0)'
split(s,array,[r]) :以r 為分隔符 , 切割字符串s ,并將切割后的結(jié)果保存
至至array 所表示的數(shù)組中,第一個索引值為1, 第二個索引值為2,…
netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}
END{for (i in count) {print i,count[i]}}'
awk 函數(shù)
v 自定義函數(shù)
v 格式:
function name ( parameter, parameter, ... ) {
statements
return expression
}
v 示例:
#cat fun.awk
function max(v1,v2) {
v1>v2?var=v1:var=v2
return var
}
BEGIN{a=3;b=2;print max(a,b)}
awk 腳本
v將 將awk 程序?qū)懗赡_本,直接調(diào)用或執(zhí)行
v 示例:
#cat f1.awk
{if($3>=1000)print $1,$3}
#awk -F: -f f1.awk /etc/passwd
#cat f2.awk
#!/bin/awk –f
#this is a awk script
{if($3>=1000)print $1,$3}
#chmod +x f2.awk
#f2.awk –F: /etc/passwd
向awk 腳本傳遞參數(shù)
v 格式:
awkfile var=value var2=value2... Inputfile
v 注意 :在BEGIN 過程 中不可用。直到 首行輸入完成以后 ,變
量才可用 ??梢酝ㄟ^-v 參數(shù),讓awk 在執(zhí)行BEGIN 之前得到
變量的值。命令行中每一個指定的變量都需要一個-v 參數(shù)
v 示例:
#cat test.awk
#!/bin/awk –f
{if($3 >=min && $3<=max)print $1,$3}
#chmod +x test.awk
#test.awk -F: min=100 max=200 /etc/passwd
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。