Modifier le fichier de configuration en utilisant le script bash
j'écris un script bash pour modifier un fichier de configuration qui contient un tas de paires clé/valeur. Comment puis-je lire la clé et trouver la valeur et éventuellement de le modifier?
6 réponses
un coup sauvage dans l'obscurité pour modifier une seule valeur:
sed -c -i "s/\($TARGET_KEY *= *\).*/$REPLACEMENT_VALUE/" $CONFIG_FILE
en supposant que la clé cible et la valeur de remplacement ne contiennent pas de caractères regex spéciaux, et que votre séparateur clé-valeur est "=". Remarque, l'option-c dépend du système et vous devrez peut-être l'omettre pour sed à exécuter.
Pour d'autres conseils sur la façon d'effectuer des remplacements (par exemple, lorsque le REPLACEMENT_VALUE a '/' caractères), il y a de grands exemples ici.
Espérons que cela aide quelqu'un. J'ai créé un script autonome, qui nécessitait une sorte de traitement de configuration.
#!/bin/bash
CONFIG="/tmp/test.cfg"
# Use this to set the new config value, needs 2 parameters.
# You could check that and is set, but I am lazy
function set_config(){
sudo sed -i "s/^\(\s*=\s*\).*$//" $CONFIG
}
# INITIALIZE CONFIG IF IT'S MISSING
if [ ! -e "${CONFIG}" ] ; then
# Set default variable value
sudo touch $CONFIG
echo "myname=\"Test\"" | sudo tee --append $CONFIG
fi
# LOAD THE CONFIG FILE
source $CONFIG
echo "${myname}" # SHOULD OUTPUT DEFAULT (test) ON FIRST RUN
myname="Erl"
echo "${myname}" # SHOULD OUTPUT Erl
set_config myname $myname # SETS THE NEW VALUE
en Supposant que vous avez un fichier de key=value
couples, potentiellement avec des espaces autour du =
, vous pouvez supprimer, modifier en place ou ajouter des paires de valeurs clés à volonté en utilisant awk
même si les clés ou les valeurs contiennent des séquences regex spéciales:
# Using awk to delete, modify or append keys
# In case of an error the original configuration file is left intact
# Also leaves a timestamped backup copy (omit the cp -p if none is required)
CONFIG_FILE=file.conf
cp -p "$CONFIG_FILE" "$CONFIG_FILE.orig.`date \"+%Y%m%d_%H%M%S\"`" &&
awk -F '[ \t]*=[ \t]*' '=="keytodelete" { next } =="keytomodify" { print "keytomodify=newvalue" ; next } { print } END { print "keytoappend=value" }' "$CONFIG_FILE" >"$CONFIG_FILE~" &&
mv "$CONFIG_FILE~" "$CONFIG_FILE" ||
echo "an error has occurred (permissions? disk space?)"
sed "/^$old/s/\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)/$replace/" configfile
en général, il est facile d'extraire l'info avec grep et cut:
cat "$FILE" | grep "^${KEY}${DELIMITER}" | cut -f2- -d"$DELIMITER"
mettre à jour que vous pourriez faire quelque chose comme ceci:
mv "$FILE" "$FILE.bak"
cat "$FILE.bak" | grep -v "^${KEY}${DELIMITER}" > "$FILE"
echo "${KEY}${DELIMITER}${NEWVALUE}" >> "$FILE"
ceci ne maintiendrait pas l'ordre des paires de valeurs clés évidemment. ajouter la vérification d'erreur pour s'assurer que vous ne perdez pas vos données.
supposons que votre fichier de configuration est dans le format ci-dessous:
CONFIG_NUM=4
CONFIG_NUM2=5
CONFIG_DEBUG=n
Dans votre script bash, vous pouvez utiliser:
CONFIG_FILE=your_config_file
. $CONFIG_FILE
if [ $CONFIG_DEBUG == "y" ]; then
......
else
......
fi
$CONFIG_NUM
,$CONFIG_NUM2
,$CONFIG_DEBUG
est ce que vous avez besoin.
Après votre lecture les valeurs, l'écrire va être facile:
echo "CONFIG_DEBUG=y" >> $CONFIG_FILE