Подтвердить что ты не робот

Изменить конфигурационный файл, используя скрипт bash

Я пишу сценарий bash для изменения файла конфигурации, который содержит несколько пар ключ/значение. Как я могу прочитать ключ, найти значение и, возможно, изменить его?

4b9b3361

Ответ 1

Дикий удар в темноте для изменения одного значения:

sed -c -i "s/\($TARGET_KEY *= *\).*/\1$REPLACEMENT_VALUE/" $CONFIG_FILE

предполагая, что целевой ключ и значение замены не содержат специальных символов регулярных выражений и что ваш разделитель значений ключа равен "=". Примечание. Параметр -c зависит от системы, и вам может потребоваться опустить его для выполнения sed.

Для других советов о том, как делать подобные замены (например, когда в REPLACEMENT_VALUE есть символы // ), есть несколько отличных примеров здесь.

Ответ 2

Надеюсь, это кому-нибудь поможет. Я создал автономный скрипт, который требовал обработки конфигурации.

#!/bin/bash
CONFIG="/tmp/test.cfg"

# Use this to set the new config value, needs 2 parameters. 
# You could check that $1 and $2 is set, but I am lazy
function set_config(){
    sudo sed -i "s/^\($1\s*=\s*\).*\$/\1$2/" $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

Ответ 3

Предполагая, что у вас есть файл с парами key=value, потенциально с пробелами вокруг =, вы можете удалять, изменять на месте или добавлять пары ключ-значение по своему усмотрению с помощью awk, даже если ключи или значения содержат специальные регулярные выражения:

# 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]*' '$1=="keytodelete" { next } $1=="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?)"

Ответ 4

sed "/^$old/s/\(.[^=]*\)\([ \t]*=[ \t]*\)\(.[^=]*\)/\1\2$replace/" configfile

Ответ 5

вообще легко извлечь информацию с помощью grep и cut:


cat "$FILE" | grep "^${KEY}${DELIMITER}" | cut -f2- -d"$DELIMITER"

для обновления вы можете сделать что-то вроде этого:


mv "$FILE" "$FILE.bak"
cat "$FILE.bak" | grep -v "^${KEY}${DELIMITER}" > "$FILE"
echo "${KEY}${DELIMITER}${NEWVALUE}" >> "$FILE"

это, очевидно, не поддержало бы порядок пар ключ-значение. добавьте проверку ошибок, чтобы убедиться, что вы не потеряете свои данные.

Ответ 6

Предположим, что ваш файл конфигурации находится в следующем формате:

CONFIG_NUM=4
CONFIG_NUM2=5
CONFIG_DEBUG=n

В bash script вы можете использовать:

CONFIG_FILE=your_config_file
. $CONFIG_FILE

if [ $CONFIG_DEBUG == "y" ]; then
    ......
else
    ......
fi

$CONFIG_NUM, $CONFIG_NUM2, $CONFIG_DEBUG - это то, что вам нужно.

После того, как вы прочитаете значения, записать их будет легко:

echo "CONFIG_DEBUG=y" >> $CONFIG_FILE