检查文件是否已被修改
问题描述:
我如何可以验证该替换命令成功:检查文件是否已被修改
perl -pi -e 's/contoso/'"$hostname"'/g' /etc/inet/hosts
我曾尝试检查返回值:
if [ $? -eq 0 ]; then
echo "OK"
else
echo "Error."
fi
但返回值不被当设置该命令失败。
感谢
答
一个选项是检查,如果文件已被修改。您可以将备份文件的扩展名-i
选项实现:
perl -pi.orig -e 's/contoso/'"$hostname"'/g' /etc/inet/hosts
此命令将在/etc/inet/hosts
原始内容存储到/etc/inet/hosts.orig
。然后运行指定的命令。然后,你可以检查文件是否有不同,例如cmp
命令:
if ! cmp -s foo.txt foo.txt.orig; then
echo OK
else
echo ERROR
fi
后删除那些.orig的文件。
另一种方法是修改脚本以读取文件内容,替换所需的条目,检查实际发生的变化,并在最后返回适当的状态以使用$?
在shell中进行验证。您已获得this answer的解决方案。
答
我不知道Perl的,但你可以管理“错误”的多案例(敌不过/没办法在文件中写入)一个小bash脚本这样的:
#!/bin/bash
FILE="/etc/inet/hosts"
SEARCH="contoso"
REPLACE="$hostname"
NB=$(grep -c $SEARCH $FILE)
if [ $NB -ne 0 ]; then
perl -pi -e 's/${SEARCH}/'${REPLACE}'/g' "$FILE" && echo "${NB} replaced" || echo "Error (permission maybe)"
else
echo "No match in file"
fi
我认为通过改进Perl代码或使用sed
命令有更好的方法。但它应该起作用。
答
如果你希望你的perl脚本返回一个有意义的值,你需要编写你的perl脚本来返回一个有意义的值。在你的情况下,可能是这样简单的:
perl -p -e 's/contoso/'"$hostname"'/g; $rv=1 if $&; END{ exit !$rv }'
答
通常,校验和是检测文件更改的一种非常有效的方法。
md5sum [filename]
[email protected]:~# echo 'line 1' >>1.txt
[email protected]:~# md5sum 1.txt
5c2ce561e1e263695dbd267271b86fb8 1.txt
[email protected]:~# echo 'line 2' >>1.txt
[email protected]:~# md5sum 1.txt
c7253b64411b3aa485924efce6494bb5 1.txt
我想的总和可以从输出中提取与AWK
[email protected]:~# echo $(md5sum 1.txt) | awk 'BEGIN{FS=" *"}{print "MD5:",$1}'
MD5: c7253b64411b3aa485924efce6494bb5
[email protected]:~# echo $(md5sum 1.txt) | awk 'BEGIN{FS=" *"}{print "filename:",$2}'
filename: 1.txt
FS =“*”指示AWK分裂上的一个或多个空格的发生的字符串。 $ 1将是MD5,$ 2将是文件名。
对于任何大小的文件,MD5校验和都可以快速工作。缺点是你没有真正检测到文件中发生了什么变化,只是事实发生了变化。对于大多数场景应该足够好。
当命令失败时,返回值不是0.它实际上被设置。 – zhenguoli
检查https://stackoverflow.com/questions/15965073/return-code-of-sed-for-no-match –
什么决定成功? ...同样失败了?无论命令是否与字符串匹配,您的命令都会修改该文件;目前还不清楚这是否是你认为是成功的。 –