[英]How do I add `watch' command to a shell script?
我有一個greps和awks的腳本,並計算具有多個http狀態代碼的ip地址。 盡管腳本是什么並不重要,因為我的目標如下:
我想在此腳本中調用`watch'命令,以便每隔幾秒鍾使用從動態apache日志收到的新數據更新顯示。
我可以按如下方式調用我的腳本:
$ watch --no-title ./bad_request.sh
但我寧願在腳本本身內部使用`watch'命令,以便從命令提示符調用腳本更清晰。
這是腳本:
#!/bin/bash
#identify repeated offenders through 401 and 403 status codes
for ip in `awk '{print $1}' /var/log/apache2/* | sort -u`; do echo -n "$ip "; awk '{print $1 " " $9}' /var/log/apache2/* | egrep "( 401| 403)"| grep -c $ip; done | sort -k2 -r
現在,我已經嘗試在腳本中插入“watch -d --no-title”,就在for循環之前,但它出錯了。 我認為這是因為它只是處理直到它到達第一個命令的末尾。 我已經嘗試在整個腳本周圍添加反引號和$()。 我也嘗試使腳本的大部分成為bash函數,並在函數上調用watch。 沒有骰子。
有任何想法嗎?
順便說一下,我也對腳本的改進持開放態度 - 我確實意識到它有點多余/低效。 當然,這可能應該保留給不同的Stack Overflow問題。
謝謝,
凱文
編輯:還有一件事,我可以while true; do <bulk of script>; sleep 1; clear;
打電話while true; do <bulk of script>; sleep 1; clear;
while true; do <bulk of script>; sleep 1; clear;
但我討厭那個。 它有效,但屏幕閃爍,這不是正確的方法。
編輯2:另一個令人討厭的黑客工作,就是簡單地創建兩個腳本。 第一個是:
watch --no-title ./bad_request
然后只需調用該腳本。 這很好,但必須有一個更好的方法。
編輯3(對不起......):我把'-d標志從'看'上取下來了。 這對我的劇本來說沒有必要。
注意unix哲學:
A program should do one and only one thing and do it well.
適用於您的案例:
A script should do one and only one thing and do it well.
你的“討厭的黑客”實際上是朝着正確方向邁出的一步。
你永遠不會知道是否有一天你需要在另一個劇本上“觀看 - 無標題”。 那時如果你遵循unix哲學,你已經有了一個腳本來做到這一點。
你已經看到一個復雜的嘗試讓一個腳本一次做太多事情 - 引用地獄。
把事情簡單化。
正確的用法是:
watch -d --no-title "/bin/bash for ip in `awk '{print $1}' /var/log/apache2/* | sort -u`; do echo -n "$ip "; awk '{print $1 " " $9}' /var/log/apache2/* | egrep '( 401| 403)'| grep -c $ip; done | sort -k2 -r"
tail -f <file>
幫助嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.