So Tired !_! 逆水行舟, 不进则退!

29Mar/17

linux awk命令详解

Posted by Nick Xu

awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来格式化文本信息
awk处理过程: 依次对每一行进行处理,然后输出
awk命令形式:
awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’ file
 [-F|-f|-v]   大参数,-F指定分隔符,-f调用脚本,-v定义变量 var=value
'  '          引用代码块
BEGIN   初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符
//           匹配代码块,可以是字符串或正则表达式
{}           命令代码块,包含一条或多条命令
;          多条命令使用分号分隔
END      结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息
特殊要点:
$0           表示整个当前行
$1           每行第一个字段
NF          字段数量变量
NR          每行的记录号,多文件记录递增
FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始
\t            制表符
\n           换行符
FS          BEGIN时定义分隔符
RS       输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~            匹配,与==相比不是精确比较
!~           不匹配,不精确比较
==         等于,必须全部相等,精确比较
!=           不等于,精确比较
&&      逻辑与
||             逻辑或
+            匹配时表示1个或1个以上
/[0-9][0-9]+/   两个或两个以上数字
/[0-9][0-9]*/    一个或一个以上数字
FILENAME 文件名
OFS      输出字段分隔符, 默认也是空格,可以改为制表符等
ORS        输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]'   定义三个分隔符
print & $0
print 是awk打印指定内容的主要命令
awk '{print}'  /etc/passwd   ==   awk '{print $0}'  /etc/passwd
awk '{print " "}' /etc/passwd                                           //不输出passwd的内容,而是输出相同个数的空行,进一步解释了awk是一行一行处理文本
awk '{print "a"}'   /etc/passwd                                        //输出相同个数的a行,一行只有一个a字母
awk -F":" '{print $1}'  /etc/passwd
awk -F: '{print $1; print $2}'   /etc/passwd                   //将每一行的前二个字段,分行输出,进一步理解一行一行处理文本
awk  -F: '{print $1,$3,$6}' OFS="\t" /etc/passwd        //输出字段1,3,6,以制表符作为分隔符
-f指定脚本文件
awk -f script.awk  file
BEGIN{
FS=":"
}
{print $1}               //效果与awk -F":" '{print $1}'相同,只是分隔符使用FS在代码自身中指定
awk 'BEGIN{X=0} /^$/{ X+=1 } END{print "I find",X,"blank lines."}' test
I find 4 blank lines.
 ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is",sum}'                    //计算文件大小
total size is 17487
-F指定分隔符
$1 指指定分隔符后,第一个字段,$3第三个字段, \t是制表符
一个或多个连续的空格或制表符看做一个定界符,即多个空格看做一个空格
awk -F":" '{print $1}'  /etc/passwd
awk -F":" '{print $1 $3}'  /etc/passwd                       //$1与$3相连输出,不分隔
awk -F":" '{print $1,$3}'  /etc/passwd                       //多了一个逗号,$1与$3使用空格分隔
awk -F":" '{print $1 " " $3}'  /etc/passwd                  //$1与$3之间手动添加空格分隔
awk -F":" '{print "Username:" $1 "\t\t Uid:" $3 }' /etc/passwd       //自定义输出
awk -F: '{print NF}' /etc/passwd                                //显示每行有多少字段
awk -F: '{print $NF}' /etc/passwd                              //将每行第NF个字段的值打印出来
 awk -F: 'NF==4 {print }' /etc/passwd                       //显示只有4个字段的行
