0
votes

Grep avec RegEx à l'intérieur d'un conteneur Docker?

Trempant mes orteils dans le codage Bash pour la première fois ( pas la personne la plus expérimentée avec Linux non plus ) et j'essaye de lire la version à partir du version.php dans un conteneur à:

/config/www/nextcloud/version.php

Pour ce faire, je cours:

docker exec -it 1c8c05daba19 grep -eo "(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?" /config/www/nextcloud/version.php

Cela utilise un modèle RegEx de versioning sémantique ( je sais, un peu exagéré, mais cela fonctionne pour l'instant ) pour lire et extraire la version de la ligne:

$OC_VersionString = '20.0.1';

Cependant, quand je lance la commande , il me dit No such file or directory , (je l' ai confirmé qu'il ne existe à ce chemin à l' intérieur du conteneur) et procède ensuite à cracher sur le contenu du fichier , il a juste dit n'existe pas ?

grep: (0 | [1-9] \ d *). (0 | [1-9] \ d *). (0 | [1-9] \ d *) (?: - ((?: 0 | [1-9] \ d * | \ d * [a-zA-Z -] [0-9a-zA-Z-] ) (?:. (?: 0 | [1-9] \ d | \ d * [a-zA-Z -] [0-9a-zA-Z-] )) ))? (?: + ([0-9a-zA-Z -] + (?:. [0-9a-zA -Z -] +) *))?: Aucun fichier ou répertoire de ce type /config/www/nextcloud/version.php:$OC_Version = array (20,0,1,1); /config/www/nextcloud/version.php:$OC_VersionString = '20 .0.1 '; /config/www/nextcloud/version.php:$OC_Edition = ''; /config/www/nextcloud/version.php:$OC_VersionCanBeUpgradedFrom = array (/config/www/nextcloud/version.php: 'nextcloud' => /config/www/nextcloud/version.php: 'owncloud' => / config /www/nextcloud/version.php:$vendor = 'nextcloud';

Quelqu'un est-il capable de déceler le problème?

Mise à jour 1:

Par souci de clarté, j'essaye d'exécuter ceci à partir d'un script bash. Je veux juste récupérer le numéro de version de ce fichier, pour l'utiliser dans d'autres zones du script.

Mise à jour 2:

En réponse aux commentaires, j'ai d'abord essayé de me connecter au conteneur, puis d'exécuter le grep et d'obtenir toujours le même résultat. Ensuite, je chat ce fichier et il montre que son contenu ne pose aucun problème.

entrez la description de l'image ici


2 commentaires

La commande docker exec -it est utilisée pour vous connecter au conteneur et une fois que vous vous êtes connecté, vous pouvez grep. donc, connectez-vous d'abord au conteneur docker exec -it 1c8c05daba19 puis recherchez avec regexp


hmm, connectez-vous au conteneur, vérifiez si le fichier existe, essayez d'exécuter le bash après vous être connecté, vérifiez si cela fonctionne bien. 99% vous avez peut-être fait une simple erreur


3 Réponses :


0
votes

Connectez-vous d'abord au conteneur à l'aide de la commande ci-dessous, puis essayez de lire la version à partir du version.php intérieur d'un conteneur.

docker exec -it 1c8c05daba19 /bin/bash

Une fois que vous vous êtes connecté au conteneur, vous pouvez lire la version à partir du version.php


2 commentaires

J'essaye d'exécuter ceci à partir d'un script bash.


Je viens de mettre à jour le message original pour ajouter un peu de clarté. J'avais juste supposé que cela pouvait être évident après l'avoir lu, mais peut-être que ce n'était pas le cas.



1
votes

De nombreux conteneurs n'ont pas les versions GNU des outils Unix et leurs diverses extensions. Il est courant de baser les conteneurs sur Alpine Linux, qui à son tour utilise un outil binaire unique très léger appelé BusyBox pour fournir les outils de base. Ceux-ci ont tendance à avoir l'ensemble des options requises dans les spécifications POSIX, et pas plus.

POSIX grep (1) en particulier n'a pas d'option -o . Donc, la commande que vous exécutez est

sed -e 's/.*\(any regexp here\).*/\1/' input-file

Notez que la sortie de grep dans le shell interactif ne contient que des lignes avec la lettre "o", mais pas par exemple la ligne contenant juste un array .

POSIX grep n'a pas d'équivalent pour l' option -o de GNU grep

Imprimez uniquement les parties correspondantes (non vides) des lignes correspondantes, chacune de ces parties sur une ligne de sortie distincte. Les lignes de sortie utilisent les mêmes délimiteurs que l'entrée ....

mais c'est facile de le faire avec sed (1) à la place. Demandez-lui de faire correspondre certains éléments, l'expression rationnelle en question et d'autres éléments, et remplacez-le par le groupe correspondant.

grep                                 \
  -eo                                \ # specify "o" as the regexp to match
  "(regexps are write-only)"         \ # a filename
  /config/www/nextcloud/version.php    # a second filename

(POSIX sed n'accepte que les expressions régulières de base, vous devrez donc échapper davantage de parenthèses.)


3 commentaires

Merci @David Maze, j'avais également pensé à vérifier la version de grep à l'intérieur du conteneur juste avant de lire votre message et j'ai fait un rapide grep --help . Et vous avez raison, il utilise une version de busybox allégée qui semble également avoir besoin d'un argument -f pour le nom de fichier, mais curieusement, il a toujours l'argument -o . i.imgur.com/hKqEkei.png Je n'arrive toujours pas à le faire fonctionner, alors je vais donner une chance à votre suggestion sed.


Cela semble-t-il correct? sed -e 's/.*\([0-9]{1,2}\)+[.]+\([0-9]{1,2}\)+[.]+\([0-9]{1,2}\).*/‌​\1/' /config/www/nextcloud/version.php . Essayer un autre regex, mais quand je l'utilise, il renvoie simplement tout le contenu du fichier.


Même résultat avec plus de caractères d' sed -e 's/.*\([0-9]\{1,2\}\)\+[.]\+\([0-9]\{1,2\}\)\+[.]\+\([0-9]\{‌​1,2\}\).*/\1/' /config/www/nextcloud/version.php : sed -e 's/.*\([0-9]\{1,2\}\)\+[.]\+\([0-9]\{1,2\}\)\+[.]\+\([0-9]\{‌​1,2\}\).*/\1/' /config/www/nextcloud/version.php



0
votes

Eh bien, pour tous les futurs lecteurs potentiels, je n'ai pas eu de chance de faire en sorte que grep le fasse, je suis sûr que c'était de ma faute et pas de grep, mais grâce à l'aide de cet article, j'ai pu utiliser awk au lieu de grep , comme donc:

docker exec -it 1c8c05daba19 awk '/^\$OC_VersionString/ && match($0,/\047[0-9]+\.[0-9]+\.[0-9]+\047/){print substr($0,RSTART+1,RLENGTH-2)}' /config/www/nextcloud/version.php

Cela a fini par faire exactement ce dont j'avais besoin:

  • Il se connecte à un conteneur docker.
  • Analyse et renvoie uniquement le numéro de version de la ligne que je recherche à: /config/www/nextcloud/version.php à l'intérieur du conteneur.
  • Quitte l'étape à gauche du conteneur avec juste les informations dont j'avais besoin.
  • Je peux recommencer à manger mes Cheetos chauds.


0 commentaires