怎么用linux的AWK創(chuàng)建文件-創(chuàng)新互聯(lián)

這篇文章主要介紹了怎么用linux的AWK創(chuàng)建文件的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇怎么用linux的AWK創(chuàng)建文件文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比石家莊網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式石家莊網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋石家莊地區(qū)。費(fèi)用合理售后完善,十多年實(shí)體公司更值得信賴。

awk處理過(guò)程: 依次對(duì)每一行進(jìn)行處理,然后輸出,與sed區(qū)別:awk讀到內(nèi)存。

默認(rèn)分隔符是空格或者tab鍵

案例一:

BEGIN{} {} END{} filename

行處理前 行處理 行處理后 文件名

# awk 'BEGIN{ print 1/2} {print "ok"} END{print "---"}' /etc/hosts

或者:

[root@awk ~]# cat /etc/hosts | awk 'BEGIN{print 1/2} {print "ok"} END{print "----"}'

0.5

ok

ok

----

記錄和字段

awk假設(shè)它的輸入是有結(jié)構(gòu)的,而不是一串無(wú)規(guī)則的字符。默認(rèn)它將每個(gè)輸入行作為一條記錄,而將由空格或制表符分隔的單詞作為字段。

awk 按記錄處理:一行是一條記錄,因?yàn)閍wk默認(rèn)以換行符分開的字符串是一條記錄。(默認(rèn)\n換行符:記錄分隔符)

記錄:以記錄分割符分割的字符串 默認(rèn)是換行

字段:以字段分割符分割的字符串 默認(rèn)是單個(gè)或多個(gè)“ ” tab鍵。

========================================

awk中的變量:

$0:表示整行;

NF : 統(tǒng)計(jì)字段的個(gè)數(shù)

$NF:是number finally,表示最后一列的信息

RS:輸入記錄分隔符;

ORS:輸出記錄分隔符。

NR:打印記錄號(hào),(行號(hào))

FNR:可以分開,按不同的文件打印行號(hào)。

FS : 輸入字段分隔符,默認(rèn)為一個(gè)空格。

OFS 輸出的字段分隔符,默認(rèn)為一個(gè)空格。

FILENAME 文件名 被處理的文件名稱

$1 第一個(gè)字段,$2第二個(gè)字段,依次類推...

案例:

FS(輸入字段分隔符)---一般簡(jiǎn)寫為-F(屬于行處理前)

[root@awk ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} {print $1}'

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

operator

games

[root@awk ~]# cat /etc/passwd | awk -F : '{print $1}'

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

operator

注:如果-F不加默認(rèn)為空格區(qū)分!

===============================================================

OFS(輸出字段分隔符)

[root@awk ~]# cat /etc/passwd | awk 'BEGIN{FS=":";OFS=".."} {print $1,$2}'

root..x

bin..x

daemon..x

adm..x

lp..x

sync..x

shutdown..x

halt..x

mail..x

======================================================================

1.創(chuàng)建兩個(gè)文件

[root@awk ~]# vim a.txt

love

love.

loove

looooove

[root@awk ~]# vim file1.txt

isuo

IPADDR=192.168.246.211

hjahj123

GATEWAY=192.168.246.1

NETMASK=255.255.255.0

DNS=114.114.114.114

NR 表示記錄編號(hào), 當(dāng)awk將行為記錄時(shí), 該變量相當(dāng)于當(dāng)前行號(hào)

[root@awk ~]# awk '{print NR,$0}' a.txt file1.txt

1 love

2 love.

3 loove

4 looooove

5

6 isuo

7 IPADDR=192.168.246.211

8 hjahj123

9 GATEWAY=192.168.246.1

10 NETMASK=255.255.255.0

11 DNS=114.114.114.114

FNR:表示記錄編號(hào), 當(dāng)awk將行為記錄時(shí), 該變量相當(dāng)于當(dāng)前行號(hào)(不同文件分開)

[root@awk ~]# awk '{print FNR,$0}' a.txt file1.txt

1 love

2 love.

3 loove

4 looooove

5

1 isuo

2 IPADDR=192.168.246.211

3 hjahj123

4 GATEWAY=192.168.246.1

5 NETMASK=255.255.255.0

6 DNS=114.114.114.114

===========================================================

RS(輸入記錄分隔符)

1.創(chuàng)建一個(gè)文件

[root@awk ~]# vim passwd

root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologin

[root@zabbix-server ~]# cat passwd | awk 'BEGIN{RS="bash"} {print $0}'

root:x:0:0:root:/root:/bin/

bin:x:1:1:bin:/bin:/sbin/nologin

ORS(輸出記錄分隔符)

2.對(duì)剛才的文件進(jìn)行修改

[root@awk ~]# vim passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@awk ~]# cat passwd | awk 'BEGIN{ORS=" "} {print $0}'

root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin

===========================================================

NF:統(tǒng)計(jì)列的個(gè)數(shù)

[root@awk ~]# cat /etc/passwd | awk -F : '{print NF}'

7

7

7

7

$NF:打印最后一列

[root@awk ~]# cat /etc/passwd | awk -F : '{print $NF}'

/bin/bash

/sbin/nologin

/sbin/nologin

/sbin/nologin

/sbin/nologin

練習(xí)1:將文件合并為一行

[root@awk ~]# cat /etc/passwd | awk 'BEGIN{ORS="" } {print $0}'

練習(xí)2:把一行內(nèi)容分成多行

1.首先創(chuàng)建一個(gè)文件

