国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

三劍客之AWK

csRyan / 1300人閱讀

摘要:使用中,需要處理的文件,逐行使用分隔符分割成若干個(gè)字段,稱之為域,分隔符默認(rèn)是空格,可使用選項(xiàng)來(lái)指定分隔符腳本模式將所需執(zhí)行的命令插入腳本文件,然后在首行設(shè)置命令解釋器為通過(guò)鍵入腳本名的方式調(diào)用。

博文參考
http://www.178linux.com/6553
http://baike.baidu.com/link?url=Y4lo-kWxygpw7NLaKTSehvpkAM7ogKA6GPVxaM23MMSzjmfsx4o3mey7-VVqu1pDhZJqa0sr7cJNhggIHC5JT_
AWK簡(jiǎn)介
 awk是一種模式掃描和處理工具,相對(duì)于grep的查找,sed的編輯,它在對(duì)數(shù)據(jù)進(jìn)行分析生成報(bào)表時(shí)顯得尤為強(qiáng)大。awk通過(guò)逐行遍歷一個(gè)或多個(gè)文件的方式,查找模式匹配到的行,而后以指定的分隔符(缺省為空格)進(jìn)行切片,然后針對(duì)切片數(shù)據(jù)進(jìn)行處理和分析。事實(shí)上,gawk有自己的語(yǔ)言,其本身就相當(dāng)于一個(gè)解釋器,允許用戶創(chuàng)建簡(jiǎn)短的程序讀取輸入文件,對(duì)輸入數(shù)據(jù)執(zhí)行排序、計(jì)算以及生成報(bào)表操作,甚至可以類似bash shell實(shí)現(xiàn)諸如循環(huán)、數(shù)組、條件判斷、函數(shù)、變量等功能,進(jìn)而完成更為復(fù)雜的數(shù)據(jù)分析處理任務(wù)。
awk的使用方式

1、命令行方式:awk [-F field-separator] ‘COMMAND’inputfiles

//其中COMMAND是awk的執(zhí)行命令,用來(lái)處理數(shù)據(jù),[-F field-separator]是可選選項(xiàng),inputfiles是待處理文件。

//awk使用中,需要處理的文件,逐行使用分隔符分割成若干個(gè)字段,稱之為域,分隔符默認(rèn)是空格,可使用-F選項(xiàng)來(lái)指定分隔符

2、shell腳本模式
將所需執(zhí)行的awk命令插入awk腳本文件,然后在首行設(shè)置命令解釋器為#!/bin/awk,通過(guò)鍵入腳本名的方式調(diào)用。

3、所有awk命令寫(xiě)入到一個(gè)多帶帶的文件,當(dāng)處理同一類文件需求時(shí),使用awk -f awk-script inputfiles調(diào)用之,其中awk-script指awk腳本。

awk基本用法
awk[OPTIONS]"program"FILE1 FILE2...

program:PATTERN{ACTION STATEMENT}
program:編程語(yǔ)言
PATTERN:模式
ACTION STATEMENT:動(dòng)作語(yǔ)句,可以有多個(gè)語(yǔ)句組成,各語(yǔ)句之間使用分號(hào)隔開(kāi);如:print,printf
OPTIONS:
    -F[]:指明輸入字段分隔符
    -v VAR_NAME=VALUE:變量賦值
    -f /PATH/FROM/AWK_SCRIPT 指定腳本文件
awk處理文本按一行讀取,根據(jù)輸入分隔符切片(默認(rèn)為空格字符),切n個(gè)片,然后將每個(gè)片賦予awk內(nèi)部一個(gè)變量進(jìn)行保存,其這個(gè)過(guò)程變量名為$1,$2,$3...直到最后一個(gè),最后就可以對(duì)這些片多帶帶處理。