awk -F: 'NF>2{print $0}' /etc/passwd                       //显示每行字段数量大于2的行
awk '{print NR,$0}' /etc/passwd                                 //输出每行的行号
awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd      //依次打印行号,字段数,最后字段值,制表符,每行内容
awk -F: 'NR==5{print}'  /etc/passwd                         //显示第5行
awk -F: 'NR==5 || NR==6{print}'  /etc/passwd       //显示第5行和第6行
route -n|awk 'NR!=1{print}'                                       //不显示第一行
//匹配代码块
//纯字符匹配   !//纯字符不匹配   ~//字段值匹配    !~//字段值不匹配   ~/a1|a2/字段值匹配a1或a2   
awk '/mysql/' /etc/passwd
awk '/mysql/{print }' /etc/passwd
awk '/mysql/{print $0}' /etc/passwd                   //三条指令结果一样
awk '!/mysql/{print $0}' /etc/passwd                  //输出不匹配mysql的行
awk '/mysql|mail/{print}' /etc/passwd
awk '!/mysql|mail/{print}' /etc/passwd
awk -F: '/mail/,/mysql/{print}' /etc/passwd         //区间匹配
awk '/[2][7][7]*/{print $0}' /etc/passwd               //匹配包含27为数字开头的行,如27,277,2777...
awk -F: '$1~/mail/{print $1}' /etc/passwd           //$1匹配指定内容才显示
awk -F: '{if($1~/mail/) print $1}' /etc/passwd     //与上面相同
awk -F: '$1!~/mail/{print $1}' /etc/passwd          //不匹配
awk -F: '$1!~/mail|mysql/{print $1}' /etc/passwd
IF语句
必须用在{}中,且比较内容用()扩起来
awk -F: '{if($1~/mail/) print $1}' /etc/passwd                                       //简写
awk -F: '{if($1~/mail/) {print $1}}'  /etc/passwd                                   //全写
awk -F: '{if($1~/mail/) {print $1} else {print $2}}' /etc/passwd            //if...else...
条件表达式
==   !=   >   >=  
awk -F":" '$1=="mysql"{print $3}' /etc/passwd
awk -F":" '{if($1=="mysql") print $3}' /etc/passwd          //与上面相同
awk -F":" '$1!="mysql"{print $3}' /etc/passwd                 //不等于
awk -F":" '$3>1000{print $3}' /etc/passwd                      //大于
awk -F":" '$3>=100{print $3}' /etc/passwd                     //大于等于
awk -F":" '$3<1{print $3}' /etc/passwd                            //小于
awk -F":" '$3<=1{print $3}' /etc/passwd                         //小于等于
逻辑运算符
&& || 
awk -F: '$1~/mail/ && $3>8 {print }' /etc/passwd         //逻辑与,$1匹配mail,并且$3>8
awk -F: '{if($1~/mail/ && $3>8) print }' /etc/passwd
awk -F: '$1~/mail/ || $3>1000 {print }' /etc/passwd       //逻辑或
awk -F: '{if($1~/mail/ || $3>1000) print }' /etc/passwd
数值运算
awk -F: '$3 > 100' /etc/passwd
awk -F: '$3 > 100 || $3 < 5' /etc/passwd
awk -F: '$3+$4 > 200' /etc/passwd
awk -F: '/mysql|mail/{print $3+10}' /etc/passwd                    //第三个字段加10打印
awk -F: '/mysql/{print $3-$4}' /etc/passwd                             //减法
awk -F: '/mysql/{print $3*$4}' /etc/passwd                             //求乘积
awk '/MemFree/{print $2/1024}' /proc/meminfo                  //除法
awk '/MemFree/{print int($2/1024)}' /proc/meminfo           //取整
输出分隔符OFS
awk '$6 ~ /FIN/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
awk '$6 ~ /WAIT/ || NR==1 {print NR,$4,$5,$6}' OFS="\t" netstat.txt
//输出字段6匹配WAIT的行,其中输出每行行号,字段4,5,6,并使用制表符分割字段
输出处理结果到文件
①在命令代码块中直接输出    route -n|awk 'NR!=1{print > "./fs"}'
②使用重定向进行输出           route -n|awk 'NR!=1{print}'  > ./fs
格式化输出
netstat -anp|awk '{printf "%-8s %-8s %-10s\n",$1,$2,$3}'
printf表示格式输出
%格式化输出分隔符
-8长度为8个字符
s表示字符串类型
打印每行前三个字段,指定第一个字段输出字符串类型(长度为8),第二个字段输出字符串类型(长度为8),
第三个字段输出字符串类型(长度为10)
netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-10s %-10s %-10s \n",$1,$2,$3}'
netstat -anp|awk '$6=="LISTEN" || NR==1 {printf "%-3s %-10s %-10s %-10s \n",NR,$1,$2,$3}'
IF语句
awk -F: '{if($3>100) print "large"; else print "small"}' /etc/passwd
small
small
small
large
small
small
awk -F: 'BEGIN{A=0;B=0} {if($3>100) {A++; print "large"} else {B++; print "small"}} END{print A,"\t",B}' /etc/passwd
                                                                                                                  //ID大于100,A加1,否则B加1