[root@awk ~]# vim d.txt

root:x:0:0:root:/root:/bin/bash

[root@awk ~]# cat d.txt | awk 'BEGIN{RS=":"} {print $0}'

root

x

0

0

root

/root

1.打印一個(gè)文件中的第2列和第3列

# cat /etc/passwd | awk -F : '{print $2,$5}'

2.打印指定行指定列的某個(gè)字符

# free -m | awk 'NR==2 {print $2}'

3.統(tǒng)計(jì)一個(gè)文件的行數(shù)

# cat /etc/passwd | awk '{print NR}'

4.在awk中使用if條件判斷

++i:從1開始加,賦值在運(yùn)算

i++: 從0開始加,運(yùn)算在賦值

if語(yǔ)句:

{if(表達(dá)式){語(yǔ)句;語(yǔ)句;...}}

顯示管理員用戶姓名

# cat /etc/passwd | awk -F : '{if($3==0) {print $1 " is administrator"}}'

統(tǒng)計(jì)系統(tǒng)用戶

# cat /etc/passwd | awk -F : '{if($3>=0 && $3<1000){i++}} END{print i}'

5.在awk中使用for循環(huán)

# cat /etc/passwd | awk '{for(i=1;i<=2;i++) {print $0}}'

root:x:0:0:root:/root:/bin/bash

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

分別打印每行每列

# cat /etc/passwd | awk -F : '{ for(i=1;i<=NF;i++) {print $i}}'

root

x

0

0

root

/root

/bin/bash

數(shù)組遍歷--用來(lái)統(tǒng)計(jì)網(wǎng)站日志,tcp連接狀態(tài)等。

++i:從1開始加,賦值在運(yùn)算

i++: 從0開始加,運(yùn)算在賦值

按索引遍歷:

1.先創(chuàng)建一個(gè)test文件

# vim test.txt

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

# cat test.txt | awk -F : '{username[x++]=$1} END{for(i in username) {print i,username[i]}}'

0 root

1 bin

# cat test.txt | awk -F : '{username[++x]=$1} END{for(i in username) {print i,username[i]}}'

1 root

2 bin

注意:變量i是索引

實(shí)際案例

1. 統(tǒng)計(jì)/etc/passwd中各種類型shell的數(shù)量

# cat /etc/passwd | awk -F: '{shells[$NF]++} END{ for(i in shells){print i,shells[i]} }'

2.統(tǒng)計(jì)nginx日志出現(xiàn)的狀態(tài)碼

# cat access.log | awk '{stat[$9]++} END{for(i in stat){print i,stat[i]}}'

3.統(tǒng)計(jì)當(dāng)前nginx日志中每個(gè)ip訪問(wèn)的數(shù)量

# cat access.log | awk '{ips[$1]++} END{for(i in ips){print i,ips[i]}}'

4.統(tǒng)計(jì)某一天的nginx日志中的不同ip的訪問(wèn)量

# cat access.log |grep '28/Sep/2019' | awk '{ips[$1]++} END{for(i in ips){print i,ips[i]}}'

5.統(tǒng)計(jì)nginx日志中某一天訪問(wèn)最多的前10個(gè)ip

# cat access.log |grep '28/Sep/2019' | awk '{ips[$1]++} END{for(i in ips){print i,ips[i]}}' |sort -k2 -rn | head -n 2

sort:排序,默認(rèn)升序

-k:指定列數(shù)

-r:降序

-n:以數(shù)值來(lái)排序

6.統(tǒng)計(jì)tcp連接的狀態(tài)---下去自己查各個(gè)狀態(tài),包括什么原因造成的!

# netstat -n | awk '/^tcp/ {tcps[$NF]++} END {for(i in tcps) {print i, tcps[i]}}'

LAST_ACK 5 (正在等待處理的請(qǐng)求數(shù))

SYN_RECV 30

ESTABLISHED 1597 (正常數(shù)據(jù)傳輸狀態(tài))

FIN_WAIT1 51

FIN_WAIT2 504

TIME_WAIT 1057 (處理完畢,等待超時(shí)結(jié)束的請(qǐng)求數(shù))

UV與PV統(tǒng)計(jì)

=================================================================

1.根據(jù)訪問(wèn)IP統(tǒng)計(jì)UV

# cat access.log | awk '{print $1}' |sort |uniq -c | wc -l

uniq:去重

-c:每行連續(xù)出現(xiàn)的次數(shù)

2.更具訪問(wèn)ip統(tǒng)計(jì)PV

# cat access.log | awk '{print $1}' |wc -l

或者是url

# cat access.log | awk '{print $7}' |wc -l

3.查詢?cè)L問(wèn)最頻繁的URL

# cat access.log | awk '{print $7}'|sort | uniq -c |sort -n -k 1 -r | more

more:以一頁(yè)一頁(yè)的形式顯示

4.查詢?cè)L問(wèn)最頻繁的IP

# cat access.log | awk '{print $1}'|sort | uniq -c |sort -n -k 1 -r | more

關(guān)于“怎么用linux的AWK創(chuàng)建文件”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“怎么用linux的AWK創(chuàng)建文件”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。

當(dāng)前標(biāo)題:怎么用linux的AWK創(chuàng)建文件-創(chuàng)新互聯(lián)
轉(zhuǎn)載來(lái)于:http://www.muchs.cn/article40/coisho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、App設(shè)計(jì)、建站公司、網(wǎng)站排名、用戶體驗(yàn)、微信公眾號(hào)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)