我有一个针对上述问题的命令。有人能解释一下下面的命令吗?
DATE=`date +%m%d%Y-%H%M%S` ; for i in `ls -lt *.log* | grep "Oct 11" | grep -E '12:|13:|14:' | awk '{print $9}'`; do zip logs_`hostname`_${DATE}.zip $i; done
答案1
您所指的脚本写得一点都不好,可能无法按您预期的方式工作。
以下是其具体操作细节:
日期=
date +%m%d%Y-%H%M%S
将当前日期以“10192016-171249”之类的格式存储在 DATE 中。有关详细信息,请参阅“man date”。顺便说一句,这不是存储日期/时间的最佳方式。出于快速参考/排序的原因,日期部分最好使用 YYYYMMDD 格式。
ls -lt *.log*
这将获取当前目录中与模式“*.log*”匹配的所有文件的目录列表。例如,它可能类似于:
-rw-r--r-- 1 root root 174106 Sep 30 17:28 dpkg.log.1
-rw-r--r-- 1 root root 1642 Oct 11 12:28 fontconfig.log
-rw-r----- 1 root adm 272254 Oct 11 11:28 kern.log.4.gz
-rw-r----- 1 root adm 272254 Oct 11 17:14 kernXX.log.1.gz
-rw-r----- 1 root adm 414 Sep 29 18:09 user.log.4.gz
-rw-r--r-- 1 root root 209 Sep 26 14:18 chipsee_clone.log
-rw-r--r-- 1 root root 1333 Apr 9 2015 pm-powersave.log.1
grep "10月11日"
然后它仅“提取”存在“Oct 11”的行,结果如下:
-rw-r--r-- 1 root root 1642 Oct 11 12:28 fontconfig.log
-rw-r----- 1 root adm 272254 Oct 11 11:28 kern.log.4.gz
-rw-r----- 1 root adm 272254 Oct 11 17:14 kernXX.log.1.gz
grep -E '12:|13:|14:
然后它再次提取仅存在“12:”或“13:”或“14”的数据:(再次做得很差,因为这适用于小时字段,也适用于分钟和秒字段)
-rw-r--r-- 1 root root 1642 Oct 11 12:28 fontconfig.log
-rw-r----- 1 root adm 272254 Oct 11 17:14 kernXX.log.1.gz
awk'{打印$9}'
从剩余的行中,它提取第 9 个元素(文件名):
fontconfig.log
压缩日志
hostname
_ _${DATE}.zip $i
使用上述命令的“for”循环,将每个文件添加到名为以下名称的 zip 文件中:
logs_`hostname`_${DATE}.zip
其中hostname
是主机名,而“${DATE}”是之前存储的日期。因此,如果您的主机名为 BLUERAY,并使用上面的日期,您将获得一个名为的文件:
logs_BLUERAY_10192016-171249.zip
再说一遍,这个脚本写得很糟糕,你当然不应该使用它(或同一作者编写的任何其他脚本)来学习如何编写脚本......