awk -F: '{if($3<100) next; else print}' /etc/passwd                         //小于100跳过,否则显示
awk -F: 'BEGIN{i=1} {if(i<NF) print NR,NF,i++ }' /etc/passwd
awk -F: 'BEGIN{i=1} {if(i<NF) {print NR,NF} i++ }' /etc/passwd
另一种形式
awk -F: '{print ($3>100 ? "yes":"no")}'  /etc/passwd
awk -F: '{print ($3>100 ? $3":\tyes":$3":\tno")}'  /etc/passwd
while语句
awk -F: 'BEGIN{i=1} {while(i<NF) print NF,$i,i++}' /etc/passwd
7 root 1
7 x 2
7 0 3
7 0 4
7 root 5
7 /root 6
数组
netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) print i,"\t",a[i]}'
netstat -anp|awk 'NR!=1{a[$6]++} END{for (i in a) printf "%-20s %-10s %-5s \n", i,"\t",a[i]}'
9523                               1
9929                               1
LISTEN                            6
7903                               1
3038/cupsd                   1
7913                               1
10837                             1
9833                               1
 
应用1
awk -F: '{print NF}' helloworld.sh                                                       //输出文件每行有多少字段
awk -F: '{print $1,$2,$3,$4,$5}' helloworld.sh                                 //输出前5个字段
awk -F: '{print $1,$2,$3,$4,$5}' OFS='\t' helloworld.sh                 //输出前5个字段并使用制表符分隔输出
awk -F: '{print NR,$1,$2,$3,$4,$5}' OFS='\t' helloworld.sh           //制表符分隔输出前5个字段,并打印行号
应用2
awk -F'[:#]' '{print NF}'  helloworld.sh                                                  //指定多个分隔符: #,输出每行多少字段
awk -F'[:#]' '{print $1,$2,$3,$4,$5,$6,$7}' OFS='\t' helloworld.sh   //制表符分隔输出多字段
应用3
awk -F'[:#/]' '{print NF}' helloworld.sh                                               //指定三个分隔符,并输出每行字段数
awk -F'[:#/]' '{print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12}' helloworld.sh     //制表符分隔输出多字段
应用4
计算/home目录下,普通文件的大小,使用KB作为单位
ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",sum/1024,"KB"}'
ls -l|awk 'BEGIN{sum=0} !/^d/{sum+=$5} END{print "total size is:",int(sum/1024),"KB"}'         //int是取整的意思
应用5
统计netstat -anp 状态为LISTEN和CONNECT的连接数量分别是多少
netstat -anp|awk '$6~/LISTEN|CONNECTED/{sum[$6]++} END{for (i in sum) printf "%-10s %-6s %-3s \n", i," ",sum[i]}'
应用6
统计/home目录下不同用户的普通文件的总数是多少?
ls -l|awk 'NR!=1 && !/^d/{sum[$3]++} END{for (i in sum) printf "%-6s %-5s %-3s \n",i," ",sum[i]}'
mysql        199
root           374
统计/home目录下不同用户的普通文件的大小总size是多少?
ls -l|awk 'NR!=1 && !/^d/{sum[$3]+=$5} END{for (i in sum) printf "%-6s %-5s %-3s %-2s \n",i," ",sum[i]/1024/1024,"MB"}'
应用7
输出成绩表
awk 'BEGIN{math=0;eng=0;com=0;printf "Lineno.   Name    No.    Math   English   Computer    Total\n";printf "------------------------------------------------------------\n"}{math+=$3; eng+=$4; com+=$5;printf "%-8s %-7s %-7s %-7s %-9s %-10s %-7s \n",NR,$1,$2,$3,$4,$5,$3+$4+$5} END{printf "------------------------------------------------------------\n";printf "%-24s %-7s %-9s %-20s \n","Total:",math,eng,com;printf "%-24s %-7s %-9s %-20s \n","Avg:",math/NR,eng/NR,com/NR}' test0
[root@localhost home]# cat test0
Marry   2143 78 84 77
Jack    2321 66 78 45
Tom     2122 48 77 71
Mike    2537 87 97 95
Bob     2415 40 57 62

