65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 diff -e 选项创建基线 diff 文件

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2018年6月24日

CPOL

2分钟阅读

viewsIcon

3850

如何使用 diff -e 选项创建基线 diff 文件

引言

对于我正在开发的一个系统/服务,我基本上需要维护一个基线,它是一个包含人口统计信息的 CSV 文件。基线文件有很多行,每一行代表一个人的人口统计信息。然后,一个 cronjob 服务会创建一个包含更新的信息或新增人员的临时 CSV 文件。我的服务处理这个新的临时文件,并更新基线以包含任何更改的数据或新增人员,以及从基线中删除的任何人员。

这篇文章基本上告诉你如何使用 diff -e 选项生成一个 GNU ed 编辑器 脚本,结合 ed 和其他命令来正确地创建一个新的基线文件。

Bash 脚本 & 变量

该脚本在 bash shell 中运行,我创建变量来引用基线和临时文件

#!/bin/bash

NOW=$(date +"%Y%m%d%H%M") # Timestamp for creating files.
BASELINE=`ls baseline/baseline.csv`
TEMP=`​ls temp/compare.csv​`

在上面的脚本中,变量 $NOW 用于给文件打时间戳。时间戳的格式是“yyyymmddhhmm”。每当你想要跟踪文件创建时间时,这会很有用。变量 $baseline 是基线文件,而 $TEMP 是临时文件。

创建 ed 脚本

以下行使用 -e 选项与 diff 一起创建 ed 脚本

diff -e $BASELINE $TEMP > ed-script

文件“ed-script”基本上是一个 ed 编辑器脚本。

创建新的基线

然后,要使用 ed 脚本 创建新的基线,你需要运行以下命令

cp $BASELINE baseline/new_baseline.csv
(cat ed-script && echo w) | ed - baseline/new_baseline.csv

我展示了 2 行命令,第一行首先创建原始基线的副本,以免立即覆盖原始基线;第二行创建新的基线。脚本中的 (cat ed-script && echo w) 部分,基本上将 ed-script 输出到标准输出,然后发出 w 命令来写入文件;所有这些都通过管道传递给 ed 和新的基线文件以生成。

备份旧基线

以防万一出现问题,最好归档(或备份)内容

mv $BASELINE archive/baseline_$NOW.csv
mv baseline/new_baseline.csv $BASELINE

以上将原始基线移动到存档文件夹,并在文件名末尾追加时间戳。然后,第二个移动 (mv) 将文件重命名为 baseline.csv,从而完成新基线的创建。

完整脚本

供参考,这是完整的脚本

#!/bin/bash

NOW=$(date +"%Y%m%d%H%M")	# Timestamp for creating files.
BASELINE=`ls baseline/baseline.csv`
TEMP=`ls temp/compare.csv`

diff -e $BASELINE $TEMP > ed-script
cp $BASELINE baseline/new_baseline.csv
(cat ed-script && echo w) | ed - baseline/new_baseline.csv
mv $BASELINE archive/baseline_$NOW.csv
mv baseline/new_baseline.csv $BASELINE

尽情享用!

© . All rights reserved.