這篇文章主要介紹了怎么用linux的AWK創(chuàng)建文件的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇怎么用linux的AWK創(chuàng)建文件文章都會有所收獲,下面我們一起來看看吧。
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比石家莊網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式石家莊網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務覆蓋石家莊地區(qū)。費用合理售后完善,十多年實體公司更值得信賴。awk處理過程: 依次對每一行進行處理,然后輸出,與sed區(qū)別:awk讀到內(nèi)存。
默認分隔符是空格或者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)的,而不是一串無規(guī)則的字符。默認它將每個輸入行作為一條記錄,而將由空格或制表符分隔的單詞作為字段。
awk 按記錄處理:一行是一條記錄,因為awk默認以換行符分開的字符串是一條記錄。(默認\n換行符:記錄分隔符)
記錄:以記錄分割符分割的字符串 默認是換行
字段:以字段分割符分割的字符串 默認是單個或多個“ ” tab鍵。
========================================
awk中的變量:
$0:表示整行;
NF : 統(tǒng)計字段的個數(shù)
$NF:是number finally,表示最后一列的信息
RS:輸入記錄分隔符;
ORS:輸出記錄分隔符。
NR:打印記錄號,(行號)
FNR:可以分開,按不同的文件打印行號。
FS : 輸入字段分隔符,默認為一個空格。
OFS 輸出的字段分隔符,默認為一個空格。
FILENAME 文件名 被處理的文件名稱
$1 第一個字段,$2第二個字段,依次類推...
案例:
FS(輸入字段分隔符)---一般簡寫為-F(屬于行處理前)
[root@awk ~]# cat /etc/passwd | awk 'BEGIN{FS=":"} {print $1}'
root
bin
daemon
adm
lp
sync
shutdown
halt
operator
games
[root@awk ~]# cat /etc/passwd | awk -F : '{print $1}'
root
bin
daemon
adm
lp
sync
shutdown
halt
operator
注:如果-F不加默認為空格區(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)建兩個文件
[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 表示記錄編號, 當awk將行為記錄時, 該變量相當于當前行號
[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:表示記錄編號, 當awk將行為記錄時, 該變量相當于當前行號(不同文件分開)
[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)建一個文件
[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.對剛才的文件進行修改
[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)計列的個數(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
練習1:將文件合并為一行
[root@awk ~]# cat /etc/passwd | awk 'BEGIN{ORS="" } {print $0}'
練習2:把一行內(nèi)容分成多行
1.首先創(chuàng)建一個文件
[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.打印一個文件中的第2列和第3列
# cat /etc/passwd | awk -F : '{print $2,$5}'
2.打印指定行指定列的某個字符
# free -m | awk 'NR==2 {print $2}'
3.統(tǒng)計一個文件的行數(shù)
# cat /etc/passwd | awk '{print NR}'
4.在awk中使用if條件判斷
++i:從1開始加,賦值在運算
i++: 從0開始加,運算在賦值
if語句:
{if(表達式){語句;語句;...}}
顯示管理員用戶姓名
# cat /etc/passwd | awk -F : '{if($3==0) {print $1 " is administrator"}}'
統(tǒng)計系統(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ù)組遍歷--用來統(tǒng)計網(wǎng)站日志,tcp連接狀態(tài)等。
++i:從1開始加,賦值在運算
i++: 從0開始加,運算在賦值
按索引遍歷:
1.先創(chuàng)建一個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是索引
實際案例
1. 統(tǒng)計/etc/passwd中各種類型shell的數(shù)量
# cat /etc/passwd | awk -F: '{shells[$NF]++} END{ for(i in shells){print i,shells[i]} }'
2.統(tǒng)計nginx日志出現(xiàn)的狀態(tài)碼
# cat access.log | awk '{stat[$9]++} END{for(i in stat){print i,stat[i]}}'
3.統(tǒng)計當前nginx日志中每個ip訪問的數(shù)量
# cat access.log | awk '{ips[$1]++} END{for(i in ips){print i,ips[i]}}'
4.統(tǒng)計某一天的nginx日志中的不同ip的訪問量
# cat access.log |grep '28/Sep/2019' | awk '{ips[$1]++} END{for(i in ips){print i,ips[i]}}'
5.統(tǒng)計nginx日志中某一天訪問最多的前10個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:排序,默認升序
-k:指定列數(shù)
-r:降序
-n:以數(shù)值來排序
6.統(tǒng)計tcp連接的狀態(tài)---下去自己查各個狀態(tài),包括什么原因造成的!
# netstat -n | awk '/^tcp/ {tcps[$NF]++} END {for(i in tcps) {print i, tcps[i]}}'
LAST_ACK 5 (正在等待處理的請求數(shù))
SYN_RECV 30
ESTABLISHED 1597 (正常數(shù)據(jù)傳輸狀態(tài))
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057 (處理完畢,等待超時結(jié)束的請求數(shù))
UV與PV統(tǒng)計
=================================================================
1.根據(jù)訪問IP統(tǒng)計UV
# cat access.log | awk '{print $1}' |sort |uniq -c | wc -l
uniq:去重
-c:每行連續(xù)出現(xiàn)的次數(shù)
2.更具訪問ip統(tǒng)計PV
# cat access.log | awk '{print $1}' |wc -l
或者是url
# cat access.log | awk '{print $7}' |wc -l
3.查詢訪問最頻繁的URL
# cat access.log | awk '{print $7}'|sort | uniq -c |sort -n -k 1 -r | more
more:以一頁一頁的形式顯示
4.查詢訪問最頻繁的IP
# cat access.log | awk '{print $1}'|sort | uniq -c |sort -n -k 1 -r | more
關(guān)于“怎么用linux的AWK創(chuàng)建文件”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“怎么用linux的AWK創(chuàng)建文件”知識都有一定的了解,大家如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。
當前標題:怎么用linux的AWK創(chuàng)建文件-創(chuàng)新互聯(lián)
轉(zhuǎn)載來于:http://jinyejixie.com/article40/coisho.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、App設(shè)計、建站公司、網(wǎng)站排名、用戶體驗、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容