## AWK題目練習
### awk工作原理
## AWK工作原理
- 第一步:執行BEGIN{action;… }語句塊中的語句
- 第二步:從文件或標準輸入(stdin)讀取一行,然后執行pattern{action;… }語句塊,它逐行掃描文件,從第
一行到最后一行重復這個過程,直到文件全部被讀取完畢。
- 第三步:當讀至輸入流末尾時,執行END{action;…}語句塊BEGIN語句塊在awk開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通常可以寫在BEGIN語句塊中END語句塊在awk從輸入流中讀取完所有的行之后即被執行,比如打印所有行的分析結果這類信息匯總都是在END語句塊中完成,它也是一個可選語句塊pattern語句塊中的通用命令是最重要的部分,也是可選的。如果沒有提供pattern語句塊,則默認執行{ print },即打印每一個讀取到的行, awk讀取的每一行都會執行該語句塊
### awk 內置變量
ARGC 命令行參數個數
ARGV 命令行參數排列
ENVIRON 支持隊列中系統環境變量的使用
FILENAME awk瀏覽文件名
FNR 瀏覽文件的記錄數
FS 設置輸入域分隔符,等價于命令行-F選項
NF 瀏覽記錄的域個數
NR 已讀的記錄數
OFS 輸出域分隔符
ORS 輸出例句分隔符
RS 控制記錄分隔符
1. 打印出/etc/passwd中個的第一個域,并在前面追加"賬號"
```shell
cat /etc/passwd | awk -F ":" '{print "賬號"$1}'
```
2. 打印出/etc/passwd 第三個域和第四個域
```shell
cat /etc/passwd | awk -F ":" '{print $3,$4}'
```
3. 匹配/etc/passwd 第三域大于100的顯示出完整信息
```shell
cat /etc/passwd | awk -F ":" '{if($3 > 100) {print $0}}'
```
4. 打印行號小于15的,并且最后一域匹配bash的信息.
NR表示行號。NF表示最后一個域 ~ 正則匹配符號。 // 正則表達式開始和結束符號
```shell
cat /etc/passwd | awk -F ":" '{if($NR < 15 && $NF~/bash/) {print $0}}'
```
5. 打印出第三域數字之和
```SHELL
awk -F ":" 'BEGIN{sum =0} {sum = sum+$3} END {print sum}'
```
6. 請匹配passwd最后一段域bash結尾的信息,有多少條
```shell
awk -F ":" '{if( $NF~/bash/) {i++}} END {print i }'
```
7. 請同時匹配passwd文件中,帶mail和bash的關鍵字的信息
```shell
cat /etc/passwd | awk -F ":" '{if( $NF~/bash/ || $NF~/mail/) {print $0}} '
```
8. 統計/etc/fstab文件中每個文件系統類型出現的次數
/^UUID/:模式匹配以UUID開頭的行?
fs[$3]++:定義fs[]為關聯數組下標是每條記錄的第3個字段,數組的值是出現的次數
for(i in fs){print i,fs[i]}:在每條記錄都處理完之后,用for循環遍歷數組,打印下標(文件類型)和數組元素值(文件類型出現的次數)
```shell
awk '/^UUID/{fs[$3]++}END{for(i in fs){print i,fs[i]}}' /etc/fstab
```
### nginx日志分析
日志格式
`'$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"' `
**日志記錄:**27.189.231.39 - - [09/Apr/2016:17:21:23 +0800] "GET /Public/index/images/icon_pre.png HTTP/1.1" 200 44668 "http://www.test.com/Public/index/css/global.css" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36" "-"
- 統計日志最多的10個IP
```shell
awk '{arr[$1]++} END {for(i in arr) {print arr[i]}}' access.log | sort -k1 -nr | head -n10
```
- 統計日志訪問次數大于100次的IP
```shell
awk '{arr[$1]++} END{for (i in arr) {if(arr[i] > 100){print $i}}}' access.log
```
- 統計2016年4月9日內訪問最多的10個ip
```shell
awk '$4>="[09/Apr/2016:00:00:00" && $4<="[09/Apr/2016:23:59:59" {arr[i]++} END{print arr[i]}' |sort -k1 -nr|head -n10
```
- 統計訪問最多的十個頁面
```shell
awk '{a[$7]++}END{for(i in a)print a[i],i|"sort -k1 -nr|head -n10"}' access.log
```
- 統計訪問狀態為404的ip出現的次數
```shell
awk '{if($9~/404/)a[$1" "$9]++}END{for(i in a)print i,a[i]}' access.log
```
- PC
- IO模型
- Inode介紹
- Linux
- Linux基本操作命令
- Linux網絡相關命令
- Crontab計劃任務
- Shell
- Sed命令
- Awk命令
- LAMP/LNMP
- PHP
- 基本語法
- 面向對象
- 錯誤和異常處理
- 命名空間
- PHP7
- 正則表達式
- Hashtable
- 變量的內部實現
- PHP-FPM
- PHP運行原理
- swoole
- mysql
- SQL標準
- mysql三范式
- 存儲引擎
- Mysql事務
- Mysql索引
- Mysql優化
- Explain
- MySQL索引原理及慢查詢優化
- MongoDb
- 計算機網絡
- IP協議
- TCP(傳輸控制協議)
- UDP(用戶數據報協議)
- HTTP 協議
- HTTPS
- HTTP的基本優化
- Websocket協議
- 版本控制器
- Git
- Svn
- 數據結構
- 數組
- 鏈表
- 算法