我刚刚写了一个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