print輸出命令
輸出默認(rèn)分割符:空白字符
item之間逗號(hào)分割
print " " 輸出空白字符print $0 輸出整行
awk [options] "BEGIN{action}pattern{action}END{action}" file
awk 語(yǔ)法組成: BEGIN語(yǔ)句塊,能夠使用模式匹配的通用語(yǔ)句塊,END語(yǔ)句塊
awk執(zhí)行時(shí),由分隔符分割的字段(域)標(biāo)記$1,$2,$n為域標(biāo)識(shí),$0為所有域
文件的每一行稱為記錄
省略action默認(rèn)執(zhí)行print $0操作

pattern 模式
action  動(dòng)作;行為
row column  行,記錄
record field 列,域,字段

案例

[root@mm ~]#echo -e "hello,world 
hello world" >1.sh
基本輸出
[root@mm ~]#awk "{print $1}" 1.sh
引號(hào)的作用
[root@mm ~]#awk "{print "hi",$1}" 1.sh
[root@mm ~]#awk "{print "hi:$1"}" 1.sh
[root@mm ~]#awk "{print "hi:$1",666}" 1.sh
空白輸出
[root@mm ~]#awk "{print}" 1.sh
[root@mm ~]#awk "{print ""}" 1.sh

awk默認(rèn)從鍵盤(pán)輸入,不管輸入什么,輸出都是hello

變量
內(nèi)置變量:
FS:輸出字段分割符,默認(rèn)空白
RS:輸入時(shí)的行分割符,默認(rèn)換行符
OFS:輸出時(shí)的字段分割符,默認(rèn)空白字符
ORS:輸出時(shí)的行分割符,默認(rèn)換行符
NF
    print NF:當(dāng)前行的字段數(shù)
    print $NF:顯示當(dāng)前行的第NF字段的值
NR:行數(shù);命令后跟的所有文件統(tǒng)一合并計(jì)算
FNR:行數(shù);個(gè)文件多帶帶計(jì)數(shù)
FILENAME:當(dāng)前正被awk讀取的文件名
ARGC:awk命令行中的參數(shù)個(gè)數(shù)
ARGV:數(shù)組,保存命令行參數(shù)本身
自定義變量:





awk -F: "END{print NF}" /etc/passwd #表示以:分割的有7段(顯示總字段)
awk -F: "{print $(NF-1)}" /etc/passwd #取出最后一個(gè)字段的
awk -F: "{print NR,$1}" /etc/passwd #顯示行號(hào)
awk "{print NR,$0}" /etc/issue /etc/fstab #兩個(gè)文件合并顯示行號(hào)
awk "{print FNR,$0}" /etc/issue /etc/fstab #兩個(gè)文件分開(kāi)顯示行號(hào)
awk "{print FNR,$0,FILENAME}" /etc/issue /etc/fstab 顯示文件名(FILENAME)

awk "BEGIN{print ARGC}" /etc/issue /etc/fstab /etc/passwd #顯示給的參數(shù)個(gè)數(shù)(BEGIN只顯示一個(gè)參數(shù))
awk "BEGIN{print ARGC,ARGV[2]}" /etc/issue /etc/fstab /etc/passwd #根據(jù)參數(shù)的個(gè)數(shù)(索引)取出文件名([0]下標(biāo)是awk)
awk "BEGIN{print ARGC,ARGV[ARGC-2]}" /etc/issue /etc/fstab /etc/passwd #倒著顯示給的參數(shù)
awk "{sex="male";print sex}" /etc/passwd #打印變量自定義sex
awk "END{sex="male";print sex}" /etc/passwd #打印最后一個(gè)sex
awk "{sex="male";age=20;print sex,age}" /etc/passwd  #必須先定義再使用,不然第一個(gè)定義不到

案例

