我正在尝试编写一个bash脚本,它将在conf文件中查找过时的条目并用新值更新它们。
旧的conf文件有两个条目(-CAR和-BIKE)。例如,
#Following are the entries in the conf file
#-CAR yes/no default set to no
#-BIKE yes/no default set to no
-CAR yes
-BIKE no
现在这个bash脚本应该对这些条目进行grep,并将它们替换为单个条目as-DRIVING_LEVEL(car/bike/none)。
其逻辑如下:
如果-CAR设置为yes,则驾驶级别将为“CAR”。
如果-CAR设置为no,-BIKE设置为yes,则驾驶级别将为“BIKE”。
如果“汽车”和“自行车”都设置为“无”,则驾驶级别将为“无”。
我已经写了下面的脚本做了确切的事情。
#!/bin/bash
CONF_FILE="license.conf"
grep -w $CONF_FILE -e '-CAR' -e '-BIKE' > /dev/null
if [ $? -eq 0 ]
then
echo "Old values are present"
var=$(grep -w $CONF_FILE -e '-CAR')
if [ $? -eq 0 ]
then
temp="${var##*$'\n'}"
option=$(echo $temp | sed 's/.* //g')
echo $option
if [ "$option" == "yes" ]; then
car=1
elif [ "$option" == "no" ]; then
car=0
fi
echo "Deleting $var"
sed -i '/-CAR/d' $CONF_FILE
fi
var2=$(grep -w $CONF_FILE -e '-BIKE')
if [ $? -eq 0 ]
then
temp2="${var2##*$'\n'}"
option=$(echo $temp2 | sed 's/.* //g')
echo $option
if [ "$option" == "yes" ]; then
bike=1
#echo $temp
elif [ "$option" == "no" ]; then
bike=0
fi
echo "Deleting $var2"
sed -i '/-BIKE/d' $CONF_FILE
fi
if [ "$car" == "1" ]; then
driving_level="car"
elif [ "$bike" == "1" ]; then
driving_level="bike"
else
driving_level="none"
fi
echo "Appending -DRIVING_LEVEL $driving_level"
echo "-DRIVING_LEVEL $driving_level" >> $CONF_FILE
else
echo "No old values"
fi
问题是我认为这太长了,可以使用sed或awk命令来缩短。但我做不到。我希望它越短越好。
提前谢谢!
注:
我使用temp=“${var###*$'\n'}”来检索最后一行具有实际值,因为grep将给出包含-BIKE的两行。
我使用了option=$(echo$temp | sed's/*//g'),因为-BIKE和yes/no之间可以有任意数量的空格。
最佳答案
$ awk '($0 ~ /-CAR.*yes$/){dl="car";exit} ($0 ~ /-BIKE.*yes$/){dl="bike"} END{print "-DRIVING_LEVEL",(dl)?dl:"none"}' license.conf
-DRIVING_LEVEL car
简要说明,
$0 ~ /-CAR.*yes$/
:如果找到“-CAR yes”,直接打印结果(这就是我在这里使用exit
的原因)($0 ~ /-BIKE.*yes$/)
:如果找到“-BIKE yes”,请继续查找后续行,因为有可能找到“CAR”。如果未找到任何结果,则将结果打印为“无”。
关于linux - 如何使用sed或awk命令基于其他两个变量的值设置变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45208164/