Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/04/2024, à 16:29

kaleo

[résolu] extraire une chaîne variable dans une ligne

Bonjour

Dans un fichier je cherche à extraire un extrait d'une ligne.

Ce morceaux de texte varie d'une ligne à l'autre.

Comment récupérer dans un autre fichier ces extraits de texte qui varient d'une ligne à l'autre ?

Ce script, nommé test.sh, ne fonctionne pas :

#!/bin/bash

# Chemin vers le fichier d'entrée
input_file="description.txt"

# Chemin vers le fichier de sortie
output_file="lignes_extraites.txt"

# Motifs à rechercher
start_pattern="<br>Hostgroups:"
end_pattern="<br>Host IP:"

# Extraction des lignes entre les motifs
sed -n "/$start_pattern/,/$end_pattern/p" "$input_file" > "$output_file"

echo "Les lignes ont été extraites dans $output_file."


Merci d'avance ;0)

Dernière modification par kaleo (Le 02/05/2024, à 12:41)

Hors ligne

#2 Le 26/04/2024, à 16:46

Vobul

Re : [résolu] extraire une chaîne variable dans une ligne

Pourquoi ne pas partager un cas reproductible minimal avec le fichier d'entrée, ta commande qui ne fonctionne pas, ce que tu obtiens, et ce que tu souhaites obtenir ?

Là c'est quand même très spécial de dire "je veux faire ça, voici ce qui ne fonctionne pas, à vous de deviner ce que contient l'input".


Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM

Hors ligne

#3 Le 26/04/2024, à 16:49

xubu1957

Re : [résolu] extraire une chaîne variable dans une ligne

Bonjour,

Pour ajouter toi-même les balises code à ton précédent message #1 :          Merci        wink

  • Cliquer sur le lien « Modifier » en bas à droite du message

  • Sélectionner le texte

  • Cliquer sur le <> de l'éditeur de message

Balisesmoko138.jpg

comme indiqué dans le : Retour utilisable de commande

Dernière modification par xubu1957 (Le 27/04/2024, à 08:08)


Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [Résolu] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.                   Membre de Linux-Azur

Hors ligne

#4 Le 26/04/2024, à 17:50

Watael

Re : [résolu] extraire une chaîne variable dans une ligne

salut,

1- les chevrons simples sont des caractères spéciaux pour sed; ils ne seront donc pas lus littéralement.
2- on ne trouve plus <br>, mais plutôt <br/>.
3- "ça marche pas" n'est pas très descriptif : c'est comme dire "j'ai mal".


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#5 Le 26/04/2024, à 23:10

kaleo

Re : [résolu] extraire une chaîne variable dans une ligne

Merci pour votre attention smile

Je vais essayer d'être plus clair.

Un cas reproductible minimal :

ping: COCO_SKO_KDQLHDC1DCD01_SDF6T546-3V65-8F48-B8C5-S5DCZ05Q6GH3 is unavailable by ICMP<br>Real Name: HLL9V687-3V65-8F48-B8C5-S5DCZ05Q6GH3<br>SMOX Name: COCO_HLL9V687-3V65-8F48-B8C5-S5DCZ05Q6GH3<br>Host name: HLL9V687-3V65-8F48-B8C5-S5DCZ05Q6GH3<br>Host visible name: COCO_SKO_KDQLHDC1DCD01_SDF6T546-3V65-8F48-B8C5-S5DCZ05Q6GH3<br>Hostgroups: COCO/SKO/VM, COCO_MAINTENANCE, COCO/SKO/NONE, COCO/SKO/DEDI<br>Host IP: 12.68.21.56<br>Customer reference: KDQLHDC1DCD01<br>Item name: ICMP ping<br>Item value: 0<br>Date/Time: 2024.01.09 07:54:32<br>Event State: PROBLEM<br>Trigger Severity: 5<br>Trigger name: ping: COCO_SKO_KDQLHDC1DCD01_SDF6T546-3V65-8F48-B8C5-S5DCZ05Q6GH3 is unavailable by ICMP<br><br>Link to alarm:<br>https://zarbiu.o3s.popiatrium.com/COCO-mtys/zarbiu.php?action=problem.view&triggerids[]=340667&filter_set=1<br>Instruction file=NO_PROCEDURE_FOUND
ping: COCO_SKO_PSKOLMD1DSQ01_658DVS56-8R75-76A5-45ND-45FF4154135D is unavailable by ICMP<br>Real Name: 861DFG12-5F13-47B5-13MQ-54BB2457232F<br>SMOX Name: COCO_861DFG12-5F13-47B5-13MQ-54BB2457232F<br>Host name: 861DFG12-5F13-47B5-13MQ-54BB2457232F<br>Host visible name: COCO_SKO_PSKOLMD1DSQ01_658DVS56-8R75-76A5-45ND-45FF4154135D<br>Hostgroups: COCO/SKO/VM, COCO_MAINTENANCE, COCO/SKO/NONE, COCO/SKO/DEDI<br>Host IP: 53.45.36.458<br>Customer reference: PSKODED1EUW01<br>Item name: ICMP ping<br>Item value: 0<br>Date/Time: 2024.01.09 08:04:33<br>Event State: PROBLEM<br>Trigger Severity: 5<br>Trigger name: ping: COCO_SKO_PSKOLMD1DSQ01_658DVS56-8R75-76A5-45ND-45FF4154135D is unavailable by ICMP<br><br>Link to alarm:<br>https://zarbiu.o3s.popiatrium.com/COCO-mtys/zarbiu.php?action=problem.view&triggerids[]=340694&filter_set=1<br>Instruction file=NO_PROCEDURE_FOUND
ping: COCO_SKO_KDQLHDC1DCD01_SDF6T546-3V65-8F48-B8C5-S5DCZ05Q6GH3 is unavailable by ICMP<br>Real Name: HLL9V687-3V65-8F48-B8C5-S5DCZ05Q6GH3<br>SMOX Name: COCO_HLL9V687-3V65-8F48-B8C5-S5DCZ05Q6GH3<br>Host name: HLL9V687-3V65-8F48-B8C5-S5DCZ05Q6GH3<br>Host visible name: COCO_SKO_KDQLHDC1DCD01_SDF6T546-3V65-8F48-B8C5-S5DCZ05Q6GH3<br>Hostgroups: COCO/SKO/VM, COCO/SKO/NONE, COCO/SKO/DEDI<br>Host IP: 12.68.21.56<br>Customer reference: KDQLHDC1DCD01<br>Item name: ICMP ping<br>Item value: 0<br>Date/Time: 2024.01.11 10:24:32<br>Event State: PROBLEM<br>Trigger Severity: 5<br>Trigger name: ping: COCO_SKO_KDQLHDC1DCD01_SDF6T546-3V65-8F48-B8C5-S5DCZ05Q6GH3 is unavailable by ICMP<br><br>Link to alarm:<br>https://zarbiu.o3s.popiatrium.com/COCO-mtys/zarbiu.php?action=problem.view&triggerids[]=340667&filter_set=1<br>Instruction file=NO_PROCEDURE_FOUND
ping: COCO_SKO_PSKOLMD1DSQ01_658DVS56-8R75-76A5-45ND-45FF4154135D is unavailable by ICMP<br>Real Name: 861DFG12-5F13-47B5-13MQ-54BB2457232F<br>SMOX Name: COCO_861DFG12-5F13-47B5-13MQ-54BB2457232F<br>Host name: 861DFG12-5F13-47B5-13MQ-54BB2457232F<br>Host visible name: COCO_SKO_PSKOLMD1DSQ01_658DVS56-8R75-76A5-45ND-45FF4154135D<br>Hostgroups: COCO/SKO/VM, COCO/SKO/NONE, COCO/SKO/DEDI<br>Host IP: 53.45.36.458<br>Customer reference: PSKODED1EUW01<br>Item name: ICMP ping<br>Item value: 0<br>Date/Time: 2024.01.11 10:24:33<br>Event State: PROBLEM<br>Trigger Severity: 5<br>Trigger name: ping: COCO_SKO_PSKOLMD1DSQ01_658DVS56-8R75-76A5-45ND-45FF4154135D is unavailable by ICMP<br><br>Link to alarm:<br>https://zarbiu.o3s.popiatrium.com/COCO-mtys/zarbiu.php?action=problem.view&triggerids[]=340694&filter_set=1<br>Instruction file=NO_PROCEDURE_FOUND
ping: kfughdfv32i is unavailable by ICMP [Address : 165.15.247.3] [Inst]admin[Inst]<br>Real Name: kfughdfv32i<br>SMOX Name: COCO_kfughdfv32i<br>Host name: kfughdfv32i<br>Host visible name: kfughdfv32i<br>Hostgroups: 00-PERMANENT, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 7 24<br>Host IP: 165.15.247.3<br>Customer reference: <br>Item name: ICMP ping [Default IP Address]<br>Item value: 0<br>Date/Time: 2024.01.15 11:51:36<br>Event State: PROBLEM<br>Trigger Severity: 5<br>Trigger name: ping: kfughdfv32i is unavailable by ICMP [Address : 165.15.247.3] [Inst]admin[Inst]<br><br>Link to alarm:<br>https://zarbiu.o3s.popiatrium.com/COCO-mols/zarbiu.php?action=problem.view&triggerids[]=335446&filter_set=1<br>Instruction file=FAR-COCO-SYSTEM_LINUX
ping: lmdfvncjf36a is unavailable by ICMP [Address : 172.18.253.2] [Inst]admin[Inst]<br>Real Name: lmdfvncjf36a<br>SMOX Name: COCO_lmdfvncjf36a<br>Host name: lmdfvncjf36a<br>Host visible name: lmdfvncjf36a<br>Hostgroups: 00-NORMAL, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 5 12<br>Host IP: 172.18.253.2<br>Customer reference: <br>Item name: ICMP ping [Default IP Address]<br>Item value: 0<br>Date/Time: 2024.01.15 11:50:31<br>Event State: PROBLEM<br>Trigger Severity: 5<br>Trigger name: ping: lmdfvncjf36a is unavailable by ICMP [Address : 172.18.253.2] [Inst]admin[Inst]<br><br>Link to alarm:<br>https://zarbiu.o3s.popiatrium.com/COCO-mols/zarbiu.php?action=problem.view&triggerids[]=335518&filter_set=1<br>Instruction file=FAR-COCO-SYSTEM_LINUX
ping: keoinfsgf02p is unavailable by ICMP [Address : 175.25.251.3] [Inst]admin[Inst]<br>Real Name: KEOINFSGF02P<br>SMOX Name: COCO_KEOINFSGF02P<br>Host name: keoinfsgf02p<br>Host visible name: keoinfsgf02p<br>Hostgroups: 00-PERMANENT, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 7 24<br>Host IP: 175.25.251.3<br>Customer reference: <br>Item name: ICMP ping [Default IP Address]<br>Item value: 0<br>Date/Time: 2024.01.15 11:51:36<br>Event State: PROBLEM<br>Trigger Severity: 5<br>Trigger name: ping: keoinfsgf02p is unavailable by ICMP [Address : 175.25.251.3] [Inst]admin[Inst]<br><br>Link to alarm:<br>https://zarbiu.o3s.popiatrium.com/COCO-mols/zarbiu.php?action=problem.view&triggerids[]=335446&filter_set=1<br>Instruction file=FAR-COCO-SYSTEM_LINUX
ping: hdfgdfgx84p is unavailable by ICMP [Address : 172.18.253.2] [Inst]admin[Inst]<br>Real Name: DFHDFVDH87P<br>SMOX Name: COCO_DFHDFVDH87P<br>Host name: hdfgdfgx84p<br>Host visible name: hdfgdfgx84p<br>Hostgroups: 00-NORMAL, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 5 12<br>Host IP: 172.18.253.2<br>Customer reference: <br>Item name: ICMP ping [Default IP Address]<br>Item value: 0<br>Date/Time: 2024.01.15 11:50:31<br>Event State: PROBLEM<br>Trigger Severity: 5<br>Trigger name: ping: hdfgdfgx84p is unavailable by ICMP [Address : 172.18.253.2] [Inst]admin[Inst]<br><br>Link to alarm:<br>https://zarbiu.o3s.popiatrium.com/COCO-mols/zarbiu.php?action=problem.view&triggerids[]=335518&filter_set=1<br>Instruction file=FAR-COCO-SYSTEM_LINUX
ping: fgdfgbbb58p is unavailable by ICMP [Address : 171.84.151.22] [Inst]admin[Inst]<br>Real Name: SDSHFCJPS78P<br>SMOX Name: COCO_SDSHFCJPS78P<br>Host name: fgdfgbbb58p<br>Host visible name: fgdfgbbb58p<br>Hostgroups: 00-NORMAL, 02-PXY-INT, 06-WINCARB_WINATEL, 01-COCO, 05-WINDOWS, 04-RUN, 06-CITRIX, 00-ADM SERV 5 12<br>Host IP: 171.84.151.22<br>Customer reference: <br>Item name: ICMP ping [Default IP Address]<br>Item value: 0<br>Date/Time: 2024.01.16 12:41:46<br>Event State: PROBLEM<br>Trigger Severity: 5<br>Trigger name: ping: fgdfgbbb58p is unavailable by ICMP [Address : 171.84.151.22] [Inst]admin[Inst]<br><br>Link to alarm:<br>https://zarbiu.o3s.popiatrium.com/COCO-mols/zarbiu.php?action=problem.view&triggerids[]=353572&filter_set=1<br>Instruction file=FAR-COCO-SYSTEM_WINTEL