[root@mm ~]#awk -F, "{print $1}" 1.sh
[root@mm ~]#awk -v FS="," "{print $1}" 1.sh
[root@mm ~]#awk -v FS="," "{print $1,$2}" 1.sh
[root@mm ~]#awk -v FS="," -v OFS="&" "{print $1,$2}" 1.sh
[root@mm ~]#awk -v RS=" " "{print $1}" 1.sh
[root@mm ~]#awk -v RS=" " -v ORS="-" "{print}" 1.sh
[root@mm ~]#awk "{print NF}" 1.sh
[root@mm ~]#awk "{print $NF}" 1.sh
[root@mm ~]#awk "{print NR}" 1.sh 2.sh
[root@mm ~]#awk "{print FNR}" 1.sh 2.sh
[root@mm ~]#awk "{print FILENAME}" 1.sh
[root@mm ~]#awk "{print ARGC}" 1.sh
[root@mm ~]#awk "{print ARGV[0]}" 1.sh 
[root@mm ~]#awk "{print ARGV[1]}" 1.sh
[root@mm ~]#awk -v hi="hi bro" "{print hi}" 1.sh
[root@mm ~]#awk "{hi="hi bro";print hi}" 1.sh
printf輸出命令
%c:顯示字符ASCLL碼
%d,%i:十進(jìn)制整數(shù)
%e,%E:科學(xué)計(jì)數(shù)法顯示數(shù)值
%f:浮點(diǎn)數(shù)
%g,%G:科學(xué)計(jì)數(shù)法或浮點(diǎn)數(shù) 格式顯示數(shù)值
%s:字符串
%u:無(wú)符號(hào)整數(shù)
%%:%符合本身

案例

[root@mm grub.d]#cat /etc/issue
User:Centos,UID:6
User:Kernel,UID:0    
User:, UID:0
User:CentOS release 6.6(Final)
User:Kernel 
 on an m
User:
awk -F: "{printf "User:%s
",$1}" /etc/issue
User:%s
表示對(duì)后面$1的內(nèi)容以字符串形式顯示,并且在其前面加上User:字符串,同時(shí)結(jié)尾添加換行符
awk -F" " "{printf "User:%s,UID:%d
",$1,$3}" /etc/issue
User:%s,UID:%d
表示對(duì)后面的$1的內(nèi)容以字符串的形式顯示,對(duì)$2后面內(nèi)容十進(jìn)制顯示,同時(shí)結(jié)尾添加換行符。
awk -F" " "{printf"User:%-15s,UID:%15d
",$1,$3}" /etc/issue
左邊一欄以左對(duì)齊方式顯示15個(gè)字符長(zhǎng)度,右邊欄以默認(rèn)對(duì)齊方式右對(duì)齊顯示15個(gè)字符的長(zhǎng)度
[root@mm ~]#awk -F, "{printf "first record:%s
",$1}" 1.sh

三目表達(dá)式{條件滿足 條件不滿足?滿足 執(zhí)行命令:不滿足 執(zhí)行命令;打印%15是占位符($1) %-s是占位符(usertype) n (換行符) :(冒號(hào)分割符)}

awk -F: "{printf "%s",$1}" /etc/passwd #%s占位符,%s后加/n換行
awk  -F: "{printf "%s %4.2f
",$1,$3}" /etc/passwd #%s是$1占位符;%4.2f指2位小數(shù),$3的占位符
awk -F: "{printf "username:%-30s uid:%10d
",$1,$3}" /etc/passwd #username(顯示):(分割符)%-30s(%s是$1的占位符并且左對(duì)齊-30個(gè)字符) uid(顯示):%10d(%d是$3的占位符10右對(duì)齊)
(換行)",$1,$3
操作符
a.算數(shù)操作符
    -x:負(fù)值
    +x:轉(zhuǎn)化為數(shù)值
b.字符操作符
c.賦值操作符
    =,+=,-=,*=,/=,%=,^=,++,--
d.比較操作符
    >,>=,<,<=,==,!=
awk -F: "!($3>=50){print $3}" /etc/passwd
e.模式匹配配操作符
    ~:是否能由右側(cè)指定的模式所匹配
    ~!:是否不能由右側(cè)指定模式所匹配
f.邏輯操作符
    &&:與運(yùn)算
awk -F: "$3>=0 && $3<=1000 {print $1}" /etc/passwd
    ||:或運(yùn)算
g.條件表達(dá)式
awk -F: "{$3>=500?usertype="Common User":usertype="Sysadmin or Sysuser";printf "%15s:%-s
",$1,usertype}" /etc/passwd
h.函數(shù)調(diào)用

案例

