我剛剛寫了一個bash
腳本,它按我想要的方式工作。這就是腳本:
#!/usr/bin/env bash
DY=`date +%Y%m%d`
gunzip -c /var/log/cisco/cisco.log-$DY.gz > file.log
sleep 3
cat file.log | grep "Virtual device ath0 asks to queue packet" > file2.log
awk '{print $4}' file2.log > IP.log
sort IP.log | uniq > devices.log
wc -l devices.log
rm file.log file2.log IP.log devices.log
但是,因為我是新手,所以bash
我會問是否有更好的方法來執行此類腳本(仍在bash
環境中)。任何解釋對於提高我的學習都非常有用。
答案1
- 使用註釋的標題來解釋腳本的作用及其用法
- 使用 POSIX shell (
/bin/sh
) 實現可移植性,bash
簡單腳本通常不需要 - 使用變數而不是硬編碼字串
- 考慮使用
$(some_command)
語法而不是反引號 - 不要
cat
進入grep
,而是使用grep <pattern> <file>
- 為什麼要睡覺?
- 如果不需要文件,請刪除臨時變量,改用管道
sort | uniq
可以替換為sort -u
- 如果必須使用臨時文件,請考慮正確清理。
答案2
這是您的腳本的一種變體,作為“一行”:
gunzip -c /var/log/cisco/cisco.log-$(date +%Y%m%d).gz | \
grep "Virtual device ath0 asks to queue packet" | \
awk '{print $4}' | sort | uniq | wc -l
它避免創建任何中間臨時文件,這可能快一點。但是,如果您需要或使用這些中間文件,那麼單行是一個更糟糕的方向。
透過閱讀足夠多的編寫良好的 shell 腳本,我學到的一件事是「grep | awk」序列通常可以組合起來。對於您的腳本,請注意 grep 命令已被替換:
gunzip -c /var/log/cisco/cisco.log-$(date +%Y%m%d).gz | \
awk '/Virtual device ath0 asks to queue packet/ { print $4 }' | \
sort | uniq | wc -l