前言
在Linux日常運維中,你或許知道很多很多的基礎命令,像cd,rm,mkdir,chomod,netstat等等基礎命令,但是你是否真的瞭解這些命令高級複雜但是卻高效的用法?即使你記得以前敲過,但是你現在是否能敲出來?學習的過程就是需要不斷的進行總結匯總的,我也一樣,因此我也編寫了這技巧篇的文章,幫助自己彙總,也分享給大家。
一、日誌分析篇
以Nginx的訪問日誌為例。
1、獲取訪問前5位的IP地址
# netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n5
或
# netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' |sort -rn|head -n5
以上兩個命令均可以實現找出訪問前5位的IP地址,僅僅是結果展示一個是縮進展示,一個是排版展示的區別而已。
2、找出前5個訪問次數最多的頁面或者文件
# cat www.access.log | awk '{print $8}' | sort | uniq -c | sort -nr | head -5
3、根據日誌統計網絡的流量,單位M(前提是日誌中沒有屏蔽小文件記錄日誌,如jpg,js,css等)
# cat www.access.log | awk '{sum+=$11} END {print sum/1024/1024}'
4、統計所有狀態碼數量
# cat www.access.log | awk '{++S[$10]} END {for (a in S) print a,S[a]}'
二、數據庫篇
1、使用tcpdump查看正在執行的數據庫操作
# tcpdump -i eth0 -s 0 -l -w - dst port 3306 | strings | egrep -i 'SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|CALL'
三、系統狀態查詢篇
1、查看系統的網絡流量
# sar -n 'DEV' 1 10000000|awk 'BEGIN{printf "DEVICE\tIN\t\tOUT\n"}''/eth0/ {printf $2" ";printf $5*8/1024"Kbps ";print $6*8/1024"Kbps"}'
2、查看系統佔用IO最高的進程
# yum -y install dstat
# dstat -g -r --top-io
3、找出內存使用最高的進程,並顯示內存使用率(包括used,buffer,cache,free值)
# dstat -g -m -s --top-mem
4、找出cpu佔用最大的進程
# dstat -c -y --proc-count --top-cpu
5、查看當前系統是否有IO壓力
# iostat -x 10
如果 %util 接近 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸;
如果 svctm 比較接近 await,說明I/O 幾乎沒有等待時間;
如果 await 遠大於 svctm,說明 I/O隊列太長,應用得到的響應時間變慢;
idle小於70% IO壓力就較大了,一般讀取速度有較多的wait;
6、查詢系統上每顆CPU的用戶、系統耗用率,io等待率,空閒率
# sar -u -P ALL 2 5
7、關於APR綁定與緩存清除
綁定已知機器的arp地址到文件:
# cat /proc/net/arp | awk '{print $1 " " $4}' |sort -t. -n +3 -4 > /etc/ethers
清除已知的arp緩存:
# arp -n|awk '/^[1-9]/ {print "arp -d "$1}'|sh
四、網絡連接篇
1、查詢TCP的連接狀態
netstat -nat |awk '{print $6}' |sort|uniq -c|sort -rn
netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'
netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}'
netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}'
netstat -n |awk '/^tcp/ {print $NF}' |sort|uniq -c|sort -rn
netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c
以上的命令查詢出來的效果基本上一致,只是不同的方法,羅列出來是想大家加深理解。
2、找出80端口tcp請求最高的5個IP
# netstat -anlp | grep 80 | grep tcp | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -n5
3、查找time_wait狀態較多的鏈接
# netstat -n | grep TIME_WAIT | awk '{print $5}' | sort | uniq -c | sort -rn | head -n5
五、技巧篇
1、找出指定路徑下的0字節文件並刪除
# find ./ -type f -size 0 -exec rm -rf {} \;
2、sed替換字符串
# sed -i '/Root/s/no/yes/' /etc/ssh/sshd_config
sed在這個文裡Root的一行,匹配Root一行,將no替換成yes。
3、刪除N天前的文件
# find /tmp -mtime +5 -type f -exec rm -rf {} \;
可以用於日誌定期清理,刪除N天以前的日誌
4、Linux下編輯器vi(vim)使用技巧
vi編輯器(涉及到修改,添加,查找)
插入(insert)模式
i 光標前插入
I 光標行首插入
a 光標後插入
A 光標行尾插入
o 光標所在行下插入一行,行首插入
O 光標所在行上插入一行,行首插入
G 移至最後一行行首
nG 移至第n行行首
n+ 下移n行,行首
n- 上移n行,行首
:/str/ 從當前往右移動到有str的地方
:?str? 從當前往左移動到有str的地方
:s/str1/str2/ 將找到的第一個str1替換為str2
:s/str2/str2/g 將當前行找到的所有str1替換為str2
:n1,n2s/str1/str2/g 將從n1行至n2行找到的所有的str1替換為str2
:1,.s/str1/str2/g 將從第1行至當前行的所有str1替換為str2
:.,$s/str1/str2/g 將從當前行至最後一行的所有str1替換為str2
後續
未完待遇,請繼續關注~~~