awk手册
http://www.chinaunix.net/old_jh/7/16985.html
Tagged as: , Comments Off
16Mar/17

Prusa i3 自動調平—改用 BLTouch 探針接觸感應式

Posted by Nick Xu

转自:http://www.kenming.idv.tw/prusa-i3-auto-bed-leveling_using-bltouch

我的 Prusa i3 第一個版本的自動調平,是使用電容電感近接開關,優點是便宜也容易安裝;缺點是只能探測金屬材質。可參考:Prusa i3 自動調平設定—硬體與電路部分

我的熱床是 MK3 鋁材質,原來使用上其實是可以配合。但 MK3 相當不平,即使採用了自動調平偵測還是有限,尤其是列印大面積的列印件時,兩側常無法黏住。

徵詢 Reprap.Taipei FB 社團的諸多高手所綜合的建議,在 MK3 熱床上再鋪上一片 3mm 以上的玻璃,會平坦很多。所以我從對岸淘了兩片從秦皇島店家購買的兩片鋼化高硼矽磨砂耐熱玻璃,據說可以黏住 PLA 材質的列印,而不需要塗上膠水或貼上美紋紙。

加上玻璃後,連帶電容電感近接開關就無法使用,因為無法偵測非金屬材質。我曾在玻璃後邊貼上鋁箔膠帶測試時還能偵測到,但打印幾次卻發現很不穩定,總有某些點會突然失靈,太過不穩定。

爬文作了一堆功課,發現到有種探針式的接觸感測近接開關,就沒有非金屬就無法感測的問題了。其中這一款 — BLTouch,我看從 Youtube 視頻上看到許多先進玩家的使用分享,效果挺不錯的樣子。

不過原廠價格可不便宜,且從 Amazon 還要多擔負一筆航空運費,並不划算。還是仍從對岸淘寶買的這支號稱是復刻版本的 TLTouch (BLTouch 克隆版),含順豐快遞到家共 RMB 159 (約台幣七百多元),還可以接受。

先瞧下我錄製下來的視頻,關於 BLTouch 在執行歸零與自動底床調平 (G28/G29)時的情形。

Prusa i3 with auto bed leveling using TLTouch (BLTouch Clone)

2:01 / 2:38

<div class="player-unavailable"><h1 class="message">出现错误。</h1><div class="submessage"><a href="http://www.youtube.com/watch?v=QHDz6-kx5aE" target="_blank">请尝试在 www.youtube.com 上观看此视频</a>,或者在浏览器中启用 JavaScript(如果已停用)。</div></div>

雖然是復刻版,但包裝與內附的零件與原廠是一樣的 (還附了一張原廠的原文說明紙),還裝在一個透明盒收納。

其實這些零件多是小螺絲與杜邦延長端子之類的,反正就是要自行再拉延長線接到 Ramps 1.4 的 5V servo 腳位,以及限位開關腳位的。

要如何設計一個 BLTouch 的 Holder 並盡量靠近到熱端 (Hotend)處,這類 3D繪圖設計問題,對我永遠都是挑戰。花了有大半天時間,趁此次改使用 Fusion 360 3D 繪圖,因為 123D Design 據說不再釋出新版本 (且實在不太好用)。

哇喔! 原來比較專業性質的 3D繪圖功能是這麼強大啊,早應該要轉用這套免費提供給教師/學生,以及年收入10萬美金以下的商業人士 (真是佛心來著)。大約花個半天時間熟悉下使用介面就可以上手了;然後設計了三次版本演進的 BLTouch Holder。

打印了幾次樣本,總算確定了高度與接合距離,印出來的模樣。

這是套進去後的樣子。因為螺絲鎖住的高度剛好差點頂住 X軸鋁合金安裝座 (Mount),所以我還用電烙鐵頂住螺絲讓其陷進熱熔後的列印座內,下一個版本應該要把螺絲的高度給考慮進來的,目前這樣先能用就好。