La commande qui ne fonctionne pas (test.sh est le script cité dans le premier message) :

$ ./test.sh
Les lignes ont été extraites dans lignes_extraites.txt.
$ 

J'obtiens dans le fichier cible " lignes_extraites.txt " un texte identique au fichier source " description.txt "

J'aimerais ne garder dans le fichier cible que ce qui se trouve entre " <br>Hostgroups: " et " <br>Host IP: "

<br>Hostgroups: 00-NORMAL, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 5 12<br>Host IP:

Dernière modification par kaleo (Le 26/04/2024, à 23:22)

Hors ligne

#6 Le 26/04/2024, à 23:22

kamaris

Re : [résolu] extraire une chaîne variable dans une ligne

sed -En 's/.*<br>Hostgroups:(.*)<br>Host IP:.*/\1/p' fichier

Hors ligne

#7 Le 26/04/2024, à 23:22

Vobul

Re : [résolu] extraire une chaîne variable dans une ligne

sed -n 's/.*<br>Hostgroups: \(.*\)<br>Host IP:.*/\1/p' fichier

semble correctement fonctionner. Output :

COCO/SKO/VM, COCO_MAINTENANCE, COCO/SKO/NONE, COCO/SKO/DEDI
COCO/SKO/VM, COCO_MAINTENANCE, COCO/SKO/NONE, COCO/SKO/DEDI
COCO/SKO/VM, COCO/SKO/NONE, COCO/SKO/DEDI
COCO/SKO/VM, COCO/SKO/NONE, COCO/SKO/DEDI
00-PERMANENT, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 7 24
00-NORMAL, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 5 12
00-PERMANENT, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 7 24
00-NORMAL, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 5 12
00-NORMAL, 02-PXY-INT, 06-WINCARB_WINATEL, 01-COCO, 05-WINDOWS, 04-RUN, 06-CITRIX, 00-ADM SERV 5 12

