雲端計算教程學習路線影片原始碼課件:linux文字處理三劍客之AWK
在雲端計算蓬勃發展的今天,與其在家閒著,不如立即開始學習,現在開始,千鋒HTML5、UI互動設計、PHP、Java+雲資料、大資料開發、VR/AR/Unity遊戲開發、Python人工智慧、Linux雲端計算、全棧軟體測試影片教程免費送!領取方式在下方留言即可,希望可以幫助你在“逆境”中成長,從容開啟新的一年。下面千鋒給大家講解一下:linux文字處理三劍客之AWK。
awk處理過程: 依次對每一行進行處理,然後輸出,與sed區別:awk讀到記憶體。
預設分隔符是空格或者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假設它的輸入是有結構的,而不是一串無規則的字元。預設它將每個輸入行作為一條記錄,而將由空格或製表符分隔的單詞作為欄位。
awk 按記錄處理:一行是一條記錄,因為awk預設以換行符分開的字串是一條記錄。(預設\n換行符:記錄分隔符)
記錄:以記錄分割符分割的字串 預設是換行\n
欄位:以欄位分割符分割的字串 預設是單個或多個“ ” tab鍵。
========================================
awk中的變數:
$0:表示整行;
NF : 統計欄位的個數
$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不加預設為空格區分!
===============================================================
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.建立兩個檔案
[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.建立一個檔案
[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:統計列的個數
[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:把一行內容分成多行
1.首先建立一個檔案
[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.統計一個檔案的行數
# 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"}}'
統計系統使用者
# cat /etc/passwd | awk -F : '{if($3>=0 && $3<1000){i++}} END{print i}'
5.在awk中使用for迴圈
# 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
陣列遍歷--用來統計網站日誌,tcp連線狀態等。
++i:從1開始加,賦值在運算
i++: 從0開始加,運算在賦值
按索引遍歷:
1.先建立一個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. 統計/etc/passwd中各種型別shell的數量
# cat /etc/passwd | awk -F: '{shells[$NF]++} END{ for(i in shells){print i,shells[i]} }'
2.統計nginx日誌出現的狀態碼
# cat access.log | awk '{stat[$9]++} END{for(i in stat){print i,stat[i]}}'
3.統計當前nginx日誌中每個ip訪問的數量
# cat access.log | awk '{ips[$1]++} END{for(i in ips){print i,ips[i]}}'
4.統計某一天的nginx日誌中的不同ip的訪問量
# cat access.log |grep '28/Sep/2019' | awk '{ips[$1]++} END{for(i in ips){print i,ips[i]}}'
5.統計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:指定列數
-r:降序
-n:以數值來排序
6.統計tcp連線的狀態---下去自己查各個狀態,包括什麼原因造成的!
# netstat -n | awk '/^tcp/ {tcps[$NF]++} END {for(i in tcps) {print i, tcps[i]}}'
LAST_ACK 5 (正在等待處理的請求數)
SYN_RECV 30
ESTABLISHED 1597 (正常資料傳輸狀態)
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057 (處理完畢,等待超時結束的請求數)
UV與PV統計
=================================================================
1.根據訪問IP統計UV
# cat access.log | awk '{print $1}' |sort |uniq -c | wc -l
uniq:去重
-c:每行連續出現的次數
2.更具訪問ip統計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
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69916964/viewspace-2679182/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 雲端計算教程學習路線影片原始碼課件:Linux效能監控工具-gtop原始碼Linux
- 雲端計算培訓教程學習路線影片原始碼課件:seafile私有網盤搭建原始碼
- 雲端計算教程學習路線影片原始碼課件:shell指令碼實現獲取圖片原始碼指令碼
- 雲端計算培訓教程學習路線影片原始碼課件:Shell變數知識梳理原始碼變數
- 雲端計算學習路線教程大綱課件:客戶端查詢客戶端
- Linux檔案處理三劍客之awkLinux
- 雲端計算學習路線教程大綱課件:Linux新手入門教程Linux
- Linux:管道命令與文字處理三劍客(grep、sed、awk)Linux
- 雲端計算學習路線教程大綱課件:LVM管理LVM
- 雲端計算學習路線教程大綱課件:FTP ServerFTPServer
- 雲端計算教程學習入門影片原始碼課件:CURL命令使用指南原始碼
- 雲端計算教程學習入門影片課件:怎樣快速掌握Linux?Linux
- 雲端計算學習路線教程大綱課件:使用自建源
- 雲端計算學習路線教程大綱課件:關於NFSNFS
- 雲端計算教程學習入門影片課件:雲端計算與人工智慧人工智慧
- 雲端計算影片教程:2020年雲端計算學習路線圖
- 雲端計算學習路線教程大綱課件:雲端計算開發程式設計條件結構程式設計
- 雲端計算學習路線教程大綱課件:網路管理基礎
- 雲端計算教程學習入門影片課件:雲端計算終端技術講解
- 雲端計算教程學習入門影片課件:怎麼組建雲端計算中心?
- 雲端計算教程學習入門影片課件:雲端計算中心怎麼選址?
- 雲端計算教程學習入門影片課件:雲端計算中IDS是什麼?
- 雲端計算教程學習入門影片課件:雲端計算中SOA是什麼?
- 雲端計算教程學習入門影片課件:雲端計算安全性有哪些?
- 雲端計算教程學習入門影片課件:雲端計算架構參考模型架構模型
- 雲端計算學習路線教程大綱課件:磁碟陣列 RAID陣列AI
- 雲端計算學習路線教程大綱課件:檔案連結
- 雲端計算學習路線教程大綱課件:關於HTTP ServerHTTPServer
- 雲端計算教程學習入門影片課件:雲端計算園區雲是什麼?
- 雲端計算教程學習入門影片課件:雲應用是什麼?
- 雲端計算學習路線圖素材課件:DevOps和雲端計算之間的關係dev
- 雲端計算教程學習入門影片課件:雲端計算開源軟體有哪些?
- 雲端計算教程學習入門影片課件:商業化雲端計算元件有哪些?元件
- 雲端計算教程學習入門影片課件:雲端計算中微服務是什麼?微服務
- 雲端計算教程學習入門影片課件:雲端計算通訊協議講解協議
- 雲端計算教程學習入門影片課件:小型雲端計算平臺怎麼搭建?
- 雲端計算教程學習入門影片課件:雲端計算管理工具有哪些?
- 雲端計算教程學習入門影片課件:Load Balance講解