有一点麻烦试图使以下工作。
我有一个包含hostname:timestamp
以下内容的文件:
hostname1:1445072150
hostname2:1445076364
我正在尝试创建一个bash脚本,该脚本将查询该文件(使用cron作业)以检查时间戳是否超过1小时,如果是,则删除该行。下面是我到目前为止所拥有的,但似乎并未删除文件中的这一行。
#!/bin/bash
hosts=/tmp/hosts
current_timestamp=$(date +%s)
while read line; do
hostname=`echo $line | sed -e 's/:.*//g'`
timestamp=`echo $line | cut -d ":" -f 2`
diff=$(($current_timestamp-$timestamp))
if [ $diff -ge 3600 ]; then
echo "$hostname - Timestamp over an hour old. Deleting line."
sed -i '/$hostname/d' $hosts
fi
done <$hosts
我设法使时间戳记部分正常工作,以识别超过一个小时的主机,但无法从文件中删除时间。
我怀疑这可能是由于while循环使文件保持打开状态,但不是100%确定如何解决该问题。还尝试制作该文件的副本并对其进行编辑,但仍然一无所获。
替代地:如果有更好的方法使它起作用并产生相同的结果,我愿意提出建议:)
任何帮助将非常感激。
干杯
您的脚本中的问题就是这一行:
sed -i '/$hostname/d' $hosts
单引号内的变量不会扩展为它们的值,因此该命令试图替换字面意义上的“ $ hostname”而不是其值。如果将单引号替换为双引号,则变量将扩展为它的值,这是您在此处需要的:
sed -i "/$hostname/d" $hosts
有可能的改进:
#!/bin/bash
hosts=/tmp/hosts
current_timestamp=$(date +%s)
while read line; do
set -- ${line/:/ }
hostname=$1
timestamp=$2
((diff = current_timestamp - timestamp))
if ((diff >= 3600)); then
echo "$hostname - Timestamp over an hour old. Deleting line."
sed -i "/^$hostname:/d" $hosts
fi
done <$hosts
改进之处:
((...))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句