#1 Le 25/04/2012, à 21:32
Extraire une chaine variable d'un fichier (sed, awk, grep...)
Bonjour à tous,
Voila mon problème, j’essaye d’extraire une chaine de caractère d’un fichier à l’aide de la commande sed afin de la mettre dans une variable.
Voici le fichier duquel je souhaite extraire des données :
root@backup:~# cat /mnt/backups/backuppc/pc/MACHINE/0/backupInfo
%backupInfo = (
'noFill' => 0,
'nFilesNew' => '9',
'num' => '0',
'size' => '1823652153',
'endTime' => '1333377100',
'fillFromNum' => undef,
'xferErrs' => '0',
'xferMethod' => 'rsync',
'startTime' => '1333375701',
'sizeNewComp' => '194150',
'mangle' => '1',
'version' => '3.1.0',
'nFilesExist' => 11928,
'charset' => '',
'tarErrs' => '0',
'xferBadShare' => '0',
'sizeExist' => 1823777714,
'level' => '0',
'nFiles' => '10466',
'compress' => '3',
'sizeExistComp' => 1702188716,
'type' => 'full',
'xferBadFile' => '0',
'sizeNew' => '194911'
);(Certains aurons reconnus BackupPC xD)
Je souhaiterais par exemple récupérer le résultat entre quote de la ligne xferErrs c’est-à-dire 0 et insérer ce résultat dans une variable.
Les instructions sont amenées à changer, c’est-à-dire que je ne récupèrerais pas forcement toujours un 0 d’où la difficulté.
Je ne souhaite pas faire cette opération uniquement pour cette ligne, donc si une âme charitable pourrais m’expliquer la ligne de code pondue ça m’aiderais beaucoup ^^
Je suis bien sur ouvert à toute autre proposition comme awk et autres grep...
Merci de votre aide.
Dernière modification par Mr.inco (Le 27/04/2012, à 11:53)
Vieux geek, en école d'info, spé systèmes et réseaux...
Hors ligne
#2 Le 25/04/2012, à 21:46
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
Bonsoir,
par exemple :
VALEUR=`cat backupInfo | grep "xferErrs" | cut -d ">" -f 2 | cut -d "'" -f 2`peut-être pas très esthétique ...
Linux à Contrexéville ?
http://leclug.free.fr/forum/
Hors ligne
#3 Le 25/04/2012, à 21:49
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
grep xferErrs /mnt/backups/backuppc/pc/MACHINE/0/backupInfo | cut -d"'" -f4Donc en Shell :
variable=`grep xferErrs /mnt/backups/backuppc/pc/MACHINE/0/backupInfo | cut -d"'" -f4`Ou
variable=$(grep xferErrs /mnt/backups/backuppc/pc/MACHINE/0/backupInfo | cut -d"'" -f4)Selon ce qui arrange
Dernière modification par Spitfire 95 (Le 25/04/2012, à 21:50)
Trisquel GNU/Linux 6.0.
Fedora rawhide (déblobé)
Membre déserteur et traître de la brigade des S.
Hors ligne
#4 Le 25/04/2012, à 21:51
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
bien vu le découpage par ' ... +1 ![]()
Linux à Contrexéville ?
http://leclug.free.fr/forum/
Hors ligne
#5 Le 25/04/2012, à 22:01
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
Merci de vos réponses, j'ai testé et en effet ça marche du feu de dieu ^^ Et moi qui me cassait la tête sur du sed...
Vieux geek, en école d'info, spé systèmes et réseaux...
Hors ligne
#6 Le 25/04/2012, à 22:10
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
Merci de vos réponses, j'ai testé et en effet ça marche du feu de dieu ^^ Et moi qui me cassait la tête sur du sed...
Sed c'est pour les maso ^^
Trisquel GNU/Linux 6.0.
Fedora rawhide (déblobé)
Membre déserteur et traître de la brigade des S.
Hors ligne
#7 Le 25/04/2012, à 22:21
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
Bonsoir,
C'est aussi possible avec sed (maso ou pas…) :
variable=$(sed -rn "s/^\s*'xferErrs'\s*=>\s*'(.*)'.*$/\1/p" fichier)Hors ligne
#8 Le 25/04/2012, à 22:35
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
Marche aussi très très bien! ^^
Maintenant que la partie pratique est résolue (Merci à vous), passons à la partie optimisation du code, parmi les commandes que vous avez postés laquelle pourrait être la mieux optimisée?
Vieux geek, en école d'info, spé systèmes et réseaux...
Hors ligne
#9 Le 25/04/2012, à 22:42
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
Optimisée, je ne sais pas, mais la plus lisible est pour moi la 3ème de Spitfire 95 #3.
Ajouté : Voici l'équivalent avec awk
variable=$(awk -v FS="'" "/'xferErrs'/{print \$4}" fichier)ou bien
variable=$(awk -v FS="'" '($2=="xferErrs"){print $4}' fichier)Dernière modification par pingouinux (Le 26/04/2012, à 06:21)
Hors ligne
#10 Le 26/04/2012, à 00:36
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
Moi j'aurais fait :
sed -n "/xferErrs/ s/..*=> '\(.*\)'.*/\1/p" /mnt/backups/backuppc/pc/MACHINE/0/backupInfoSed n'est pas franchement compliqué.
Si on peut eviter des pipes...
Si tu veux recuperer toutes les valeurs :
# Suppression des textes inutiles
valeurs=$(sed -n "/^ '/ s/,$// ; s/ '// ; s/'// ; s/ => /=/p"/mnt/backups/backuppc/pc/MACHINE/0/backupInfo)
# Pour te montrer ce que je conserve
echo "${valeurs}"
noFill=0
nFilesNew='9'
num='0'
size='1823652153'
endTime='1333377100'
fillFromNum=undef
xferErrs='0'
xferMethod='rsync'
startTime='1333375701'
sizeNewComp='194150'
mangle='1'
version='3.1.0'
nFilesExist=11928
charset=''
tarErrs='0'
xferBadShare='0'
sizeExist=1823777714
level='0'
nFiles='10466'
compress='3'
sizeExistComp=1702188716
type='full'
xferBadFile='0'
sizeNew='194911'
# J'evalue ce que j'ai conservé
eval "${valeurs}"
# Et maintenant j'ai toutes les variables et leurs valeurs, la preuve
echo "xferErrs vaut ${xferErrs}"
xferErrs vaut 0Kubuntu v64 13.04 -- ATI HD4850
Générateur de fenêtres Zenity -- GUI d'extraction de piste de fichier mkv -- Generateur de code de screencast
Hors ligne
#11 Le 26/04/2012, à 08:59
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
C'est aussi de bonnes solutions, en tout cas j'ai pu résoudre mon problème ^^
Merci à tous, en espérant que ça en aidera d'autres ![]()
Vieux geek, en école d'info, spé systèmes et réseaux...
Hors ligne
#12 Le 26/04/2012, à 09:52
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
Attention : Un certain nombre des propositions ci-dessus ne fonctionnent pas dans les cas où la valeur du paramètre n'est pas encadrée de ' ', comme
'sizeExist' => 1823777714,Hors ligne
#13 Le 26/04/2012, à 10:10
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
Voila la solution pour ce problème :
variable=$(sed -rn "s/^\s*'sizeExist'\s*=>\s*(.*),$/\1/p" fichier)Ce qui nous donne donc :
1823777714Vieux geek, en école d'info, spé systèmes et réseaux...
Hors ligne
#14 Le 26/04/2012, à 17:44
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
ma soluce avec eval fonctionne dans ce genre de cas ![]()
Kubuntu v64 13.04 -- ATI HD4850
Générateur de fenêtres Zenity -- GUI d'extraction de piste de fichier mkv -- Generateur de code de screencast
Hors ligne
#15 Le 27/04/2012, à 11:53
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
Explications plus claires => #19
Re-salut à tous, je reviens avec un autre fichier qui me casse les @#!!%$ ![]()
$Conf{RsyncShareName} = [
'/tmp/MysqlHotCopy',
'/opt/test',
'/etc/apache2/sites-available',
'/etc/init.d',
'/var/www/webdesk',
'/usr/local/webdesk',
'/usr/local/bin',
'/opt/test2',
'/etc/scripts'
];
$Conf{RsyncClientCmd} = '$sshPath -q -x -l backup $host $rsyncPath $argList+';
$Conf{RsyncClientRestoreCmd} = '$sshPath -q -x -l root $host $rsyncPath $argList+';
$Conf{DumpPostUserCmd} = '$sshPath -q -x -l backup $host sudo rm -Rf /tmp/MysqlHotCopy';
$Conf{DumpPreUserCmd} = '$sshPath -q -x -l backup $host sudo bash /etc/scripts/backupmysql/backup_mysql_databases.sh';
$Conf{BackupFilesOnly} = {
'/etc/init.d' => [
'/bot',
'/ejabberd',
'/relay'
],
'/etc/apache2/sites-available' => [
'/webdesk'
]
};Je souhaite récupérer ce qu'il y à après $Conf{RsyncShareName}entre les '' (ex : /tmp/MysqlHotCopy)
Mais je souhaite aussi récupérer ce qu'il y a entre $Conf{BackupFilesOnly}
(ex :
/etc/init.d
/bot
/ejabberd
/relay)
J'aimerais que quand une ligne est double (ex : /etc/init.d) dans $Conf{RsyncShareName} et $Conf{BackupFilesOnly}
ne soit pris en compte que ce qui se trouve dans $Conf{BackupFilesOnly}.
Tout ceci devra aller dans un tableau en html du style :
http://www.imagup.com/data/1150185889.html
J'ai déjà trouvé comment extraire les données :
variable=$(sed -rn "s/^$Conf\s*'(.*)'.*$/\1/p" log)
echo "variable : \n\n$variable"Bonne change et merci ^^
Dernière modification par Mr.inco (Le 27/04/2012, à 14:15)
Vieux geek, en école d'info, spé systèmes et réseaux...
Hors ligne
#16 Le 27/04/2012, à 12:34
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
Salut,
En fait, cette expression :
sed -rn "s/^$Conf\s*'(.*)'.*$/\1/p" logne fait pas ce que tu crois. $conf est une variable d'environnement non définie, et l'expression est équivalente à :
sed -rn "s/^\s*'(.*)'.*$/\1/p" logc'est-à-dire que tu récupères ce qui est entre ' ' dans les lignes dont la 1ère ' n'est précédée que d'espaces.
À ta place, je me tournerais plutôt vers awk ou python.
Hors ligne
#17 Le 27/04/2012, à 13:07
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
Je vais voir ce que je peux faire avec awk et python, c'est pas gagné cette histoire ^^
En tout cas merci d'avoir corrigé mon erreur ^^
Vieux geek, en école d'info, spé systèmes et réseaux...
Hors ligne
#18 Le 27/04/2012, à 13:32
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
Bjr,
C'est sur qu'en python, ca serait plus propre ...
Mais bon, bash ca le fait qd meme !
Donc si le path est présent dans RsyncShareName et BackupFilesOnly, il faut retourner BackupFilesOnly ? C'est bien ça ?
#!/bin/bash
file=$(< '/home/user/data.txt')
RsyncShareName=$(sed -n "/RsyncShareName/,/\]/ s/.*'\(.*\)'.*/\1/ p" <<< "$file")
BackupFilesOnly=$(sed -n "/BackupFilesOnly/,/\]/ s/.*'\(.*\)'.*/\1/ p" <<< "$file")
flag=false
while read line
do
if grep -q $line <<< "$RsyncShareName"; then
flag=true
break
fi
done <<< "$BackupFilesOnly"
if $flag; then
data="$BackupFilesOnly"
else
data="$RsyncShareName"
fi
echo "$data"Dernière modification par AnsuzPeorth (Le 27/04/2012, à 13:33)
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#19 Le 27/04/2012, à 14:02
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
Merci de ta réponse AnsuzPeoth!
J'avoue ne pas avoir été très clair dans mes explications:
Ce fichier contient les dossiers à sauvegarder sur une machine.
La partie RsyncShareName représente les dossier à sauvegarder complètement.
La partie BackupFileOnly représente les dossiers ou seuls certains fichiers doivent être sauvegardés (exemple /bot du dossier /etc/init.d)
Je reprends l'exemple du repertoire /etc/init.d :
Celui ci apparaît dans RsyncShareName et dans BackupFileOnly. Cependant il ne sera pa ssauvegardé complètement, seul les fichiers apparaissant dans BackupFileOnly seront sauvegardés. Alors pourquoi le faire apparaitre dans RsyncShareName? Ben je n'ai pas le choix sinon je ne pourrais pas sauvegarder seulement certains des fichiers qu'il contient.
Ce que je souhaite donc faire c'est :
- Extraire les dossiers à sauvegarder complètement (RsyncShareName) /tmp/MysqlHotCopy ...
- Extraire les dossier et fichiers à sauvegarder (BackupFileOnly) => /etc/init.d/bot ...
Sans avoir de doublons liés à l'extraction de la liste des dossiers de RsyncShareName
En gros voila forme souhaitée :
/tmp/MysqlHotCopy
/opt/test
/var/www/webdesk
/usr/local/webdesk
/usr/local/bin
/opt/test2
/etc/scripts
/etc/init.d/bot
/etc/init.d/ejabberd
/etc/init.d/relay
/etc/apache2/sites-available/webdeskPS : Erreur sur le script que tu à mis :
tests.sh: 5: Syntax error: redirection unexpected
Il kiff pas les <<<
Vieux geek, en école d'info, spé systèmes et réseaux...
Hors ligne
#20 Le 27/04/2012, à 14:16
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
$ sed -rn "s/^ *'(.*)'.*$/\1/p" log | sort -u
/bot
/ejabberd
/etc/apache2/sites-available
/etc/init.d
/etc/scripts
/opt/test
/opt/test2
/relay
/tmp/MysqlHotCopy
/usr/local/bin
/usr/local/webdesk
/var/www/webdesk
/webdeskHors ligne
#21 Le 27/04/2012, à 14:18
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
PS : Erreur sur le script que tu à mis :
tests.sh: 5: Syntax error: redirection unexpected
Il kiff pas les <<<
c'est du bash, pourquoi, c'est du sh que tu veux ? Fallait le signaler ...
Enfin, je te redonne en bash selon tes souhait, si il faut du sh, il faudra modifier un peu.
#!/bin/bash
file=$(< '/home/user/data.txt')
RsyncShareName=$(sed -n "/RsyncShareName/,/\]/ s/.*'\(.*\)'.*/\1/ p" <<< "$file")
BackupFilesOnly=$(sed -n "/BackupFilesOnly/,/\]/ s/.*'\(.*\)'.*/\1/ p" <<< "$file")
data="$RsyncShareName"
while read line
do
if grep -q $line <<< "$RsyncShareName"; then
continue
fi
data+="\\n/etc/init.d$line"
done <<< "$BackupFilesOnly"
echo -e "$data"/tmp/MysqlHotCopy
/opt/test
/etc/apache2/sites-available
/etc/init.d
/var/www/webdesk
/usr/local/webdesk
/usr/local/bin
/opt/test2
/etc/scripts
/etc/init.d/bot
/etc/init.d/ejabberd
/etc/init.d/relayPour passer en sh, au lieu de cmd <<< $variable, echo $variable | cmd
Dernière modification par AnsuzPeorth (Le 27/04/2012, à 14:19)
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#22 Le 27/04/2012, à 14:20
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
J'avais justement testé la solution avec le sort -u le problème c'est qu'elle ne m'arrange pas puisque je ne sais plus quel fichier est rattaché à quel dossier =S
Par exemple:
/bot se balade tout seul, mais je n'ai aucune possibilité de savoir qu'il est rattaché à /etc/init.d/bot
Ce qui me serait pratique c'est une sortie de ce genre :
/etc/init.d/bot
Vieux geek, en école d'info, spé systèmes et réseaux...
Hors ligne
#23 Le 27/04/2012, à 14:24
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
tinnn
J'l'avais oublié ce sort -u .....
Merci de me rafraichir la memoire pinguoinux
edit: donc mon code n'est pas bon non plus, vu qu'il faut modifier selon init.d ou autre ...
Dernière modification par AnsuzPeorth (Le 27/04/2012, à 14:26)
Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script (Hors ligne)
Hors ligne
#24 Le 27/04/2012, à 14:30
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
C'est ça AnsuzPeorth on y est presque en fait ^^
Sauf que, ce n'est pas forcement /etc/init.d qui sera en doublon ça peux être un autre dossier aussi =S
Et la sortie du code me renvois encore le dossier tiré de RsyncShareName, celui ci je veux qu'il ne s'affiche pas.
Merci de ton aide ^^
Vieux geek, en école d'info, spé systèmes et réseaux...
Hors ligne
#25 Le 27/04/2012, à 15:27
Re : Extraire une chaine variable d'un fichier (sed, awk, grep...)
Il y a pas quelque chose de possible en utilisant un fichier temporaire qu'il pourrait créer et peut-être exécuter un uniq ?!
Vieux geek, en école d'info, spé systèmes et réseaux...
Hors ligne
- Accueil
- » Forum
- » Développement et programmation
- » Extraire une chaine variable d'un fichier (sed, awk, grep...)