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?

38
demandé sur Benjamin W. 2010-03-17 21:18:26

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.

77
répondu Cascabel 2017-05-23 11:33:19

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
11
répondu Rudi Strydom 2014-09-25 09:56:28

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?)"
2
répondu vladr 2010-03-17 21:05:45
sed "/^$old/s/\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)/$replace/" configfile
2
répondu ghostdog74 2010-03-18 00:13:33

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.

0
répondu 2010-03-17 18:46:22

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
-1
répondu datasunny 2013-01-16 12:36:38