我有一个用于文本转换的shell脚本,但是使用起来很麻烦并且依赖于手动判断和执行。其工作原理如下。
步骤1:下载原始数据文本。
wget http://example.com/raw.txt
步骤 2:手动比较上次下载文件的内容是否存在差异。
文本的内容格式比较简单,一行一串。如果内容增加了,则需要运行脚本处理。
# Last downloaded file content:
wtKpjv
uJlQm1
iS86aE
Hk6ycS
hAYj7k
# Now downloaded file content:
wtKpjv
uJlQm1
RiU8iM
iS86aE
Hk6ycS
qyDNaZ
hAYj7k
# Compare the increased content:
RiU8iM
qyDNaZ
步骤3:如果比较结果有差异,则需要运行脚本处理。
./text_processing.sh raw.txt > new.text
以上是我目前的使用步骤。如何设置自动化任务来完成此过程?
我想每天检查一次。如果文本内容更新,我需要立即运行脚本。如果没有更改,该脚本每 3 天运行一次。
如果有人能帮助我,我将非常感激。
答案1
您的问题对您的要求有点模糊。
如果您只想检查任何差异,请使用cmp -s oldfile newfile
.如果文件相同,将以 true 状态退出:
if cmp -s oldfile newfile
then echo files are the same
else echo files are different
./text_processing.sh ...
fi
如果您想检查文件大小是否增加,则可以使用wc -c
(用于字符计数)、wc -l
(用于行计数),或者stat --format=%s
直接使用有关文件的元数据来给出总大小(以字节为单位)。
if [ $(wc -c oldfile) -lt $(wc -c newfile) ]
then echo oldfile is smaller
./text_processing.sh ...
fi
$( ... )
运行随附的命令并将其输出替换到命令行中。[ ... -lt ... ]
测试第一个参数是否是我埃斯比第二个论点。
如果您特别想检查是否添加了一行,那么最好的策略可能是首先对两个文件进行排序,然后使用comm
过滤掉公共行:
sort -o oldfile.sorted oldfile
sort -o newfile.sorted newfile
if [ $(comm -13 oldfile.sorted newfile.sorted | wc -l) -gt 0 ]
then echo 'line(s) only found in newfile'
./text_processing.sh ...
fi
comm -13
匹配两个文件中的行。通常,每行都会输出,并带有缩进来指示该行是仅出现在第一个文件中,还是仅出现在第二个文件中,或同时出现在两个文件中。由于-13
仅来自第一个文件的行和公共行被抑制,因此仅输出第二个文件中出现的那些行。它通过管道输送到wc -l
对行进行计数,并且经测试大于 0。
请注意,更改的行将仅在第一个文件中由一行表示,而仅在第二个文件中由另一行表示。