edit: ah bah pareil que kamaris smile

Dernière modification par Vobul (Le 26/04/2024, à 23:23)


Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM

Hors ligne

#8 Le 26/04/2024, à 23:26

kaleo

Re : [résolu] extraire une chaîne variable dans une ligne

La commande fonctionne merci smile

$ sed -En 's/.*<br>Hostgroups:(.*)<br>Host IP:.*/\1/p' description.txt
 COCO/SKO/VM, COCO_MAINTENANCE, COCO/SKO/NONE, COCO/SKO/DEDI
 COCO/SKO/VM, COCO_MAINTENANCE, COCO/SKO/NONE, COCO/SKO/DEDI
 COCO/SKO/VM, COCO/SKO/NONE, COCO/SKO/DEDI
 COCO/SKO/VM, COCO/SKO/NONE, COCO/SKO/DEDI
 00-PERMANENT, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 7 24
 00-NORMAL, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 5 12
 00-PERMANENT, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 7 24
 00-NORMAL, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 5 12
 00-NORMAL, 02-PXY-INT, 06-WINCARB_WINATEL, 01-COCO, 05-WINDOWS, 04-RUN, 06-CITRIX, 00-ADM SERV 5 12
$

Hors ligne

#9 Le 26/04/2024, à 23:26

Watael

Re : [résolu] extraire une chaîne variable dans une ligne

je vais aller un peu plus loin, parce que je suppose qu'il y a des choses dont tu n'as pas besoin dans la sortie souhaitée que tu présentes :