[root@mm ~]#awk -F: "$3>=0 && $3<=1000 {print $1}" /etc/passwd
[root@mm grub.d]#awk -F: "!($3>=50){print $3}" /etc/passwd

[root@mm grub.d]#awk -F: "BEGIN{print "username    uid 
------------"}{print $1,$3}END{print"========="}" /etc/passwd
PATTERN模式
1)empty:空模式,匹配所有行
2)/Regular Expression/:僅將ACTION應(yīng)用于能夠被Regular Expression所匹配到的行
awk -F: "/^[ab]/{print $1,$3}" /etc/passwd
3)relational expression:關(guān)系表達(dá)式,結(jié)果非0或非空字符串為真,否則為假;
awk -F: "$3>=500{print $1,$3}" /etc/passwd
awk -F: "$1~/root/{print $1,$3}" /etc/passwd
4)line ranges:行范圍
5)BEGIN/END
    BEGIN:格式化前用于輸出表頭或做一個(gè)預(yù)處理操作
    END:格式化后用于輸出表尾或做出清理操作

案例

常用ACTION
1)EXPRESSIONS:變量賦值
2)Control Statements:控制語(yǔ)句
3)Compound Statements:復(fù)合語(yǔ)句
4)input statements
5)output statements 
控制語(yǔ)句
第一中用法:
1)if-else
awk -F: "{if($3>=500)print $1,$3}" /etc/passwd
[root@mm ~]#awk "{if(NF>=6)print NF,$0}" /etc/passwd
[root@mm ~]#awk "{if(NF>=6)print NF,$0}" /etc/passwd
[root@mm ~]#awk -F: "{if($3>=500){print $1,"is a common user"} else {print $1,"is a sysadmin or sysuser"}}" /etc/passwd
2)while 循環(huán)
awk "{i=1;while(i<=NF){if(length($i)>=6){print $i};i++}}" /etc/passwd
3)do-while 循環(huán)
4)for 循環(huán)
awk "{for(i=1;i<=NF;i++){if(length($i)>=6)print $i}}" /etc/issue
第二中用法:
5)swtich                                                                                    
6)break and continue
7)next:提前結(jié)束本行處理;提前進(jìn)入下行處理操作
awk -F: "{if($3%2==0)next;print $1,$3}" /etc/passwd
數(shù)組
關(guān)聯(lián)數(shù)組
    index-expression:可以使用任意字符
數(shù)組遍歷
函數(shù)
1)內(nèi)建函數(shù)
數(shù)值處理:rand():返回0至1之間的一個(gè)隨機(jī)數(shù)
字符串處理:
length([s]):返回指定的字符串的長(zhǎng)度
sub(r,s[,t]):
gsub(r,s[,t]):
split(s,a[,r]):
2)用戶自定義函數(shù) 

經(jīng)驗(yàn)

統(tǒng)計(jì)指定的web訪問(wèn)日志中各ip的資源訪問(wèn)次數(shù)
awk "{ip[$1]++}END{for(i in ip)print i,ip[i]}" /var/log/httpd/access_log 
統(tǒng)計(jì)當(dāng)前系統(tǒng)上所有tcp連接的各種狀態(tài)的個(gè)數(shù)
ss -tan|awk "!/^State/{state[$1]++}END{for(i in state)print i,state[i]}"

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/40626.html

相關(guān)文章

  • 【程序員必備】知識(shí)點(diǎn) 持續(xù)更新

    TCP/IP HTTP和HTTPS有何區(qū)別? httpbin 一個(gè)簡(jiǎn)單的HTTP請(qǐng)求和響應(yīng)服務(wù)。 TCP的三次握手與四次揮手 通俗易懂版,詳細(xì)版本 MySQL CHAR和VARCHAR存取的差別 《高性能MySQL》筆記 - MySQL 鎖的基本類型 MySQL中的鎖之一:鎖的必要性及分類 MySQL中的鎖之二:行鎖、頁(yè)鎖、表鎖 MySQL Like與Regexp的區(qū)別 數(shù)據(jù)結(jié)構(gòu) 數(shù)...

    hellowoody 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<