導學
grep和egrep:文本過濾的
sed:流編輯器,實現編輯的
awk:文本報告生成器,實現格式化文本輸出
AWK介紹
-
AWK是一種優良的文本處理工具,Linux及Unix環境中現有的功能最強大的數據處理引擎之一。這種編程及數據操作語言的最大功能取決於一個人所擁有的知識。
-
awk命名:Alfred Aho Peter 、Weinberger和brian kernighan三個人的姓的縮寫。
-
awk---->gawk 即: gun awk
-
在linux上常用的是gawk,awk是gawk的鏈接文件
-
man gawk----》pattern scanning and processing language 模式掃描和處理語言。
-
pattern [ˈpætn] 模式 ; process [ˈprəʊses] 處理
-
任何awk語句都是由模式和動作組成,一個awk腳本可以有多個語句。模式決定動作語句的觸發條件和觸發時間。
-
模式:
正則表達式 : /root/ 匹配含有root的行 /*.root/
關係表達式: < > && || + *
匹配表達式: ~ !~ -
動作:
變量 命令 內置函數 流控制語句
它的語法結構如下:
awk [options] ‘BEGIN{ print “start” } ‘pattern{ commands }’ END{ print “end” }’ file
其中:BEGIN END是AWK的關鍵字部,因此必須大寫;這兩個部分開始塊和結束塊是可選的
- 特殊模塊:
BEGIN語句設置計數和打印頭部信息,在任何動作之前進行
END語句輸出統計結果,在完成動作之後執行
工作原理:
通過上面我們可以知道;AWK它工作通過三個步驟
-
讀:從文件、管道或標準輸入中讀入一行然後把它存放到內存中
-
執行:對每一行數據,根據AWK命令按順序執行。默認情況是處理每一行數據,也可以指定模式
-
重複:一直重複上述兩個過程直到文件結束
-
AWK支持兩種不同類型的變量:內建變量,自定義變量
awk內置變量(預定義變量)
$n 當前記錄的第n個字段,比如: $1表示第一個字段,$2表示第二個字段
$0 這個變量包含執行過程中當前行的文本內容
FILENAME 當前輸入文件的名
FS 字段分隔符(默認是空格)
NF 表示字段數,在執行過程中對應於當前的字段數,NF:列的個數
FNR 各文件分別計數的行號
NR 表示記錄數,在執行過程中對應於當前的行號
OFS 輸出字段分隔符(默認值是一個空格)
ORS 輸出記錄分隔符(默認值是一個換行符)
RS 記錄分隔符(默認是一個換行符)
實例演示
- 常用的命令選項:
-F fs指定分隔符
-v 賦值一個用戶自定義變量
-f 指定腳本文件,從腳本中讀取awk命令
(1)分隔符的使用
用法:-Ffs 其中fs是指定輸入分隔符,fs可以是字符串或正則表達式;分隔符默認是空格
常見寫法:-F: -F, -F[Aa]
例1:
[root@localhost ~]# echo AA BB CC DD
AA BB CC DD
[root@localhost ~]# echo AA BB CC DD |awk '{print $2}'
BB
[root@localhost ~]# echo AA BB CC DD |awk -F " " '{print $2}' #以空格
BB
[root@localhost ~]# echo "aa|bb|cc|dd"
[root@localhost ~]# echo "aa|bb|cc|dd" | awk -F "|" '{print $3}' #以 “|”
cc
[root@localhost ~]#
[root@localhost ~]# echo "aa,bb,cc,dd"
aa,bb,cc,dd
[root@localhost ~]# echo "aa,bb,cc,dd"|awk -F "," '{print $4}' #以“,號結尾
dd
[root@localhost ~]#
[root@localhost ~]# echo "12AxAbADXaAD520"|awk -F "aA" '{print $2}' # 以“aA"爲分隔符
D520
[root@localhost ~]#
- 例2:指定多個分隔符
[root@localhost ~]# echo "12AxAbADXaAD520"|awk -F "aA" '{print $2}'
D520
[root@localhost ~]#
- 例3:使用FS指定分隔符
[root@localhost ~]# echo "12AxAbADXaAD520"|awk 'BEGIN {FS="aA"} {print $2}'
D520
[root@localhost ~]#
- 例4:過濾出本系統的IP地址
[root@localhost ~]# ifconfig ens33 |grep netmask
inet 192.168.170.16 netmask 255.255.255.0 broadcast 192.168.170.255
[root@localhost ~]# ifconfig ens33 |grep netmask|awk '{print $2}'
192.168.170.16
[root@localhost ~]#
(2)關係運算符的使用
[root@localhost ~]# echo "one two three four" |awk '{print $NF}'
four
[root@localhost ~]# echo "one two three four" |awk '{print $(NF-2)}'
two
[root@localhost ~]# echo "one two three four" |awk '{print $(NF/2-1)}'
one
[root@localhost ~]#
-例2:打印出passwd文件中用戶UID小於10的用戶名和它登錄使用的shell
參數: $NF 最後一列
[root@localhost ~]# awk -F: '$3<10{print $1 $NF}' /etc/passwd
root/bin/bash
bin/sbin/nologin
daemon/sbin/nologin
adm/sbin/nologin
lp/sbin/nologin
sync/bin/sync
shutdown/sbin/shutdown
halt/sbin/halt
mail/sbin/nologin
[root@localhost ~]#
- 例2:打印出系統中UID大於1000且登錄shell是/bin/bash的用戶
[root@localhost ~]# awk -F: '$3>=1000 && $NF=="/bin/bash" {print $1"\t" $NF}' /etc/passwdXF /bin/bash
[root@localhost ~]#
注:awk 最外面使用了單引號’’ ,裏面都使用雙引號“”
(3)在腳本中的一些應用
例:統計當前內存的使用率
[root@localhost ~]#
[root@localhost ~]# cat user_cache.sh
#!/bin/bash
echo "當前系統內存使用百分比爲:"
USEFREE=`free -m | grep -i mem | awk '{print $3/$2*100"%"}'`
echo -e "內存使用百分比: \e[31m${USEFREE}\e[0m"
[root@localhost ~]# bash user_cache.sh
awk高級應用
- 命令格式:
- awk [-F | -f | -v ] ‘BEGIN {} / / {command1;command2} END {}’file
-F 指定分隔符
-f 調用腳本
-v 定義變量
‘{}’ 引用代碼塊
{…} 命令代碼塊,包含一條或多條命令
BEGIN 初始化代碼塊
/ str / 匹配代碼塊,可以是字符串或正則表達式
{print A;print B} 多條命令使用分號分隔
END 結尾代碼塊
在awk中,pattern有以下幾種:
1) empty空模式,這個也是我們常用的
2) /regular expression/ 僅處理能夠被這個模式匹配到的行
例:打印以root開頭的行
[root@localhost ~]# awk -F: '/^root/{print $0}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]#
例1:輸出行號大於等於3且行號小於等於6的行
[root@localhost ~]# awk -F: '(NR>=3 && NR<=6) {print NR,$0}' /etc/passwd
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
[root@localhost ~]#
內置變量的特殊用法:
$0 表示整個當前行
NF 字段數量 NF(Number 數量 ; field 字段)
NR 每行的記錄號,多文件記錄遞增 Record [ˈrekɔ:d]
\t 製表符
\n 換行符
~ 匹配
!~ 不匹配
-F’[:#/]+’ 定義三個分隔符
實戰腳本
- 檢查服務器是否受到DDOS攻擊腳本
思路:通過:netstat 查看網絡連接數。如果一個IP地址對服務器建立很多連接數(比如一分鐘產生了100個連接),就認爲發生了DDOS
搭建環境:
[root@localhost ~]# yum install httpd -y #安裝apache
[root@localhost ~]# systemctl start httpd #啓動服務
[root@localhost ~]# echo "wyh> /var/www/html/index.html #創建apache默認網站首頁
[root@localhost ~]# vim ddos-test.sh #寫入以下內容
#!/bin/bash
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
註釋:
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
截取外網IP和端口 截取外網的IP以:爲分隔符 |排序 | 排除相同的記錄 | 排序並統計
- 測試,模擬DDOS
ab命令:做壓力測試的工具和性能的監控工具
語法: ab -n 要產生的鏈接數總和 -c 同時打開的客戶端數量 http://鏈接
安裝ab命令:
[root@localhost ~]#rpm -qf `which ab ` #這個安裝apache時,會自動安裝上
httpd-tools-2.2.15-15.el6.x86_64
模擬DDOS: 啓動10個客戶端對網站首頁發起1000次訪問
[root@localhost ~]# ab -n 1000 -c 10 http://192.168.1.63/index.html
互動: 如果你要對方發生DDOS攻擊,你會攻擊什麼樣的頁面?
訪問一個頁面比較大,頁面越大,消耗服務器帶寬就越大,攻擊效果越明顯
[root@localhost ~]# ./ddos-test.sh #檢查DDOS
1 Address
1 servers)
2 192.168.1.6
1003 192.168.1.63