$ sed -n '/Hostgroups/s/.*Hostgroups: \([^\<]*\).*/\1/p' /tmp/exemple.txt                                                                                                                                         
COCO/SKO/VM, COCO_MAINTENANCE, COCO/SKO/NONE, COCO/SKO/DEDI                                                                                                                                                                                    
COCO/SKO/VM, COCO_MAINTENANCE, COCO/SKO/NONE, COCO/SKO/DEDI                                                                                                                                                                                    
COCO/SKO/VM, COCO/SKO/NONE, COCO/SKO/DEDI                                                                                                                                                                                                      
COCO/SKO/VM, COCO/SKO/NONE, COCO/SKO/DEDI                                                                                                                                                                                                      
00-PERMANENT, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 7 24                                                                                                                                                          
00-NORMAL, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 5 12                                                                                                                                                             
00-PERMANENT, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 7 24                                                                                                                                                          
00-NORMAL, 02-PXY-DMZ, 05-LINUX, 06-SITE GROUPE, 01-COCO, 04-RUN, 00-ADM SERV 5 12                                                                                                                                                             
00-NORMAL, 02-PXY-INT, 06-WINCARB_WINATEL, 01-COCO, 05-WINDOWS, 04-RUN, 06-CITRIX, 00-ADM SERV 5 12

pour info, dans le code de ton premier message, tu demandes d'afficher un intervalle sur plusieurs lignes.
par exemple entre c et f inclus :

$ printf '%s\n' {a..g}
a
b
s
d
e
f
g
$ printf '%s\n' {a..g} | sed -n '/c/,/f/p'                                                                                                                                                                        
c                                                                                                                                                                                                                                              
d                                                                                                                                                                                                                                              
e                                                                                                                                                                                                                                              
f

Dernière modification par Watael (Le 26/04/2024, à 23:27)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#10 Le 26/04/2024, à 23:37

kamaris

Re : [résolu] extraire une chaîne variable dans une ligne

sed -En 's/.*<br>Hostgroups:.*05-([^,]*),.*<br>Host IP:.*/\1/p' fichier

Bah, y'a plus la question sad (ah si, mais maintenant elle est en dessous tongue )

Dernière modification par kamaris (Le 26/04/2024, à 23:41)

Hors ligne

#11 Le 26/04/2024, à 23:38

kaleo

Re : [résolu] extraire une chaîne variable dans une ligne

Effectivement mon approche est incorrecte.

J'ai besoin d'extraire uniquement la fin du mot " 05-MOT, " ; ce que j'ai nommé MOT

exemple :
pour " 05-WINDOWS, " je voudrais uniquement obtenir WINDOWS
pour " 05-LINUX, "  je voudrais uniquement obtenir LINUX

Après "05-" et avant la " , " il peut exister autre chose que WINDOWS et LINUX

Dernière modification par kaleo (Le 26/04/2024, à 23:40)

Hors ligne

#12 Le 26/04/2024, à 23:42

kaleo

Re : [résolu] extraire une chaîne variable dans une ligne

La commande fonctionne smile

J'ai remis la question

Merci

$ sed -En 's/.*<br>Hostgroups:.*05-([^,]*),.*<br>Host IP:.*/\1/p' description.txt
LINUX
LINUX
LINUX
LINUX
WINDOWS
$

Dernière modification par kaleo (Le 26/04/2024, à 23:43)

Hors ligne

#13 Le 26/04/2024, à 23:55

kaleo

Re : [résolu] extraire une chaîne variable dans une ligne

Maintenant qu'on a ce résultat j'aimerais extraire un deuxième mot entre "Host visible name:" et "<br>Hostgroups"

exemple : pour <br>Host visible name: kfughdfv32i<br>Hostgroups: on ne garde que kfughdfv32i

Dans certains cas ce mot peut ressembler à : COCO_SKO_KDQLHDC1DCD01_SDF6T546-3V65-8F48-B8C5-S5DCZ05Q6GH3

Il ne faut garder que KDQLHDC1DCD01

Puis mettre ce deuxième mot en majuscule

exemple : mettre kfughdfv32i en majuscule
KDQLHDC1DCD01 est déjà en majuscule

Enfin mettre le premier mot MOT (Linux, WINDOWS ou autre mot à droite de -05) à droite du deuxième mot correspondant dans un fichier

exemple :

FGDFGBBB58P WINDOWS

HDFGDFGX84P LINUX

Les questions de compréhension viendront après wink

Dernière modification par kaleo (Le 27/04/2024, à 00:12)

Hors ligne

#14 Le 27/04/2024, à 00:09

kamaris

Re : [résolu] extraire une chaîne variable dans une ligne

Ta demande évolue trop, il faut découper en plusieurs fils de discussion.
Celui-ci est résolu, et ta question ci-dessus pour extraire KDQLHDC1DCD01 n'en est qu'une variante, ou un exercice d'application.
Le reste devrait faire l'objet d'au moins un autre fil.

