#1 Le 26/04/2024, à 15: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 11/05/2024, à 12:13)
Hors ligne
#2 Le 26/04/2024, à 15: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
En ligne
#3 Le 26/04/2024, à 15: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
Cliquer sur le lien « Modifier » en bas à droite du message
Sélectionner le texte
Cliquer sur le <> de l'éditeur de message
comme indiqué dans le : Retour utilisable de commande
Dernière modification par xubu1957 (Le 27/04/2024, à 07:08)
Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [Réso|u] 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
En ligne
#4 Le 26/04/2024, à 16: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.
Hors ligne
#5 Le 26/04/2024, à 22:10
- kaleo
Re : [Résolu] extraire une chaîne variable dans une ligne
Merci pour votre attention
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, à 22:22)
Hors ligne
#6 Le 26/04/2024, à 22: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, à 22: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
Dernière modification par Vobul (Le 26/04/2024, à 22:23)
Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM
En ligne
#8 Le 26/04/2024, à 22:26
- kaleo
Re : [Résolu] extraire une chaîne variable dans une ligne
La commande fonctionne merci
$ 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, à 22: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, à 22:27)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#10 Le 26/04/2024, à 22: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 (ah si, mais maintenant elle est en dessous )
Dernière modification par kamaris (Le 26/04/2024, à 22:41)
Hors ligne
#11 Le 26/04/2024, à 22: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, à 22:40)
Hors ligne
#12 Le 26/04/2024, à 22:42
- kaleo
Re : [Résolu] extraire une chaîne variable dans une ligne
La commande fonctionne
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, à 22:43)
Hors ligne
#13 Le 26/04/2024, à 22: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
Dernière modification par kaleo (Le 26/04/2024, à 23:12)
Hors ligne
#14 Le 26/04/2024, à 23: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 26/04/2024, à 23:16
- kaleo
Re : [Résolu] extraire une chaîne variable dans une ligne
D'accord
Je poserai dans cette discussion ce qui est obscur pour moi dans les commandes écrites plus haut
Je vais me coucher.
merci encore
Bonne nuit:)
Hors ligne
#16 Le 27/04/2024, à 01: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
En ligne
#17 Le 27/04/2024, à 02: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.
Hors ligne
#18 Le 27/04/2024, à 17: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
En ligne
#19 Le 27/04/2024, à 19: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.
Hors ligne
#20 Le 27/04/2024, à 20: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
En ligne
#21 Le 27/04/2024, à 20:22
- Watael
Re : [Résolu] extraire une chaîne variable dans une ligne
il y a encore la redirection à faire en shell.
il y a encore des progrès à faire.
Dernière modification par Watael (Le 27/04/2024, à 20:22)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#22 Le 27/04/2024, à 20: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
En ligne
#23 Le 28/04/2024, à 13:55
- kaleo
Re : [Résolu] extraire une chaîne variable dans une ligne
Bonjour,
- 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, à 14:08)
Hors ligne
#24 Le 30/04/2024, à 00:12
- pensus
Re : [Résolu] extraire une chaîne variable dans une ligne
Bonjour,
- 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 pourprintf '%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
Cdt
Hors ligne
#25 Le 30/04/2024, à 02:25
- Watael
Re : [Résolu] extraire une chaîne variable dans une ligne
roooh tu pinailles !!
c'est chatgpt qui te l'a dit ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne