成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

AWK使用簡(jiǎn)介

caikeal / 1339人閱讀

摘要:一簡(jiǎn)介如何展示文本內(nèi)容,不在于修改文件,同樣也是一行一行讀入文件格式選項(xiàng)指明輸入時(shí)用到的字段分隔符自定義變量模式匹配到相應(yīng)的行,不標(biāo)注時(shí)匹配整個(gè)文件匹配到匹配的行時(shí),所要做的動(dòng)作。

一:簡(jiǎn)介

如何展示文本內(nèi)容,不在于修改文件,
同樣也是一行一行讀入文件
格式:
awk [options] ‘program’ file
option選項(xiàng):

 -F  指明輸入時(shí)用到的字段分隔符
 -v var=value   自定義變量

program模式: pattern{action .....}

 pattern:匹配到相應(yīng)的行,不標(biāo)注時(shí)匹配整個(gè)文件
 action: 匹配到匹配的行時(shí),所要做的動(dòng)作。常用的為打印 print printf(更復(fù)雜的打印時(shí)使用此選項(xiàng))

eg:
awk –F: ‘{print $1,$2}’ /etc/passwd


awk -F: "{print $1" "$5}" /etc/passwd
“t” 表示tab鍵


awk -F: "{printf $1" "$5"n"}" /etc/passwd
printf 打印默認(rèn)不支持換行,需要增加n

 謹(jǐn)記:printf 打印內(nèi)容時(shí),變量不加”” 。
 

二:awk變量(內(nèi)置):

多練習(xí)方可熟練使用
配合 –v使用
FS:輸入字段分隔符,默認(rèn)為空白字符
awk-v FS=":" "{print $1,FS,$3}’ /etc/passwd
OFS:輸出字段分隔符,默認(rèn)為空白字符
RS:輸入記錄分隔符,指定輸入時(shí)的換行符,原換行符仍有效
ORS:輸出記錄分隔符,輸出時(shí)用指定符號(hào)代替換行符
NF:字段數(shù)量
NR:行號(hào)
FNR:各文件分別計(jì)數(shù),行號(hào)

FILENAME:當(dāng)前文件名
ARGC:命令行參數(shù)的個(gè)數(shù)
ARGV:數(shù)組,保存的是命令行所給定的各參數(shù)

以下為變量的各個(gè)使用舉例:
bash中定義的變量在awd中同樣可以直接拿來(lái)使用

1)FS OFS使用舉例

2)RS ORS 記錄分割符

NR 行號(hào)
FNR 各個(gè)文件 分別計(jì)數(shù)
NF 分割的字段數(shù)量,此變量可用于數(shù)組

   NF和$結(jié)合起來(lái)有更好的妙用
   $NF
   print里面同樣支持?jǐn)?shù)值運(yùn)算
   

3)FILENAME:當(dāng)前文件名

ARGC:命令行參數(shù)的個(gè)數(shù),,,其中’program’ 不算參數(shù)
awk 和最后跟的文件才算參數(shù),由以下例子可以看出此節(jié)

三:awk變量(自定義):

1)-v var=value

2) 在program中直接定義外部?jī)?nèi)部定義都OK

舉例:
awk-v test="hello gawk" "{print test}" /etc/fstab
awk-v test="hello gawk" "BEGIN{print test}"
awk"BEGIN{test="hello,gawk";printtest}"
awk–F:‘{sex=“male”;print$1,sex,age;age=18}’ /etc/passwd

四:printf

在printf中未加”” 的字符串,printf都默認(rèn)識(shí)別為變量
默認(rèn)不換行,要換行加上n

1:格式匹配

格式:
格式要用””引起來(lái)
%c: 顯示字符的ASCII碼
%d,: 顯示十進(jìn)制整數(shù)
%f:顯示為浮點(diǎn)數(shù)
%s:顯示字符串
%%: 顯示%自身
修飾符:
(#.#)第一個(gè)數(shù)字控制顯示的寬度;第二個(gè)#表示小數(shù)點(diǎn)后精度,%3.1f
-: 左對(duì)齊(默認(rèn)右對(duì)齊)%-15s,,15表示寬度
+:顯示數(shù)值的正負(fù)符號(hào)%+d
修飾符一般寫在格式中間,為了進(jìn)一步描述格式
格式和修飾符都是為了修飾后面變量打印的格式

應(yīng)用舉例:
1)格式
%s %d n 字符寬度的綜合使用
左對(duì)齊寬度為25字符

2)增加字符串顯示

2:操作符:

算術(shù)操作符:
x+y, x-y, x*y, x/y, x^y, x%y
-x: 轉(zhuǎn)換為負(fù)數(shù)
+x: 轉(zhuǎn)換為數(shù)值
賦值操作符:
=, +=, -=, *=, /=, %=, ^=
++, --
比較操作符:
==, !=,>, >=, <, <=
邏輯操作符:與&&,或||,非!
示例:
?awk –F: "$3>=0 && $3<=1000 {print $1}" /etc/passwd
?awk -F: "$3==0 || $3>=1000 {print $1}" /etc/passwd
?awk -F: ‘!($3==0){print $1}" /etc/passwd
?awk -F: ‘!($3>=500) {print $3}’ /etc/passwd

