J'ai un fichier parameters.ini, tel que:
[parameters.ini]
database_user = user
database_version = 20110611142248
Je souhaite lire et utiliser la version de la base de données spécifiée dans le fichier parameters.ini à partir d'un script shell bash afin de pouvoir la traiter.
#!/bin/sh
# Need to get database version from parameters.ini file to use in script
php app/console doctrine:migrations:migrate $DATABASE_VERSION
Comment ferais-je ça?
Réponses:
Que diriez-vous de grepping pour cette ligne puis d'utiliser awk
la source
| tr -d ' '
à la fin.Vous pouvez utiliser l'analyseur natif bash pour interpréter les valeurs ini, en:
Exemple de fichier:
Pour les variables d' accès, il vous suffit de les imprimer:
echo $var1
. Vous pouvez également utiliser des tableaux comme indiqué ci-dessus (echo ${IPS[@]}
).Si vous ne voulez qu'une seule valeur juste grep pour cela:
Pour la démo, vérifiez cet enregistrement à asciinema .
C'est simple car vous n'avez besoin d'aucune bibliothèque externe pour analyser les données, mais cela présente certains inconvénients. Par exemple:
Si vous avez des espaces entre
=
(nom et valeur de la variable), vous devez d'abord couper les espaces, par exempleOu si vous ne vous souciez pas des espaces (y compris au milieu), utilisez:
Pour soutenir les
;
commentaires, remplacez-les par#
:Les sections ne sont pas prises en charge (par exemple, si vous avez
[section-name]
, alors vous devez le filtrer comme indiqué ci-dessus, par exemplegrep =
), de même pour d'autres erreurs inattendues.Si vous avez besoin de lire une valeur spécifique prévue à l' article spécifique, l' utilisation
grep -A
,sed
,awk
ouex
).Par exemple
Remarque: Où
-A5
est le nombre de lignes à lire dans la section. Remplacezsource
parcat
pour déboguer.Si vous avez des erreurs d'analyse, ignorez-les en ajoutant:
2>/dev/null
Voir également:
la source
source <(grep = <(grep -A5 '\[section-b\]' file.ini))
cela ne fonctionnera pas pour cela: [sec a] a = 1 b = 2 c = 3 [sec b] a = 2 b = 3 [sec c] a = 0. où il n'y a pas de règle définie avec des lignessyntax error near unexpected token '('
. Avec bash, il échoue silencieusement à la fois à partir de l'invite et du script.Bash ne fournit pas d'analyseur pour ces fichiers. Évidemment, vous pouvez utiliser une commande awk ou quelques appels sed, mais si vous êtes bash-prêtre et que vous ne voulez pas utiliser d'autre shell, vous pouvez essayer le code obscur suivant:
Usage:
Bash ini-parser peut être trouvé sur le site de blog The Old School DevOps .
la source
Sed one-liner, qui tient compte des sections. Exemple de fichier:
Disons que vous voulez param2 de la section2. Exécutez ce qui suit:
te donnera
la source
"/^\[section2\]/,/^\[/{...}"
brew install gnu-sed
puis utilisezgsed
(autrement:sed: illegal option -- r
)sed -nr "/^\[SECTION2\]/ { :l /^\s*[^#].*/ p; n; /^\[/ q; b l; }"
expression? merciIncluez simplement votre fichier .ini dans le corps de bash:
Fichier example.ini :
Fichier example.sh
la source
Toutes les solutions que j'ai vues jusqu'à présent ont également touché des lignes commentées. Celui-ci ne l'a pas fait, si le code du commentaire est
;
:la source
| tr -d ' '
à la fin.une ou plusieurs solutions possibles
la source
Afficher la valeur de my_key dans un style ini mon_fichier :
-n
- ne rien imprimer par défaut-e
- exécuter l'expressions/PATTERN//p
- affichez tout ce qui suit ce modèle dans le modèle:^
- le motif commence au début de la ligne\s
- caractère d'espacement*
- zéro ou plusieurs (caractères d'espacement)Exemple:
Alors:
la source
bar
imprimé), du moins sous Unix / OSX.sed
Vous pouvez utiliser
sed
pour analyser le fichier de configuration ini, en particulier lorsque vous avez des noms de section comme:vous pouvez donc utiliser le
sed
script suivant pour analyser les données ci-dessus:cela convertira les données ini dans ce format plat:
il sera donc plus facile d'analyser en utilisant
sed
,awk
ouread
en ayant des noms de section dans chaque ligne.Crédits & source: Fichiers de configuration pour les scripts shell , Michael Grünewald
Vous pouvez également utiliser ce projet
chilladx/config-parser
:, un analyseur de configuration utilisantsed
.la source
Vous pouvez utiliser l'
crudini
outil pour obtenir des valeurs ini, par exemple:la source
yum install crudini
Pour les personnes (comme moi) qui cherchent à lire des fichiers INI à partir de scripts shell (lire le shell, pas bash) - j'ai lancé la petite bibliothèque d'aide qui essaie de faire exactement cela:
https://github.com/wallyhall/shini (licence MIT, faites-en ce que vous voulez. J'ai lié ci-dessus en l'incluant en ligne car le code est assez long.)
C'est un peu plus "compliqué" que les simples
sed
lignes suggérées ci-dessus - mais fonctionne sur une base très similaire.La fonction lit un fichier ligne par ligne - à la recherche de marqueurs de section (
[section]
) et de déclarations clé / valeur (key=value
).En fin de compte, vous obtenez un rappel de votre propre fonction - section, clé et valeur.
la source
Similaire aux autres réponses Python, vous pouvez le faire en utilisant l'
-c
indicateur pour exécuter une séquence d'instructions Python données sur la ligne de commande:Cela a l'avantage de ne nécessiter que la bibliothèque standard Python et l'avantage de ne pas écrire un fichier de script séparé.
Ou utilisez un document ici pour une meilleure lisibilité, ainsi:
la source
Certaines réponses ne respectent pas les commentaires. Certains ne respectent pas les sections. Certains ne reconnaissent qu'une seule syntaxe (seulement ":" ou seulement "="). Certaines réponses Python échouent sur ma machine en raison d'une captialisation différente ou de l'échec de l'importation du module sys. Tous sont un peu trop laconiques pour moi.
J'ai donc écrit le mien, et si vous avez un Python moderne, vous pouvez probablement l'appeler depuis votre shell Bash. Il a l'avantage d'adhérer à certaines des conventions de codage Python courantes et fournit même des messages d'erreur et une aide judicieux. Pour l'utiliser, nommez-le quelque chose comme myconfig.py (ne l'appelez PAS configparser.py ou il peut essayer de s'importer,) rendez-le exécutable et appelez-le comme
Voici mon code pour Python 3.5 sur Linux:
la source
simplicité complexe
fichier ini
test.ini
script bash avec lecture et exécution
/ bin / parseini
puis dans un autre script, je source les résultats de la commande et je peux utiliser toutes les variables dans
test.sh
enfin depuis la ligne de commande la sortie est donc
la source
Voici ma version, qui analyse les sections et en remplit un tableau associatif global g_iniProperties . Notez que cela ne fonctionne qu'avec bash v4.2 et supérieur.
Et voici un exemple de code utilisant la fonction ci-dessus:
la source
Ce script obtiendra les paramètres comme suit:
ce qui signifie que si votre ini a:
par exemple. comment l'appeler:
[environnement]
[DataBase_Sector]
Puis appelant:
cela récupérera le "quelque chose" suivant
le script "pars_ini.ksh":
la source
J'ai écrit un script python rapide et facile à inclure dans mon script bash.
Par exemple, votre fichier ini est appelé
food.ini
et dans le fichier, vous pouvez avoir des sections et des lignes:Copiez ce petit script Python de 6 lignes et enregistrez-le sous
configparser.py
Maintenant, dans votre script bash, vous pouvez le faire par exemple.
ou
Cela suppose:
J'espère que ça aide : ¬)
la source
Ma version du one-liner
la source
Je viens de finir d'écrire mon propre analyseur. J'ai essayé d'utiliser divers analyseurs trouvés ici, aucun ne semble fonctionner à la fois avec ksh93 (AIX) et bash (Linux).
C'est un vieux style de programmation - l'analyse ligne par ligne. Assez rapide car il utilisait peu de commandes externes. Un peu plus lent à cause de toutes les évaluations requises pour le nom dynamique du tableau.
L'ini prend en charge 3 syntaxes spéciales:
J'ai utilisé toute cette syntaxe pour avoir un fichier ini assez complexe et réutilisable. Utile pour installer des produits lors de l'installation d'un nouveau système d'exploitation - nous le faisons souvent.
Les valeurs sont accessibles avec $ {ini [$ section. $ Item]}. Le tableau DOIT être défini avant de l'appeler.
S'amuser. J'espère que c'est utile pour quelqu'un d'autre!
la source
Cette implémentation utilise
awk
et présente les avantages suivants:;
Version formatée :
Une doublure :
la source
Lorsque j'utilise un mot de passe en base64, je mets le séparateur ":" car la chaîne base64 peut avoir "=". Par exemple (j'utilise
ksh
):En
parameters.ini
mettre la lignepass:QWJjMTIzCg==
, et enfin:Si la ligne a des espaces comme
"pass : QWJjMTIzCg== "
ajouter| tr -d ' '
pour les couper:la source
Cela utilise le système perl et des expressions régulières propres:
la source
La réponse de "Karen Gabrielyan" parmi les autres réponses était la meilleure, mais dans certains environnements, nous n'avons pas de problème, comme la boîte de réception typique, j'ai changé la réponse par le code ci-dessous.
la source
Si Python est disponible, ce qui suit lira toutes les sections, clés et valeurs et les enregistrera dans des variables avec leurs noms suivant le format "[section] _ [clé]". Python peut lire correctement les fichiers .ini, nous l'utilisons donc.
config.ini
la source
Vous pouvez utiliser un analyseur CSV xsv pour analyser les données INI.
ou à partir d'un fichier.
la source
Si vous utilisez des sections, cela fera le travail:
Exemple de sortie brute:
Analyse des expressions rationnelles:
Maintenant tous ensemble:
la source
J'ai un joli one-liner (en supposant que vous avez
php
etjq
installé):la source