設計這 Holder 比較大的挑戰就是 BLTouch 的高度相對於噴嘴高度的問題,主要就是當探針伸出來 (pull)時要比噴嘴高,但縮回去 (push)時要比噴嘴低,原廠建議探針出口處距離噴嘴高度約 8mm 距離左右。

嗯嗯,Holder 確實可以套用後,再來就是連接線路,然後開始 Marlin 設定。

上文有提到要用杜邦延長端子連接延長線,主要就是限位開關2條 (白-觸發訊號/黑-接地),servo 電源輸入腳位3條 (橘-觸發訊號/紅-+5V/棕-接地),說明紙都有提的,顏色確實接正確連到 Ramps 1.4 主板上即可。

大概就是注意下,servo 電源輸入腳位要能供應 +5V 的電壓,就在位於 servo 前面的腳位上要用 Jumper 短路前兩根腳,這在 Ramps 1.4 的規格都有提的。

線路接完後再來就是 marlin 的設定。本來以為很簡單,結果耗費整整一天的時間 try-error,原來竟然是這克隆版與原版的電位剛好相反,限位開關的訊號觸發 (inverting)要設為 true,且不能直接開啟 1.1.0 RC8 內有個預設的 #define BLTouch,因為並不相容。

為何要與原版的相反?這反而克隆版廠商的好意,為了修正原廠因為觸發訊號時只有 5ms 脈衝,這太小很容易就會被板子上的電容給當成雜訊過濾掉,所以就反過來讓其設計為反相訊號。原廠與克隆版廠商都準備下一個版本改為 10ms 脈衝訊號,對岸我買的那家,技術客服還特別因為覺得讓我花太多時間,所以承諾下一個版本免費送給我,哈,真是不錯,當然屆時幫他們簡單開箱介紹下。

這裡就把主要與 BLTouch 相關的 marlin 設定給列出來參考 (configuration.h),其它有關自動調平與前述使用電容電感式的設定是一樣的。

#define Z_MIN_ENDSTOP_INVERTING true // set to true to invert the logic of the endstop.

#define Z_MIN_PROBE_ENDSTOP_INVERTING false // set to true to invert the logic of the endstop.

#define Z_ENDSTOP_SERVO_NR 0

#define Z_SERVO_ANGLES {10,90} // Z Servo Deploy and Stow angles

#define PROBE_DOUBLE_TOUCH

#define NUM_SERVOS 1

好啦,寫入 EPROM、Z軸高度校正等,都是與前一篇設定文一樣的方式,就是要注意下噴嘴當接近Z軸零點時,已收起來的探針不要碰觸到表面,若有就是要回頭調整 BLTouch 的高度。

設定正確後重新啟動 Marlin,此時 BLTouch 會自我測試伸縮探針,並顯示紅色燈號 (如果是閃爍的紅色燈號那代表有問題)。

新裝上磨砂玻璃,準備不塗上膠水與貼上美紋紙,只有底床加熱 (PLA 約為60度左右)。順便瞧下帶顏色的馬尾夾,從大創百貨買回來的,比起純黑色好看太多了。

執行 G28 歸零 (Homing)/G29 自動探測各點距離,然後開始打印從 thingiverse 下載底床調平校正模型,打印出來成果相當令人滿意。

試著打印小貓咪吊飾模型,直接就是打印在玻璃上,沒有塗上膠水與黏貼美紋紙,第一層仍可以牢靠黏著。

當晚我就給它整夜打印 68%縮小原比例的穿山甲,整整要花上快9個小時,但效果真的相當好,關節都不會黏住,自動調平校正後第一層平坦時就會顯現這樣的威力。

結論這 BLTouch 的克隆版在自動調平功能上頗為滿意,無怪乎國外的許多玩家對其還蠻

推薦的。

不過這物件真有些貴,其實這可以 DIY,只要有光學限位開關或霍爾感應器,加上小磁鐵

與彈簧、探針(用鐵釘或螺絲就可),成本並不高,但當然不容易能像 BLTouch 這般小巧

精緻。

Crash Probe with optical switch