3:模式匹配符:

此塊乃極為重要,說到底還是正則的熟練運(yùn)用
~:左邊是否和右邊匹配包含!~:是否不匹配
匹配的內(nèi)容使用 ”” 或// 框起來(lái)
awk–F: "$0 ~ /root/{print $1}‘ /etc/passwd
awk"$0~“^root"" /etc/passwd
awk"$0 !~ /root/‘ /etc/passwd
awk–F: ‘$3==0’ /etc/passwd

應(yīng)用舉例:
awk -F: "$0 ~ /root/{printf $0"n"}" /etc/passwd

正則表達(dá)式的寫法:
awk -F: "$0 ~ /^root/{printf $0"n"}" /etc/passwd

模式匹配與操作符的綜合使用:
awk -F: "$3>=500{printf $0"n"}" /etc/passwd

awk -F: "$3>=500&&$3<=1000{printf "%-25s %-20dn" ,$1,$3}" /etc/passwd


邏輯非時(shí),后面的比較操作符要加()
awk -F: " !($3>=500){printf "%-25s %-20d " ,$1,$3}" /etc/passwd

4:條件表達(dá)式(三目表達(dá)式):

selector?if-true-expression:if-false-expression

四:PATTERN

awk 格式:
awk option ‘pattern{action}’ file
PATTERN:根據(jù)pattern條件,過濾匹配的行,再做處理,不匹配的行不做處理

1如果未指定:空模式,匹配每一行 2 /regular expression/:僅處理能夠模式匹配到的行,需要用/ /括起來(lái)

awk "/^UUID/{print $1}" /etc/fstab

             打印以UUID開頭的行的 第一個(gè)字段

awk "!/^UUID/{print $1}" /etc/fstab
打印不以 UUID開頭的行的 第一個(gè)字段

打印分區(qū)利用率

3 relational expression: 關(guān)系表達(dá)式,

結(jié)果為“真”才會(huì)被處理
真:結(jié)果為非0值,非空字符串
假:結(jié)果為空字符串或0值
0和沒有內(nèi)容視作為0值

awk -F: -v n=0 "n++{printf "%-25s %sn",$1,$5}" /etc/passwd

     此例子很有意思,因?yàn)閍wk是一行一行處理,所以此次輸出的結(jié)果是第一行沒有,后面的行都有輸出                  

注意:多次使用print打印,中間加;

不顯示/etc/passwd中以/bin/bash結(jié)尾的行
1)awk -F: "$NF !="/bin/bash"" /etc/passwd


2)此寫法使用~匹配符號(hào)
awk -F: "$NF !~/bash$/" /etc/passwd

4 line ranges:行范圍

startline,endline:/pat1/,/pat2/不支持直接給出數(shù)字格式
一找到part1 的就開始打印 匹配到 part2 結(jié)束本次循環(huán)
再次找part1 開始打印 找到pqrt2結(jié)束 .......
eg:
awk "/^r/,/^h/" /etc/passwd
匹配到以r開頭 至以h開頭的行

awk "NR>=10&&NR<=20{print NR,$0}" /etc/passwd
打印第10行到第20行

5 BEGIN END

開頭結(jié)尾打印,與其他沒有關(guān)系
awk -F: "BEGIN{print "username uid"}NR>=10&&NR<=20{printf "%-20s %-10sn", $1,$3}" /etc/passwd

加上表頭

awk -F: "BEGIN{print "username uidn-------------------------------"}NR>=10&&NR<=20{printf "%-20s %-10sn", $1,$3}END{print "---------------------------------"}" /etc/passwd

加上列:
awk -F: "BEGIN{print "username uidn-------------------------------"}NR>=10&&NR<=20{printf "%-20s |%-10sn", $1,$3}END{print "---------------------------------"}"

六:控制語(yǔ)句

常用:action

1)算術(shù)運(yùn)算,比較表達(dá)式

2)控制語(yǔ)句,if while for

3) print

常用 控制語(yǔ)句:

1){statement;........}

2) if(條件判斷){命令}

3)if(條件判斷){命令}else {命令}

4)while(條件){命令}

5)for(1,2,3){命令}

6) break continue

1 if else使用舉例

格式:
if(condition){statement;…}[else statement]
if(condition1){statement1}else if(condition2){statement2}
else{statement3}

舉例 /ets/fstab 一行中 字段數(shù)多于5個(gè)的打印

2 while 循環(huán)

awk中內(nèi)置循環(huán),while用于行中的循環(huán)處理
舉例:

1)取出每個(gè)單詞,并輸出其長(zhǎng)度

awk -F: "{i=1;while(i<=NF){print $i,length($i);i++}}" /etc/passwd

2)取出以root開頭行,,并輸出其長(zhǎng)度,及每個(gè)單詞

