IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Définir une variable en fonction d'une sortie 'awk'


Sujet :

Shell et commandes GNU

  1. #1
    Modérateur
    Avatar de blueice
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2003
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 494
    Par défaut Définir une variable en fonction d'une sortie 'awk'
    Bonjour,

    Je ne sais pas si je m'y prends de la meilleure façon...
    J'essaye de récupérer le nom d'un dossier en l'occurence le dernier créé.
    J'ai donc testé une commande dans le terminal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ls -got | grep '^d' | head -1 | awk '{print $7}'
    qui m'affiche bien mon nom de dossier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    10-08-2016_13:01:36
    J'ai donc voulu l'intégrer dans un site bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #!/bin/bash
     
     
    ssh USER@LOGIN "cd dossierbackup/;ls -got | grep '^d' | head -1 | awk '{print $7}';exit"
    Je voudrais arriver à définir la sortie $7 comme une variable à réutiliser dans une prochaine commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #!/bin/bash
     
     
    ssh USER@LOGIN "cd dossierbackup/;ls -got | grep '^d' | head -1 | awk '{print $7}'; zip -r MAVARIABLE$7/ ;exit"
    comment je dois m'y prendre ?

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 663
    Par défaut
    Bonjour,

    d'abord, le nom de fichier est très mal conçu.
    c'est visuellement satisfaisant, mais "programmatiquement" pénible; tu devrais (si tu peux) utiliser le nombre de secondes depuis EPOCH, avec un préfixe significatif.

    et puis ON N'UTILISE PAS ls DANS UN SCRIPT !!!on passe par stat qui permet de choisir finement les informations à afficher.
    dans ton cas, la date (au format secondes depuis EPOCH) et le nom, que tu piperas à la commande de tri, puis à un découpage simple pour ne garder que le nom.

    enfin, man bash, puis rechercher Substitution de commandes.
    et lire les tutos qui apparaissent dans ma signature.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Modérateur
    Avatar de blueice
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2003
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 494
    Par défaut
    Pas le choix des noms des dossiers, c'est des sauvegardes ftp sur un hébergement gérées automatiquement par l'hébergeur.
    Voici la liste du dossier actuel affichée par ls -got :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    drwxr-sr-x 15 4096 août  10 12:26 10-08-2016_13:01:36
    drwxr-sr-x 14 4096 juin  15 10:21 01-08-2016_10:28:15
    drwxr-sr-x 14 4096 juin  15 10:21 02-08-2016_07:33:42
    drwxr-sr-x 14 4096 juin  15 10:21 03-08-2016_11:21:07
    drwxr-sr-x 14 4096 juin  15 10:21 04-08-2016_09:56:19
    drwxr-sr-x 14 4096 juin  15 10:21 05-08-2016_12:27:38
    drwxr-sr-x 14 4096 juin  15 10:21 07-08-2016_15:38:05
    Tu proposes quoi ?
    Mon but serait de faire une connexion SSH, d'aller dans le dossier des sauvegardes, de zipper le dernier dossier en date puis de le télécharger,
    le tout 1 fois/semaine

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 663
    Par défaut
    Citation Envoyé par blueice
    Tu proposes quoi ?
    schématiquement (il faut regarder les man pour trouver les options correctes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cd repertoire; stat <options> * | sort <options> | tail <option> | cut <options>
    ensuite, pour stocker le résultat dans une variable (bien que ça ne semble pas indispensable), regarde le man de bash à la rubrique que je t'ai indiquée précédemment.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 354
    Par défaut
    Bonjour,

    Dommage d'avoir autant de haine pour ls, ici un simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    zip -r $(ls -got | awk '/^d/ {print $7;exit}')
    Pourrait le faire, non ?

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 663
    Par défaut
    en attendant un espace (ou pire) dans le nom du fichier.
    en attendant que ça ne fonctionne plus.

    Dommage d'avoir autant de haine pour ls
    mais pourquoi tant de haine ?
    parce queuuuuuu !!!
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    Perso, j'utiliserais find -type d -printf avec le format idoine, puis sort et je ne garderais que la ligne extrême.

    Mais il fait trop chaud pour tester.

  8. #8
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    je plaide pour une solution un peu similaire à celle de disedorgue à base de ls , avec find ça tourne vite au vaudou en fait, entre l'exclusion du répertoire courant, des répertoires cachés, la sortie qu'il faut formater avec des \x22 (guillemets) pour ensuite récupérer le nom correct avec ses espaces éventuels, trier le tout etc.
    finalement avec un coup de ls et les options -1td la sortie est consistente, et pour restreindre aux répertoires, on applique sur */ (merci le globbing)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    zip -r archive.zip "$(ls -1td */ | head -1)"
    donc wrappé dans une commande ssh il faudra échapper les guillemets du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh user@machine "zip -r archive.zip \"$(ls -1td */ | head -1)\""
    Edit: avec find j'ai pas trouvé mieux que ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     zip -r archive.zip "$(find . -maxdepth 1 -type d ! -path . ! -name \".*\" -exec stat --printf='%Y\t\x22%n\x22\n' {} \+ | sort -rnk1 | awk -F'\x22' '{print $2; exit}')"
    ce qui une fois enroulé dans la commande ssh deviendra probablement imbitable à cause des doubles échappements, sans compter qu'il faudra échapper le $2 également

    Edit2: pour le fun une version Perl : perl -e 'print +(sort { (stat($b))[9] <=> (stat($a))[9] } (<*/>))[0]'

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 663
    Par défaut
    pour éviter d'échapper les guillemets, on pourrait utiliser un heredoc, ou encadrer la ligne de commandes devant être exécutée via ssh entre apostrophes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh host 'zip -r archive.zip "$(find . -maxdepth 1 -type d ! -path . ! -name ".*" -exec stat --printf="%Y\t\x22%n\x22\n" {} \+ | sort -rnk1 | awk -F"\x22" "{print \$2; exit}")"'
    les guillemets (à l'intérieur de la substitution de commandes) n'ont pas à être échappés.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 354
    Par défaut
    Je ne vois pas l'intéret de la commande stat couplé avec le find qui a aussi une fonction printf...

  11. #11
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Je ne vois pas l'intéret de la commande stat couplé avec le find qui a aussi une fonction printf...
    l'option -printf de find ne permettait pas de passer une notation type \x22, du coup ça devenait difficile de conserver le nom du fichier s'il contenait des espaces, mais maintenant que j'y pense en découpant sur la tabulation avec awk -F\t y'avait surement moyen de s'en sortir quand même, je devais avoir tête dans le guidon sur le moment

    Edit: ce truc là fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh use@machine 'zip -r archive.zip "$(find . -maxdepth 1 -type d ! -path . ! -name ".*" -printf "%C@\t%p\n" | sort -rnk1 | awk -F"\t" "{print \$2; exit}")"'
    il a quand même fallu échapper le $2 dans le awk

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 354
    Par défaut
    Mouais,

    Donc, l'option -Q de ls, fait le boulot, non ?

  13. #13
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Donc, l'option -Q de ls, fait le boulot, non ?
    yep, je suis parti là dessus aussi au départ, jusqu'à ce que je me rabatte sur le set d'options -1td + globbing qui permet de se passer du awk et de quelques guillemets

  14. #14
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 354
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 354
    Par défaut
    On peut aussi le faire rien qu'en bash:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    j="";for i in */ ; do [ "$i" -nt "$j" ] && j="$i" ; done ; echo $j

  15. #15
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par blueice Voir le message
    Mon but serait de faire une connexion SSH, d'aller dans le dossier des sauvegardes, de zipper le dernier dossier en date puis de le télécharger
    le coup de zip + télécharger on peut faire ça de manière astucieuse aussi, un joli "zip-pipe" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ssh user@machine 'zip -r - "..."' > archive.zip

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/04/2015, 15h46
  2. Réponses: 1
    Dernier message: 10/12/2012, 11h09
  3. Réponses: 11
    Dernier message: 10/03/2007, 02h01
  4. Réponses: 1
    Dernier message: 20/01/2007, 14h06
  5. Réponses: 4
    Dernier message: 16/02/2006, 10h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo