Articles

Affichage des articles associés au libellé bash

Comment ajouter des sauts (retour) à la ligne dans un énorme xml d'une seule ligne !

J'avais un grand fichier récupéré via un curl : curl -#v -o /tmp/output.xml "http://www.myserver.ch/extraction_file.php?mode=complex&typef=xml" le problème c'est que ce fichier "output.xml" était un gros xml valide d'une seule  ligne... un "wc -l /tmp/output.xml"  me retourne bien 1 ! Or la plupart des éditeurs n'aiment pas trop ouvrir ce genre de fichier d'une seule "énorme" ligne, voire même ils plantent lamentablement. La solution est d'utiliser un bon vieux oneliner en perl pour rajouter un saut de ligne après un tag fermant : perl -i -pe 's/<\/Adr>/<\/Adr>\n/g' /tmp/output.xml Et voilà , maintenant le fichier contient autant de ligne qu'il y a de tags fermants . Et du coup il est beaucoup plus facile à utiliser dans votre éditeur favori !

Compter le nombre d'entités de type différentes dans un dessin dxf

Image
Quand on reçoit des données graphiques sous forme d'un simple fichier DXF, il se peut que l'on soit confronter au fait de vérifier le type d'entités différentes se trouvant dans ce fichier. l'utilitaire ogrinfo de la suite d'outil gdal  est bien pratique et il permet de résoudre ce petit problème en une seule ligne de commande sous n'importe quel shell tel que bash avec votre distribution Gnu/Linux favorite. Ceci permet de filtrer tout de suite un fichier d'un lot qui contiendrait des types d'entités que l'on ne veut pas traiter. ogrinfo -geom=SUMMARY -al  085_VOL2008.dxf |grep AcDbEntity|sort |uniq -c        332   SubClasses (String) = AcDbEntity:AcDb3dPolyline     580   SubClasses (String) = AcDbEntity:AcDbBlockReference     405   SubClasses (String) = AcDbEntity:AcDbCircle      64   SubClasses (String) = AcDbEntity:AcDbCircle:AcDbArc      50   SubClasses (String) = ...

Comment renommer 350 fichiers d'un coup d'un seul sous Linux-bash

Je me suis retrouvé dans la situation ou dans un répertoire j'avais 350 fichiers du style dtmgrid122413_1m.asc.gz qu'il fallai que je renomme en MNT_1224-13_1m.asc.gz grâce aux pipe et à sed c'est possible en une seule commande: for i in dtm*; do (mv $i `echo $i|sed 's/dtmgrid\([1-9]\{4\}\)/MNT_\1-/'`); done on retrouve une boucle for qui parcoure chaque fichier dans le répertoire courant et le stocke dans la variable i. Puis pour chaque fichier trouver on va faire un mv pour renommer l'ancien nom de fichier se trouvant en $i en quelquechose qui se trouve etre le résultat de l'expression: `echo $i|sed 's/dtmgrid\([1-9]\{4\}\)/MNT_\1-/'` notez bien que l'expression est entre backquotes c'est grâce à cela que l'on reçoit la valeur finale de l'éxécution de cette suite de commande et non pas une simple chaine de caractères équivalent à notre commande... en gros c'est grâce à une substitution sed " s/avant/apres/ " qui ...

Changer le prompt en ligne de commande sous Bash

Quand on est tout le temps en train de travailler dans la console, il peut arriver que l'on désire changer le prompt du shell. Ce prompt peut ressembler à qqch du style : cfred@tuxhost:/var/log$ seulement parfois on arrive dans des profondeurs de répertoire qui rendent juste intenable l'affichage du path courant dans le prompt. Dans ce cas il suffit de changer la définition du prompt qui se trouve dans la variable PS1 cfred@tuxhost:/var/log$ SAVE=$PS1 cfred@tuxhost:/var/log$ PS1="\u:\W $ " cfred:log $ echo "Pour restaurer la valeur d'origine il suffira alors de faire" cfred:log $ PS1=$SAVE Il y a plusieurs caractères d'échappement qui peuvent être utilisé comme par exemple : \d pour la date \h le nom du host jusqu'au premier point (sans le suffixe dns) \H le nom du host complet \t l'heure au format 24h HH:MM:SS \T l'heure au format 12h HH:MM:SS \u le nom d'utilisateur courant \w le chemin compl...

Les commandes "shell bash" sont trop belles !

Quand on administre des serveurs, ou quand on programme on a souvent des petits problèmes à résoudre en relation avec un certain nombre de fichiers ou une crackée de paramètres. Et franchement la connaissance du shell est un outil qui fait gagner beaucoup de temps. Un des problèmes qui vient souvent c'est un truc du style : pour chacun de ces trucs fait ça avec le truc... Et la boucle for est salvatrice, Ainsi je veux lancer un script ou une commande avec un paramètre différent qui se trouve être dans un fichier ListeParam.txt : for i in `cat ListeParam.txt` ; do (./MonScript.sh $i) ; done Et voilà ! mon script va se lancer autant de fois qu'il y a de lignes dans le fichier ListeParam.txt Simple, efficace, juste BÔ ! J'avais par exemple cette liste de noms de 352 tables SQL ListeTables.txt et un script php qui devait analyser la table sous MSSQL et généer du code pour la créer sous PostgreSql GenPgSqlCreate.php et bien avec un rapide : for i in `cat ListeTables.tx...

ReverseProxy avec Apache

Quand on veut permettre à un utilisateur lambda d'accèder sur un reseau public d'accèder à des informations sur un site web 192.168.50.120 situé dans un réseau privé, deux possibiliés s'offre à nous: On peut prendre un serveur Linux et avec deux cartes réseau : une côté publique - eth0[10.163.200.9], une côté privé - eth1[192.168.50 77]) l'utiliser comme un Firewall avec les iptables et une règle DNAT pour ouvrir un port sur l'interface publique du firewall qui redirigera les demandes sur le serveur web du réseau privé exemple: echo 1> /proc/sys/net/ipv4/ip_forward iptables -t nat -A PREROUTING -i eth0 -p tcp -d 10.163.200.9 --dport 80 -j DNAT --to-destination 192.168.50.120 Ou on peut configurer un reverse proxy avec Apache ou Squid sur le Firewall Dans le deuxieme cas on a plus de souplesse car on peut intervenir sur chaque url par exemple avec mod_rewite mais tout d'abord la config nécess...

Apache Virtual host

On désire parfois créer sur le même serveur web plusieurs sites différents. En utilisant dns on modifie notre config comme suit : cat /etc/bind/db.labo.org $TTL 1H @ IN SOA ns1.labo.org. root.labo.org. ( 2004071801 ; Serial 1H ; Refresh 1H ; Retry 1H ; Expire 1D ) ; Negative Cache TTL ; @ IN NS ns1.labo.org. @ IN NS ns2.labo.org. @ IN MX 10 ns1.labo.org. ns1 IN A 10.0.0.4 box3 IN A 10.0.0.3 fw1 IN A 10.0.0.1 ns2 IN A 10.0.0.2 box4 IN A 10.0.0.19 fw2 IN CNAME ns2 red IN CNAME box3 blue IN CNAME box4 ceci va nous permettre d'avoir des alias qui pointent sur notre serveur, maintenant il faut pouvoir les détecter dan...

Quels RPMs surmon bô serveur

Et voici un petits shells scripts tout con, que j'ai écrit parceque je voulais savoir rapidement ce qui se trouvait sur mon serveur, il permet de savoir les RPM qui sont déjà installés, mais surtout de lire leurs description sans devoir se casser la tête. On peut sauver le fichier sous un nom évoquateur tel que listerpm.sh et ensuite on peut l'appeller soit tel quel sans arguments et alors il donnera l'intégrale des rpm présents sur le serveur, soit on lui passe un argument du style "./listerpm.sh open" et dans ce cas il ne listera que les paquetages rpm contenant dans leurs nom "open" en majuscules ou en minuscules (switch -i du grep)... #!/bin/sh if [ -z "$1" ]; then rpm -qa |sort |perl -ne 'print qx(rpm -qi $_).qq(\n).q(*)x80 . qq(\n);'| more else rpm -qa |grep -i $1 |sort |perl -ne 'print qx(rpm -qi $_).qq(\n).q(*)x80 . qq(\n);'| more fi En éspérant que cela soit utile, et/ou que cela vous inspire pour un autre usage !