AWK--基本使用方法

導學

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章