awk -F: "/^root/{i=1;while(i<=NF){print $i,length($i);i++}}" /etc/passwd

3)取出以root開頭行,,并輸出每個(gè)單詞,單詞長(zhǎng)度要大于5個(gè)字母
awk -F: "/^root/{i=1;while(i<=NF){if(length($i)>=4)print $i,length($i);i++}}" /etc/passwd

3 for循環(huán)

格式:for(1,2,3){4}

特殊用法是:遍歷數(shù)組中的元素,后續(xù)介紹

4 break, continue的使用

break 中斷循環(huán);continue,跳出此次循環(huán),進(jìn)行下一次循環(huán)

七:AWK數(shù)組

awk使用的數(shù)組為關(guān)聯(lián)數(shù)組
awk常常使用for循環(huán)來(lái)遍歷數(shù)組中的元素
舉例:

1 重復(fù)的行不打印
awk ‘!arr[$0]++’ f1

此語(yǔ)句中先行運(yùn)行取反操作,再執(zhí)行++命令,再去打印,最后再給arr[$0] 加1

2)使用for循環(huán)遍歷數(shù)組
格式:for(var in arr){action }

     var會(huì)遍歷arr數(shù)組的每一個(gè)索引

遍歷 ss –nat連接狀態(tài)出現(xiàn)的次數(shù)

 ss -nat|awk "!/^State/{arr[$1]++}END{for(i in arr){print i,arr[i]}}"
 arr[$1]++: $1代表第一字段,++代表第一字段相同時(shí)加1
 for(i  in arr):i遍歷數(shù)組arr的下標(biāo),并把下標(biāo)的值賦給變量i
 另外此塊很重要的另外一部分在于語(yǔ)法書寫的格式,這個(gè)在于多寫多練,寫的多了,熟練之后,自然出錯(cuò)的地方就會(huì)越來(lái)越少

ss -nat|awk "!/^State/{arr[$1]++}END{for(i in arr){print i,arr[i]}}"

八:函數(shù) 1 數(shù)值處理

rand():返回0和1之間的隨機(jī)數(shù),但要配合srand使用
格式: srand()相當(dāng)于種子,先調(diào)用srand() rand()方能生效
eg:
1 :生成0到1之間的隨機(jī)數(shù)
awk ‘BEGIN{print srand(),rand()}’

2:生成1-100之間的隨機(jī)整數(shù)
awk "BEGIN{srand();print int(rand()*100)}" int可以定義輸出為整數(shù)

3:生成10個(gè)1-100之間的隨機(jī)整數(shù)
awk "BEGIN{srand();for(i=0;i<=10;i++){print int(rand()*100)}}"

2 字符串處理

1:length([s]):返回指定字符串的長(zhǎng)度

2:sub(r,s,[t]):對(duì)t字符串進(jìn)行搜索r表示的模式匹配的內(nèi)容,并將第一個(gè)匹配的內(nèi)容替換為s
eg:字符串中的:用-來(lái)進(jìn)行替代。模式匹配時(shí)注意加上//
echo "ac:d:e:f:g"|awk "sub(/:/,"-",$0)"

  echo "a:b:c:d:e:f:g"|gawk "sub(/:/,"-",$0)" 

3 gsub(r,s,[t]):對(duì)t字符串進(jìn)行搜索r表示的模式匹配的內(nèi)容,并全部替換為s所表示的內(nèi)容
全局替換,例子在2中

4 split(s,array,[r]):以r為分隔符,切割字符串s,并將切割后的結(jié)果保存至array所表示的數(shù)組中,第一個(gè)索引值為1,第二個(gè)索引值為2,…
eg:統(tǒng)計(jì)netstat –ant 中外部ip地址出現(xiàn)的次數(shù)
netstat -ant|awk "/^tcp>/{split($5,arr,":");count[arr[1]]++}END{for(i in count){print i,count[i]}}"

3 自定義函數(shù)

格式:
function name ( parameter, parameter, ... ) {
statements
return expression
}

eg:#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 -f fak.awk

九:awk調(diào)用shell中的命令

1 使用system命令
2 除了awk中定義的變量,其他全用””括起來(lái)
eg:
awk ‘BEGIN{system("hostname") }"
awk"BEGIN{score=100; system("echo your score is " score) }"

十:實(shí)例 1 求平均值
awk -F " " "{sum+=$1} END {print sum/NR}"  a.txt

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

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

相關(guān)文章

  • 三劍客之AWK

    摘要:使用中,需要處理的文件,逐行使用分隔符分割成若干個(gè)字段,稱之為域,分隔符默認(rèn)是空格,可使用選項(xiàng)來(lái)指定分隔符腳本模式將所需執(zhí)行的命令插入腳本文件,然后在首行設(shè)置命令解釋器為通過鍵入腳本名的方式調(diào)用。 博文參考 http://www.178linux.com/6553 http://baike.baidu.com/link?url=Y4lo-kWxygpw7NLaKTSehvpkAM7og...

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

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

0條評(píng)論

閱讀需要支付1元查看
<