Hors ligne

#15 Le 27/04/2024, à 00:16

kaleo

Re : [résolu] extraire une chaîne variable dans une ligne

D'accord smile

Je poserai dans cette discussion ce qui est obscur pour moi dans les commandes écrites plus haut

Je vais me coucher.

merci encore smile

Bonne nuit:)

Hors ligne

#16 Le 27/04/2024, à 02:43

Vobul

Re : [résolu] extraire une chaîne variable dans une ligne

#!/bin/bash

# Chemin vers le fichier d'entrée
input_file="description.txt"

# Chemin vers le fichier de sortie
output_file="resultats_finale.txt"

# Traitement avec awk
awk -F'<br>' '{
    for (i = 1; i <= NF; i++) {
        if ($i ~ /Host visible name:/) {
            split($i, parts, ": ");
            name = parts[2];
            sub(/_.*$/, "", name);
            name = toupper(name);
        }
        if ($i ~ /Hostgroups/) {
            split($i, groups, "-05");
            split(groups[2], words, ",");
            sub(/^ */, "", words[1]);
            gsub(/ .*$/, "", words[1]);
            print name " " words[1];
        }
    }
}' "$input_file" > "$output_file"

echo "Les résultats ont été sauvegardés dans $output_file."

vive chatgpt...


Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM

Hors ligne

#17 Le 27/04/2024, à 03:56

Watael

Re : [résolu] extraire une chaîne variable dans une ligne

si chatgpt était si doué, il aurait fait un script (g)awk !


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#18 Le 27/04/2024, à 18:20

Vobul

Re : [résolu] extraire une chaîne variable dans une ligne

moi : maintenant fait un script gawk

chatgpt:

#!/bin/bash

# Chemin vers le fichier d'entrée
input_file="description.txt"

# Chemin vers le fichier de sortie
output_file="resultats_finale.txt"

# Script gawk pour traiter le fichier
gawk -F'<br>' '
function extract_visible_name(field) {
    match(field, /Host visible name: ([^<]+)/, arr);
    name = arr[1];
    # Pour les noms longs, extraire seulement la partie centrale si elle existe
    if (name ~ /_.*_/) {
        split(name, parts, "_");
        name = parts[3];
    }
    return toupper(name);
}

function extract_group_part(field) {
    match(field, /Hostgroups:.*-05([^,]+)/, arr);
    sub(/^ /, "", arr[1]); # Supprimer les espaces en début
    sub(/ .*$/, "", arr[1]); # Supprimer les éléments après l'espace
    return arr[1];
}

{
    for (i = 1; i <= NF; i++) {
        if ($i ~ /Host visible name:/) {
            name = extract_visible_name($i);
        }
        if ($i ~ /Hostgroups:/) {
            group_part = extract_group_part($i);
        }
    }
    print name " " group_part > "'$output_file'"
}
' "$input_file"

echo "Les résultats ont été sauvegardés dans $output_file."

@Watael: faut pas le sous-estimer, il peut vraiment faire à peu près tout ce que tu lui demandes avec 95% de chances que ce soit correct sans avoir à modifier deux trois chtouilles. Ça fait gagner un temps de dingue...


Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM

Hors ligne

#19 Le 27/04/2024, à 20:45

Watael

Re : [résolu] extraire une chaîne variable dans une ligne

ce n'est toujours pas un script (g)awk.


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#20 Le 27/04/2024, à 21:10

Vobul

Re : [résolu] extraire une chaîne variable dans une ligne

moi: "fais vraiment un script gawk, pas bash"

chatgpt:

#!/usr/bin/gawk -f

BEGIN {
    FS="<br>"; # Définit le séparateur de champs
}

function extract_visible_name(field) {
    match(field, /Host visible name: ([^<]+)/, arr);
    name = arr[1];
    # Pour les noms longs, extraire seulement la partie centrale si elle existe
    if (name ~ /_.*_/) {
        split(name, parts, "_");
        name = parts[3];
    }
    return toupper(name);
}

function extract_group_part(field) {
    match(field, /Hostgroups:.*-05([^,]+)/, arr);
    sub(/^ /, "", arr[1]); # Supprimer les espaces en début
    sub(/ .*$/, "", arr[1]); # Supprimer les éléments après l'espace
    return arr[1];
}

