这似乎是几个命令的组合来创建一个实际的脚本,而不是一个熟练的commandlinefu只在一行中。
假设报告标题部分中的行数是一致的,那么您可以使用tail -n +7返回前 7 行之后的行,如示例中所示。
如果它们不相同,但都以您在上面显示的行“ ==========”结尾,那么您可以使用grep -n查找该行号并开始解析其后的帐号。
#!/usr/bin/env bash
OLD_FILE="ancient_report.log"
NEW_FILE="latest_and_greatest.log"
tmp_ext=".tmp"
tail -n +7 ${OLD_FILE} > ${OLD_FILE}${tmp_ext}
tail -n +7 ${NEW_FILE} >> ${OLD_FILE}${tmp_ext}
sort -u ${OLD_FILE}${tmp_ext} > ${OLD_FILE}${tmp_ext}.unique
mv -f ${OLD_FILE}${tmp_ext}.unique ${OLD_FILE}
为了说明这个脚本:
#!/usr/bin/env bash
上面的 shebang 行告诉 *nix 如何运行它。
OLD_FILE="ancient_report.log"
NEW_FILE="latest_and_greatest.log"
tmp_ext=".tmp"
声明起始变量。您也可以通过使用文件名的参数来做到这一点。OLD_FILE=${1}获取命令行上的第一个参数。
tail -n +7 ${OLD_FILE} > ${OLD_FILE}${tmp_ext}
tail -n +7 ${NEW_FILE} >> ${OLD_FILE}${tmp_ext}
将两个文件的结尾放入一个“tmp”文件中
sort -u ${OLD_FILE}${tmp_ext} > ${OLD_FILE}${tmp_ext}.unique
排序并仅保留“唯一”条目-u
如果您的操作系统版本sort没有,-u那么您可以使用以下方法获得相同的结果:sort <filename> | uniq
mv -f ${OLD_FILE}${tmp_ext}.unique ${OLD_FILE}
用新的 uniq'd 文件替换旧文件。
当然有很多更简单的方法可以做到这一点,但是这个方法可以通过一系列命令完成工作。
编辑:
要使用最新报告日期保留文件的标题部分,然后不要mv在旧文件上使用新的 tmp 文件,请执行以下操作:
rm ${OLD_FILE};
head -n 7 ${NEW_FILE}) > ${OLD_FILE}
cat ${OLD_FILE}${tmp_ext}.unique >> ${OLD_FILE}
这将删除 OLD_FILE(如果不先删除就无法覆盖)并将新文件的标题(用于日期)和唯一 tmp 文件的全部内容放在一起。在此之后,您可以进行常规文件清理,例如删除您创建的任何新文件。要保留/调试任何更改,您可以为每个“唯一”文件名添加一个日期戳,并将它们作为所有报告添加的审计跟踪。