<div class="player-unavailable"><h1 class="message">出现错误。</h1><div class="submessage"><a href="http://www.youtube.com/watch?v=hqBF5s-aBCQ" target="_blank">请尝试在 www.youtube.com 上观看此视频</a>,或者在浏览器中启用 JavaScript(如果已停用)。</div></div>

原理比想像的簡單,如果使用現成的光學限位開關 (機械限位應該也可以),就只是想辦法在歸零的時候讓原來黏在磁鐵的探針 (可以用釘子或迴紋針就可)落下比噴嘴還低的位置。(影片是利用穿過小彈簧的水平桿觸及左側X軸)

然後在 G28/G29 歸零/自動偵測後,噴嘴會降到Z軸0點位置,此時探針會往下壓而被頂上來,自然就會磁鐵黏回去而比噴嘴位置高了。

Thingiverse 的模型檔與基本說明:http://www.thingiverse.com/thing:1714315

當然也可以直接使用霍爾傳感器 (Hall sensor)直接取代光學限位開關,實作上會更簡單。即使不弄成自動調平偵測,當成Z軸限位開關也很不錯的方式。

16Mar/17

ngxtop:在命令行实时监控 Nginx 的神器

Posted by Nick Xu

Nginx网站服务器在生产环境中运行的时候需要进行实时监控。实际上,诸如Nagios, Zabbix, Munin 的网络监控软件是支持 Nginx 监控的。

如果你不需要以上软件提供的综合性报告或者长期数据统计功能,只是需要一种快速简便的办法去监控 Nginx 服务器的请求的话,我建议你采用一个叫 ngxtop 的命令行工具。

你马上就会发现 ngxtop 从界面和名称都借鉴了著名的top命令。ngxtop 是通过分析 Nginx 或者其他的日志文件,使用类似 top 命令的界面实时展示出来的。你可以说你知道的其他高端监控工具,但是在简洁这方面 ngxtop 无疑是最好的。简单就意味着不可替代。

本指南中,我将介绍如何使用 ngxtop 实时监控 Nginx 网站服务器。

Linux 上安装 ngxtop

首先在 Linux 系统中安装依赖库pip(LCTT译注:ngxtop是用python编写的)。

然后使用如下命令安装 ngxtop。

  1. $ sudo pip install ngxtop

ngxtop 使用

基本使用方法如下:

  1. ngxtop [options]
  2. ngxtop [options] (print|top|avg|sum) <var>
  3. ngxtop info

这里是一些通用选项。

  • -l : 指定日志文件的完整路径 (Nginx 或 Apache2)
  • -f : 日志格式
  • --no-follow: 处理当前已经写入的日志文件,而不是实时处理新添加到日志文件的日志
  • -t : 更新频率
  • -n : 显示行号
  • -o : 排序规则(默认是访问计数)
  • -a ..., --a ...: 添加表达式(一般是聚合表达式如: sum, avg, min, max 等)到输出中。
  • -v: 输出详细信息
  • -i : 只处理符合规则的记录

以下是一些内置变量,他们的含义不言自明。

  • bodybytessend
  • http_referer
  • httpuseragent
  • remote_addr
  • remote_user
  • request
  • status
  • time_local

使用 ngxtop 监控 Nginx

ngxtop 默认会从其配置文件 (/etc/nginx/nginx.conf) 中查找 Nginx 日志的地址。所以,监控 Nginx ,运行以下命令即可:

  1. $ ngxtop

这将会列出10个 Nginx 服务,按请求数量排序。

显示前20个最频繁的请求:

  1. $ ngxtop -n 20

获取Nginx基本信息:

  1. $ ngxtop info

你可以自定义显示的变量,简单列出需要显示的变量。使用 "print" 命令显示自定义请求。

  1. $ ngxtop print request http_user_agent remote_addr

显示请求最多的客户端IP地址

  1. $ ngxtop top remote_addr

显示状态码是404的请求

  1. $ ngxtop -i 'status == 404' print request status

除了Nginx,ngtop 还可以处理其他的日志文件,比如 Apache 的访问文件。使用以下命令监控 Apache 服务器:

  1. $ tail -f /var/log/apache2/access.log | ngxtop -f common
Tagged as: , , Comments Off
   
site
site