{
    for (i = 1; i <= NF; i++) {
        if ($i ~ /Host visible name:/) {
            name = extract_visible_name($i);
        }
        if ($i ~ /Hostgroups:/) {
            group_part = extract_group_part($i);
        }
    }
    print name " " group_part;
}

Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM

Hors ligne

#21 Le 27/04/2024, à 21:22

Watael

Re : [résolu] extraire une chaîne variable dans une ligne

il y a encore  la redirection à faire en shell. hmm
il y a encore  des  progrès  à faire. wink
big_smile

Dernière modification par Watael (Le 27/04/2024, à 21:22)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#22 Le 27/04/2024, à 21:37

Vobul

Re : [résolu] extraire une chaîne variable dans une ligne

roooh tu pinailles !!


Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM

Hors ligne

#23 Le 28/04/2024, à 14:55

kaleo

Re : [résolu] extraire une chaîne variable dans une ligne

Bonjour, smile

- Dans les commandes précédentes je ne comprends pas la différence entre sed -En et sed -n.

sed -En 's/.*<br>Hostgroups:(.*)<br>Host IP:.*/\1/p' description.txt
sed -En 's/.*<br>Hostgroups:.*05-([^,]*),.*<br>Host IP:.*/\1/p' fichier
sed -n '/Hostgroups/s/.*Hostgroups: \([^\<]*\).*/\1/p' /tmp/exemple.txt

On dirait deux approches différentes pour traiter les caractères particuliers, comme ( <

- Je ne comprends pas :

([^,]*)
\([^\<]*\)

( ou \( et ) ou \) encadrent le motif nommé \1 plus loin dans la commande
[ et ] servent à encadrer une chaîne entre ^ et , entre ^ et < ?
^ correspond à un début de ligne en général ?
*  correspond à tous les caractères dans [ ]  entre ^ et , ou < ?

ps :
-Le script écrit dans mon premier message est produit par chat...g.p.t
- Merci pour

printf '%s\n' {a..g}
printf '%s\n' {a..g} | sed -n '/c/,/f/p' 

Cela m'a aidé à comprendre

Dernière modification par kaleo (Le 28/04/2024, à 15:08)

Hors ligne

#24 Le 30/04/2024, à 01:12

pensus

Re : [résolu] extraire une chaîne variable dans une ligne

kaleo a écrit :

Bonjour, smile

- Dans les commandes précédentes je ne comprends pas la différence entre sed -En et sed -n.

sed -En 's/.*<br>Hostgroups:(.*)<br>Host IP:.*/\1/p' description.txt
sed -En 's/.*<br>Hostgroups:.*05-([^,]*),.*<br>Host IP:.*/\1/p' fichier
sed -n '/Hostgroups/s/.*Hostgroups: \([^\<]*\).*/\1/p' /tmp/exemple.txt

On dirait deux approches différentes pour traiter les caractères particuliers, comme ( <

- Je ne comprends pas :

([^,]*)
\([^\<]*\)

( ou \( et ) ou \) encadrent le motif nommé \1 plus loin dans la commande
[ et ] servent à encadrer une chaîne entre ^ et , entre ^ et < ?
^ correspond à un début de ligne en général ?
*  correspond à tous les caractères dans [ ]  entre ^ et , ou < ?

ps :
-Le script écrit dans mon premier message est produit par chat...g.p.t
- Merci pour

printf '%s\n' {a..g}
printf '%s\n' {a..g} | sed -n '/c/,/f/p' 

Cela m'a aidé à comprendre

Bonjour,

Le fais de rajouter l'option 'E' à la commande sed te permet l'utilisation d'expressions régulières étendues, contrairement aux regex simple qui la plupart du temps se limite à l'utilisation de classes de caractères.
En autre cela te permet d'utiliser des groupes de capture avec "()" sans à avoir à les échapper pour que le shell ne les interprète pas.

Par ailleurs chatgpt est un très bon outil pour générer des commandes et autres, mais tu peux également lui demander de t'expliquer en détail la réponse qu'il te fournit, et en jouant avec le prompt tu peux même lui demander une explication en fonction de ton niveau de compréhension du sujet smile

Cdt smile

Hors ligne

#25 Le 30/04/2024, à 03:25

Watael

Re : [résolu] extraire une chaîne variable dans une ligne

Vobul a écrit :

roooh tu pinailles !!

c'est chatgpt qui te l'a dit ?

lol


Connected \o/
Welcome to sHell. · eval is evil.

En ligne