Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1048 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [Shell .sh] Copier des lignes dans un fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Shell .sh] Copier des lignes dans un fichier

n°1390946
raikage
Posté le 30-05-2016 à 15:00:08  profilanswer
 

Bonjour tout le monde,  :)  
 
Je suis en entreprise et j'ai vraiment un petit niveau en shell et je dois ajouter à la fin du ficher "/etc/group" des lignes contenant des users.
Je m'explique, j'ai d'un côté le fichier /etc/group qui est présenté comme ceci :
wireshark:x:128:toto
 
Et de l'autre côté j'ai un fichier users.txt, dans ce fichier chaque ligne comprend un username, exemple :
user1
user2
user3
 
Je voudrais pouvoir via un script shell ajouter en fin du fichier /etc/group ma liste d'users de users.txt sous cette forme :
wireshark:x:128:toto
wireshark:x:128:user1
wireshark:x:128:user2
wireshark:x:128:user3
 
Il faudrait que les 3 lignes s'ajoutent à la suite les unes des autres et à la suite de wireshark:x:128:toto.  :jap:  
 
J'ai commencer un script qui n'est pas fini et je pense être sur la bonne voie, des conseils ou idées ?  :sweat:  
 

Code :
  1. #!/bin/bash
  2. nblignes=0
  3. nblignes= sed -n '$=' users.txt
  4. compteur=0
  5. while compteur!=nblignes
  6.  do
  7.  echo "wireshark:x:130:$user" > /etc/group
  8. done
  9. echo $user


 
Merci d'avance  :)  :hello:

mood
Publicité
Posté le 30-05-2016 à 15:00:08  profilanswer
 

n°1390951
kuroineko_​fr
meme le chene fut un gland
Posté le 30-05-2016 à 18:39:34  profilanswer
 

hola  
 
effectivement c est pas bien de faire comme ca  
 
 


francois@baal:~$ cat > 1
wireshark:x:128:toto
francois@baal:~$ cat > 2
test1
test2
test3
francois@baal:~$ cp 1 1.old ; sed '/wireshark/ s/$/,'$(cat 2 | tr '\n' ',')'/;s/,$//' 1.old > 1  
francois@baal:~$ cat 1
wireshark:x:128:toto,test1,test2,test3
francois@baal:~$ rm 1 1.old 2
francois@baal:~$


 
en clair  
je copie group dans group.old
je substitue sur la ligne contenant wireshark le caractere de fin de ligne par la traduction du fichier de liste des users ramene a une ligne unique avec ',' comme séparateur
 
 
joue avec ca dans des fichier bidons comme indiques et quand tu as compris ... bha action


Message édité par kuroineko_fr le 30-05-2016 à 18:44:35
n°1390978
raikage
Posté le 31-05-2016 à 12:11:18  profilanswer
 

Ton code est vachement bien, c'est exactement ce résultat qu'il me faut  :love:  
 
Mais lorsque je rentre ta commande sur ma ubuntu :

Code :
  1. sed '/wireshark/ s/$/,'$(cat users.txt | tr '\n' ',')'/;s/,$//' group.old > group


 
Celà fonctionne bien mais dans le fichier group j'ai des caractères spéciaux qui n'ont rien à faire là, comment procéder pour ne pas avoir ces "merdouilles" ?  :cry:  

Code :
  1. wireshark:x:130:jean,user1^M,user2^M,user3^M,user4^M,user5


 
 
 
Qu'en pensez vous ?  :jap:


Message édité par raikage le 31-05-2016 à 12:17:55
n°1390981
raikage
Posté le 31-05-2016 à 15:20:33  profilanswer
 

En utilisant cette commande j'arrive à enlever les ^M mais les infos sont mis à la ligne et pas sur toute la même ligne ...
 
La commande utilisée pour :

Code :
  1. sed 's/$/\r/' group > groupe5.txt


 
Le résultat :  

Code :
  1. wireshark:x:130:jean,user1
  2. ,user2
  3. ,user3
  4. ,user4
  5. ,user5
  6. guest-5cby19:x:999:


n°1390985
kuroineko_​fr
meme le chene fut un gland
Posté le 31-05-2016 à 18:40:34  profilanswer
 

des ^M
???? sous linux  impossible en principe...  a moins que tu fasse du copier/coller depuis un putty ??
 
sinon tu peux fare une passe peur les eliminer  
substitute par rien...
 
s/pattern//   ou avec vim par search and replace all etc etc ... y a plusieurs facons de faire
 
 :hello:  

n°1390988
kuroineko_​fr
meme le chene fut un gland
Posté le 31-05-2016 à 21:25:24  profilanswer
 

le fichier user est prabablement verole par le ^M ...   passes y la commande dos2unix avant traitement et hop...

n°1391009
raikage
Posté le 01-06-2016 à 15:02:39  profilanswer
 

J'ai donc opter pour ce script qui fonctionne :
 

Code :
  1. cp group group.old ; sed '/wireshark/ s/$/,'$(cat users.txt | tr '\n' ',')'/;s/,$//' group.old > group.test
  2. tr -d $'\r' < group.test > group


 
Maintenant le tout est de faire un deuxième script qui permet d'enlever les users précédemment ajouté à côté de la ligne wireshark:x:130 afin d'interdire quand on en à besoin l'accès aux captures wireshark pour des questions de sécurité


Message édité par raikage le 01-06-2016 à 15:02:56
n°1391015
kuroineko_​fr
meme le chene fut un gland
Posté le 01-06-2016 à 18:18:55  profilanswer
 

parfait
:bounce:

n°1391046
o'gure
Modérateur
Multi grognon de B_L
Posté le 02-06-2016 à 14:24:51  profilanswer
 

Au lieu de triturer n'importe comment les fichiers de conf sans regarder comment ils fonctionnent, il est nettement préférable d'utiliser les outils prévu à cet effet.
 
cf. usermod


---------------
Relax. Take a deep breath !

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [Shell .sh] Copier des lignes dans un fichier

 

Sujets relatifs
Générer un fichier channels.conf pour VLC (TNT)CSH : modifier certains mots d'un fichier à partir d'un autre fichier
VPN et fichier host + restriction pour certaines IPsAjouter la date à la création d'un fichier
script batch de compression automatique fichierCe thème d'icônes n'a aucun fichier cache...
[RESOLU] Crontab : Appeler variable déclarée dans un autre fichierCopier une clé usb bootable sur une plus petite
[SHELL] jointure entre 2 fichiers (Résolu)Taille Système de fichier BTRFS
Plus de sujets relatifs à : [Shell .sh] Copier des lignes dans un fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR