Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

#1 Le 11/10/2012, à 17:09

compte supprimé

[Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

Bonjour à tous.

Alors voilà mon problème, j'essaie de récupérer dans un tableau chaque ligne d'un fichier lu. (les cs donnés ne sont qu'une infime partie d'un programme plus long mais qui fonctionne correctement)
J'ai trouvé plusieurs solutions sur internet, mais aucune ne marche..
Mon fichier:

BASH-TERMINAL a écrit :

christopher@christopher-R780-R778:~/Cours/Informatique/DM/Systemes/LaTeXnAwk/Q3$ cat ./listeProgs.txt;
chfn
gnome-screensaver-dialog
gnome-keyring-prompt
sudo
login
xscreensaver
chage
userdel
atd
dbus
su
getty
CRON
groupadd
chsh
usermod
useradd
firefox
gnome-keyring-daemon
lightdm
sshd


1ere solution:
IFS=$'\n';
listeProgs='cat ./listeProgs.txt';
echo ${listeProgs[1]} ${listeProgs[2]};



Réponse: rien d'affiché! tongue


2eme solution:
i=1;
while read aLine ;do listeProgs[$i]=$aLine; i=$($i+1); echo $aLine;done <./listeProgs.txt

Réponse a écrit :

./q3.sh: ligne 22: 1+1 : commande introuvable
chfn
./q3.sh: ligne 22: +1 : commande introuvable
gnome-screensaver-dialog
./q3.sh: ligne 22: +1 : commande introuvable
gnome-keyring-prompt
./q3.sh: ligne 22: +1 : commande introuvable
sudo
./q3.sh: ligne 22: +1 : commande introuvable
login
./q3.sh: ligne 22: +1 : commande introuvable
xscreensaver
./q3.sh: ligne 22: +1 : commande introuvable
chage
./q3.sh: ligne 22: +1 : commande introuvable
userdel
./q3.sh: ligne 22: +1 : commande introuvable
atd
./q3.sh: ligne 22: +1 : commande introuvable
dbus
./q3.sh: ligne 22: +1 : commande introuvable
su
./q3.sh: ligne 22: +1 : commande introuvable
getty
./q3.sh: ligne 22: +1 : commande introuvable
CRON
./q3.sh: ligne 22: +1 : commande introuvable
groupadd
./q3.sh: ligne 22: +1 : commande introuvable
chsh
./q3.sh: ligne 22: +1 : commande introuvable
usermod
./q3.sh: ligne 22: +1 : commande introuvable
useradd
./q3.sh: ligne 22: +1 : commande introuvable
firefox
./q3.sh: ligne 22: +1 : commande introuvable
gnome-keyring-daemon
./q3.sh: ligne 22: +1 : commande introuvable
lightdm
./q3.sh: ligne 22: +1 : commande introuvable
sshd
chfn

WTF?
Pouvez-vous m'aider s'il vous plait?

Merci.

Coordialement,

Dernière modification par ChrisLeturc (Le 18/12/2012, à 13:46)

#2 Le 11/10/2012, à 17:20

pingouinux

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

Bonjour,

while read aLine ;do listeProgs[$i]="$aLine"; ((i++)); echo "$aLine";done <./listeProgs.txt
echo "${listeProgs[@]}"

Ajouté :
À la place de :

i=$($i+1)

il fallait :

i=$((i+1))

ou

((i++))

Les guillemets "" sont pour le cas où les lignes contiennent des espaces.

Dernière modification par pingouinux (Le 11/10/2012, à 17:27)

En ligne

#3 Le 11/10/2012, à 17:27

Watael

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

salut,

mapfile -t monboTableau < monboFichier

eval, c'est mal.

Hors ligne

#4 Le 11/10/2012, à 17:34

compte supprimé

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

Alors, là.. je comprends pas, ça marche comme par magie. Mais pourquoi? J'utilisais une autre norme de shell?

La réponse obtenue:
chfn gnome-screensaver-dialog gnome-keyring-prompt sudo login xscreensaver chage userdel atd dbus su getty CRON groupadd chsh usermod useradd firefox gnome-keyring-daemon lightdm sshd

Merci beaucoup!

Une autre petite question en rapport avec le programme que je développe. Est-il possible avec awk de lancer son script awk qui à l'intérieur de celui-ci lance à partir de la fonction system() un autre awk en lui passant des variables par ARGV récupérées au fur et à mesure?
J'ai essayé, et à la place, il essaie d'exécuter la variable de la première colonne comme un script.

cat ./listeProgs.txt | awk -f ./parcours.awk

dans parcours.awk:
blablaba..
system("awk -f searchProgs.awk  ../docs/auth-anonyme-extrait.log" ARGV[1]);

Et là, il cherche un fichier du nom de la valeur de ARGV[1]
Même chose quand je le place:
system("awk -f searchProgs.awk " ARGV[1]  ../docs/auth-anonyme-extrait.log");

Merci

#5 Le 11/10/2012, à 18:48

Postmortem

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

Salut,

pingouinux a écrit :

Les guillemets "" sont pour le cas où les lignes contiennent des espaces.

Petit chipotage, pas besoin de guillemets dans ce cas :

une_var=$variable

Mais ça mange pas de pain de les mettre ! tongue


Trusty Tahr (64 bits), Athlon64 3800+, ATI Radeon HD4870

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#6 Le 11/10/2012, à 19:06

pingouinux

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

@Postmortem #5 : Tu as raison, mais ça m'évite d'en oublier…

@ChrisLeturc #4 :
Ce que tu essayes de faire me paraît bien compliqué, mais voici comment tu peux passer une variable dans awk :

system( "awk -f searchProgs.awk -v X=\""$0"\" ./docs/auth-anonyme-extrait.log" )

et tu utilises X dans searchProgs.awk

Tu peux éventuellement préciser ce que tu veux faire, pour voir s'il n'y a pas plus simple.

Dernière modification par pingouinux (Le 11/10/2012, à 21:04)

En ligne

#7 Le 11/10/2012, à 19:13

Watael

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

awk est suffisamment puissant pour ne pas avoir à s'appeler lui-même.

je plussoie pingouinux: il faudrait qu'on sache ce que tu veux faire, pour trouver la meilleure manière de faire.

Dernière modification par Watael (Le 11/10/2012, à 19:13)


eval, c'est mal.

Hors ligne

#8 Le 12/10/2012, à 11:55

compte supprimé

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

Ca a l'air tordu ce que je veux faire.. et je suis d'accord!
Simplement parce que mon problème donné est un peu tordu, je crois. tongue

Peut-être que je me casse la tête pour rien et qu'une solution plus simple est possible.

Donc voici mon problème que mon script tente de résoudre:
Il faut pour chaque programme, calculer par jour et pour chaque machine le nombre d'évènements journalisés. Pour ce faire..


Je crée tout d'abord le fichier qui contiendra les statistiques que je veux relever avec comme nom, le nom du programme suivi de .dat + la liste de tous les programmes utilisés via $7 que je récupère dans mon tableau..

Pour chaque programme utilisé ==>  j'extrait de mon fichier syslog seulement les lignes où apparaît le nom du programme  qu'on est en train de traiter dans un fichier nomProg.extract.
Ensuite je le trie avec sort par rapport au jour..
  Je lance un nouvel awk(qui n'est pas imbriqué dans celui qu'on a fait implicitement précédemment, bien sûr) et dans lequel on parcourt le fichier nomProg.extract et je récupère dans un tableau le nombre d'événements ie un tableau nbOcc[nomMachine]+=1 (où nomMachine = $6) trié pour chaque jour.

J'ajoute ensuite ces données aux fichiers.dat crée précédemment.
Présenté de la sorte:
nomProg.dat
jour:
  nomMachine, nbEvents(nombres d'évènements ie le nombre de fois qu'on voit le programme apparaître)
etc..
etc..

Tordu?
Mais j'avoue que le problème est mal formulé.. Il s'agit en effet d'une question d'un de mes dm de "système et réseaux"


EDIT: merci pour la passage de variables par awk! Ca marche.. plus qu'à achever mon programme.

Dernière modification par ChrisLeturc (Le 12/10/2012, à 11:59)

#9 Le 12/10/2012, à 12:15

credenhill

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

hello

tableau=($(<listeProgs.txt))

Hors ligne

#10 Le 13/10/2012, à 06:11

pingouinux

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

Bonjour,

ChrisLeturc #8 a écrit :

Pour chaque programme utilisé ==>  j'extrait de mon fichier syslog

Peux-tu montrer quelques lignes de ce fichier syslog, pour voir à quoi il ressemble ?

En ligne

#11 Le 13/10/2012, à 11:46

compte supprimé

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

Voici un petit extrait du fichier syslog en question:

Syslog a écrit :

1431898623 2012-09-11 16:20:27 4 6 torched sshd[5331]: 1 Accepted publickey for root from 41.349.282.58 port 52547 ssh2
1429245071 2012-09-10 11:46:08 4 6 torched sshd[13354]: 1 Received disconnect from 41.349.282.58: 11: disconnected by user
1429243096 2012-09-10 11:45:58 4 6 torched sshd[13354]: 1 Accepted publickey for root from 41.349.282.58 port 46224 ssh2
1429185056 2012-09-10 11:14:05 4 5 torched gnome-keyring-daemon[12204]: 1 couldn't set environment variable in session: The name org.gnome.SessionManager was not provided by any .service files
1429185055 2012-09-10 11:14:05 4 5 torched gnome-keyring-daemon[12204]: 1 couldn't access conrol socket: /tmp/keyring-pR0iQy/control: Aucun fichier ou dossier de ce type
1445668140 2012-09-17 15:00:02 10 3 seekers CRON[9886]: 1 pam_ldap(cron:account): error reading from nslcd: Connection reset by peer
1445471855 2012-09-17 13:16:40 10 6 seekers lightdm: 1 pam_unix(lightdm:session): session opened for user lightdm by (uid=0)
1445471842 2012-09-17 13:16:38 10 5 seekers polkitd(authority=local): 1 Unregistered Authentication Agent for unix-session:/org/freedesktop/ConsoleKit/Session2 (system bus name :1.26, object path /org/gnome/PolicyKit1/AuthenticationAgent, locale fr_FR.UTF-8) (disconnected from bus)
1445471841 2012-09-17 13:16:38 10 6 seekers lightdm: 1 pam_unix(lightdm:session): session closed for user 58864406
1445400334 2012-09-17 12:34:27 10 5 seekers polkitd(authority=local): 1 Registered Authentication Agent for unix-session:/org/freedesktop/ConsoleKit/Session2 (system bus name :1.26 [/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1], object path /org/gnome/PolicyKit1/AuthenticationAgent, locale fr_FR.UTF-8)

Par contre, je ne comprends pas pourquoi je reçois ce message, parfois lors du traitement de mes fichiers:

Terminal-Bash a écrit :

/bin/sh: 1: Syntax error: "(" unexpected
/bin/sh: 1: Syntax error: "(" unexpected
/bin/sh: 1: Syntax error: "(" unexpected
/bin/sh: 1: Syntax error: "(" unexpected
/bin/sh: 1: Syntax error: "(" unexpected
/bin/sh: 1: Syntax error: "(" unexpected

J'ai l'impression que ce message est affiché à chaque fois qu'on a en entrée une parenthèse dans la ligne récupérée, style:
1445471842 2012-09-17 13:16:38 10 5 seekers polkitd(authority=local): 1 Unregistered Authentication Agent for unix-session:/org/freedesktop/ConsoleKit/Session2 (system bus name :1.26, object path /org/gnome/PolicyKit1/AuthenticationAgent, locale fr_FR.UTF-8) (disconnected from bus)

Mon moyen de récupérer les lignes est le suivant: (awk)
system("echo "$0" >> fichier.dat");

#12 Le 13/10/2012, à 11:56

pingouinux

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

C'est :

system("echo \""$0"\" >> fichier.dat");

En ligne

#13 Le 13/10/2012, à 12:04

compte supprimé

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

Pardon, j'aurais du copier-coller ma ligne de code.

system("echo \"" $0 "\" >> authExtract.txt;"); 

Ce qui est archi-bizarre, c'est que les résultats dans mes fichiers.dat ont l'air plutôt cohérents. :s

Extrait de CRON.dat a écrit :

2012-09-10
-oft-shawn, 2
-irishman, 4
-inside, 9
-funds, 5
-groin, 3
-sullen, 21
-lacerate, 8
-worshiping, 7
-torched, 6
-smoke-chums, 5
-toots, 5
-turgenev, 1
-leeches, 6
-seekers, 5
-pianos, 7
-tie, 4

2012-09-11
-oft-shawn, 3
-irishman, 3
-inside, 7
-funds, 9
-groin, 7
-worshiping, 6
-torched, 6
-toots, 8
-smoke-chums, 6
-turgenev, 1
-leeches, 4
-seekers, 4
-pianos, 1
-tie, 6

Mais cette erreur de syntaxe m'effraie un peu. Il y a un élément qui me dépasse et je n'arrive pas à voir pourquoi.

Si je comprends bien, quand j'oublie les \" du echo, il va essayer d'exécuter une commande?


EDIT: Plus particulièrement, l'erreur de syntaxe arrive uniquement lors du traitement du programme dbus.

Bash-Terminal a écrit :

Réinitialisation du fichier authExtract réussie! X=dbus
/bin/sh: 1: Syntax error: "(" unexpected
/bin/sh: 1: Syntax error: "(" unexpected
/bin/sh: 1: Syntax error: "(" unexpected
/bin/sh: 1: Syntax error: "(" unexpected
...

En analysant le fichier syslog, on remarque que les lignes dbus sont vraiment particulières:

auth-anonyme-extrait.log a écrit :

1441452006 2012-09-15 14:24:29 4 5 funds dbus[1444]: 1 [system] Rejected send message, 2 matched rules; type="method_call", sender=":1.118" (uid=71426877 pid=13769 comm="/usr/bin/pulseaudio --start --log-target=syslog ") interface="org.bluez.Manager" member="ListAdapters" error name="(unset)" requested_reply="0" destination="org.bluez" (uid=0 pid=1462 comm="/usr/sbin/bluetoothd ")
1441451938 2012-09-15 14:24:29 4 5 funds dbus[1444]: 1 [system] Rejected send message, 2 matched rules; type="method_call", sender=":1.115" (uid=71426877 pid=13762 comm="/usr/bin/pulseaudio --start --log-target=syslog ") interface="org.bluez.Manager" member="ListAdapters" error name="(unset)" requested_reply="0" destination="org.bluez" (uid=0 pid=1462 comm="/usr/sbin/bluetoothd ")
1441451933 2012-09-15 14:24:29 4 5 funds dbus[1444]: 1 [system] Rejected send message, 2 matched rules; type="method_call", sender=":1.109" (uid=99387319 pid=13750 comm="/usr/bin/pulseaudio --start --log-target=syslog ") interface="org.bluez.Manager" member="ListAdapters" error name="(unset)" requested_reply="0" destination="org.bluez" (uid=0 pid=1462 comm="/usr/sbin/bluetoothd ")
1439773013 2012-09-14 18:15:52 4 5 funds dbus[1444]: 1 [system] Rejected send message, 2 matched rules; type="method_call", sender=":1.80" (uid=71426877 pid=31195 comm="/usr/bin/python /usr/share/apport/apport-gtk ") interface="org.freedesktop.DBus.Properties" member="GetAll" error name="(unset)" requested_reply="0" destination=":1.9" (uid=0 pid=2606 comm="/usr/sbin/console-kit-daemon --no-daemon ")
1439772648 2012-09-14 18:15:52 4 5 funds dbus[1444]: 1 [system] Rejected send message, 2 matched rules; type="method_call", sender=":1.80" (uid=71426877 pid=31195 comm="/usr/bin/python /usr/share/apport/apport-gtk ") interface="org.freedesktop.DBus.Properties" member="GetAll" error name="(unset)" requested_reply="0" destination=":1.9" (uid=0 pid=2606 comm="/usr/sbin/console-kit-daemon --no-daemon ")

Peut-être la présence des "" ---> error name="(unset)"??
Après traitement de toute la variable $0 par expression régulière( gsub(/\"/,"\"",$0);), toujours la même erreur pour dbus, je ne comprends pas.

PS: je viens de remarquer que pour le fichier dbus.dat, il était vide.
Il y a sans doute un élément bizarre dans auth-anonyme-extrait.log qu'il faut que je traite absolument par expression régulière.. mais quoi?

Dernière modification par ChrisLeturc (Le 13/10/2012, à 12:29)

#14 Le 13/10/2012, à 13:30

Watael

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

?
tu utilises system() pour faire un simple echo ?

j'avais lu que system() était déconseillé (je ne me souviens pas pourquoi, mais je le crois), c'est surtout très inutile ici.


eval, c'est mal.

Hors ligne

#15 Le 13/10/2012, à 13:41

compte supprimé

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

Mais dans ce cas, sans utiliser la fonction system(), je fais comment pour rediriger ma sortie avec print ou printf?

Je voudrais simplement écrire dans data/fichier.dat.


Je crois avoir entendu mon prof de tp C/C++ en L2-Physique avoir parler d'une possibilité de réorientation du flux. Mais ca c'est possible qu'en C++(avec les cout et cin, ostream), non? pas en C?
(je parle du C parce que la syntaxe de awk est quand  même assez proche)

#16 Le 13/10/2012, à 13:54

Postmortem

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

Salut,
Petit exemple de redirection avec awk ; on se retrouve, avec ce simple exemple, avec le contenu de fic.txt dans mon_fic.txt :

awk '{print > "mon_fic.txt"}' fic.txt

Trusty Tahr (64 bits), Athlon64 3800+, ATI Radeon HD4870

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#17 Le 13/10/2012, à 14:18

pingouinux

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

Voici une proposition :

Fichier de commandes pour awk

$ cat inawk
function ecrire(jour) {
   if(jour) {
      print jour" :"
      n=asorti(c,cs)
      for (i=1;i<=n;i++) printf("     %-8s,%3d\n",cs[i],c[cs[i]])
      delete c
   }
}
$3==prog {
    if(!deja) {print prog".dat"; deja=1}
    jour=$1
    if(jour!=jour_av) { ecrire(jour_av); jour_av=jour }
    c[$2]++
}
END{ecrire(jour)}

Génération de prog.extract (ce qui nous intéresse dans Syslog)

sed -rn "s/([^ ]+ ){2}([^ ]+ ){4}([^:[]+)[:[].*/\1\2\3/p" Syslog | sort >prog.extract

Génération des .dat

while read prog; do awk -v prog="$prog" -f inawk prog.extract >"$prog".dat; done <listeProgs.txt

Et pour supprimer les fichiers .dat de taille nulle :

find -name \*.dat -size 0 -delete

En ligne

#18 Le 13/10/2012, à 14:46

compte supprimé

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

C'est propre ça, merci.

asorti(c,cs)
C'est pour gérer une sorte de dictionnaire?
Cette fonction renvoierait la taille du dictionnaire.
Je suis un noob en ss et awk, quel en est le contenu de la fonction asorti?


cs[i], serait la clé, et c[cs[i]] le nombre d'occurrences?


Ensuite sed, c'est l'ancêtre d'awk, non? ^^' (que j'ai simplement entre aperçu dans mon bouquin, Linux de Sebastien Rohaut)


PS: je viens de remarquer qu'on ne peut pas désactiver le bbcode d'un message? Pourquoi ne pas créer une balise bbcode qui désactiverait à l'intérieur toutes les autres balises et une option qui pourrait désactiver le bbcode d'un message tout entier? --> pb avec les collections c et cs.

Dernière modification par ChrisLeturc (Le 13/10/2012, à 14:47)

#19 Le 13/10/2012, à 15:26

pingouinux

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

Voir man awk :

       asort(s [, d])          Returns  the  number  of elements in the source array s.  The contents of s are
                               sorted using gawk's normal rules for comparing values, and the indices  of  the
                               sorted  values  of  s are replaced with sequential integers starting with 1. If
                               the optional destination array d is specified, then s is first duplicated  into
                               d, and then d is sorted, leaving the indices of the source array s unchanged.

       asorti(s [, d])         Returns the number of elements in the source array s.  The behavior is the same
                               as that of asort(), except that the array indices are used for sorting, not the
                               array  values.  When done, the array is indexed numerically, and the values are
                               those of the original indices.  The original values are lost;  thus  provide  a
                               second array if you wish to preserve the original.

Voici une exemple issu de mes tests avec ton fichier :
c est un tableau (c pour compte), indexé par le nom de la machine, et contenant le nombre de fois où ce nom apparaît un jour donné et pour un programme donné.
Avant le tri :

c[torched]=3
c[seekers]=1
c[abcdef]=1
c[ghijklm]=1

Après le tri, ce tableau est inchangé, et cs est indexé par un entier (pas forcément dans l'ordre), et contient les index du tableau c.

cs[4]=torched
cs[1]=abcdef
cs[2]=ghijklm
cs[3]=seekers

n=asorti(c,cs) est bien le nombre d'éléments de c.
Quand i varie de 1 à n, cs[ i] parcourt les noms de machine par ordre alphabétique, et c[cs[ i]] en est le nombre d'occurences.

En ligne

#20 Le 13/10/2012, à 19:29

compte supprimé

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

Merci pour toute l'aide que vous m'avez apporté!

Grâce à vous j'ai quand même bien avancé dans mon programme.. j'ai toujours beaucoup de mal avec la syntaxe trop "stricte" des scripts shells.

J'obtiens cependant toujours cette erreur pour dbus:

terminal a écrit :

/bin/sh: 1: Syntax error: "(" unexpected

Les regexp ne semblent pas être une bonne idée. Si vous voulez, je peux vous envoyer mes scripts par MP.

En parlant de regexp, je me suis lancé dans l' anonymat des IP et des utilisateurs sauf que je ne comprends pas pourquoi une regexp aussi simple que:
[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} ne parvient pas à fonctionner alors que..
[0-9]?[0-9]?[0-9]\.[0-9]?[0-9]?[0-9]\.[0-9]?[0-9]?[0-9]\.[0-9]?[0-9]?[0-9] localise les IPs.

Je désire récupérer l'ip et la changer en une valeur. (123.12.244.2 serait dès qu'elle apparait la valeur 1 etc.)
en php on utilise preg_replace(regexp, quoi, chaine); Les parenthèses capturent dans des variables $1(première parenthèse rencontrée) $2 ...
En awk, existe-il la même fonction?

gsub() ne semble pas fonctionner de la manière que j'aurais pu espérer. :s

Dernière modification par ChrisLeturc (Le 13/10/2012, à 19:29)

#21 Le 13/10/2012, à 19:47

pingouinux

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

On ne peut t'aider que si tu donnes un exemple précis de ce qui ne marche pas chez toi : la ligne de commande exacte, et la ou les lignes du fichier qui génèrent une erreur. Est-ce que c'est uniquement dans awk ?

Ajouté :
Dans awk, pour traiter ce genre de regex [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}, il faut ajouter l'option --posix (ou --re-interval) :

awk --posix …

gsub() ne semble pas fonctionner de la manière que j'aurais pu espérer

Pour cela, c'est gensub() qu'il faut utiliser, mais ce dernier est incompatible avec l'option --posix, qu'il faut alors remplacer par --re-interval. Par exemple, pour inverser les champs 1 et 2, ainsi que 3 et 4, dans une adresse IP (c'est idiot, mais c'est juste un exemple) :

$ awk --re-interval  '/[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}/{$0=gensub(/(\<[[:digit:]]+)\.([[:digit:]]+)/,"\\2.\\1","g");print}' <<<"125.05.22.57"
05.125.57.22

Dernière modification par pingouinux (Le 14/10/2012, à 09:16)

En ligne

#22 Le 14/10/2012, à 13:00

compte supprimé

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

L'option --posix ne semble pas fonctionner pour mon awk. Il me renvoie:

terminal a écrit :

awk: not an option: --posix

Du coup, j'ai développé un autre code:

 if(pos=match(ligne, /[0-9]?[0-9]?[0-9]\.[0-9]?[0-9]?[0-9]\.[0-9]?[0-9]?[0-9]\.[0-9]?[0-9]?[0-9]/ ))
  	{
  	 
		ipV4=substr($0,pos,12);
		
		gsub(/ (.*)/,"",ipV4);
		#On affecte à l'ip correpondante un numéro d'anonymat.
		if(ipV4Table[ipV4]=="")
		{
			ipV4Table[ipV4]=numIPV4;
			numIPV4++;
		}
		
		codeAnonymat="IPV4$"ipV4Table[ipV4]"$";
		
		gsub(/[0-9]?[0-9]?[0-9]\.[0-9]?[0-9]?[0-9]\.[0-9]?[0-9]?[0-9]\.[0-9]?[0-9]?[0-9]/, codeAnonymat, ligne);
			
  	}

Par contre pour l'ipV6, j'utilise cette regexp:
/([0-9a-f]{4})(\:([0-9a-f]{4})){7}/
Qui bien sûr ne fonctionne pas, elle utilise des accolades..
/[0-9a-f]?[0-9a-f]?[0-9a-f]?[0-9a-f]?:[0-9a-f]?[0-9a-f]?[0-9a-f]?[0-9a-f]?:[0-9a-f]?[0-9a-f]?[0-9a-f]?[0-9a-f]?:[0-9a-f]?[0-9a-f]?[0-9a-f]?[0-9a-f]?:[0-9a-f]?[0-9a-f]?[0-9a-f]?[0-9a-f]?:[0-9a-f]?[0-9a-f]?[0-9a-f]?[0-9a-f]?:[0-9a-f]?[0-9a-f]?[0-9a-f]?[0-9a-f]?:[0-9a-f]?[0-9a-f]?[0-9a-f]?[0-9a-f]?/
Mais cette regexp ne respecte pas les principes de simplification des IPV6 (suite de 0 consécutifs). Et ne fonctionne pas aussi. :s

EDIT: pour la dernière, il me dit qu'elle est trop longue. sad

Terminal a écrit :

christopher@christopher-R780-R778:~/Cours/Informatique/DM/Systemes/LaTeXnAwk/Q7$ ./q7.sh
awk: ./anonymise.awk: line 28: regular expression /([0-9a-fA- ... exceeds implementation size limit

( :'( ) Ce sont de géniaux programmes awk et sh mais tous ces petits défauts rendent leur pratique difficile pour des problèmes un peu complexes.. sad ) J'ai conscience d'être encore qu'un noob pour les utiliser. Mais même mes débuts en C/C++ et ASM(NASM, TASM, ATnT) étaient moins déprimants que l'utilisation de ces programmes hyper haut-niveaux. Un peu déçu pour le coup..

Dernière modification par ChrisLeturc (Le 14/10/2012, à 15:01)

#23 Le 14/10/2012, à 15:15

pingouinux

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

J'ai cette version de awk :

$ awk --version
GNU Awk 3.1.8

Extrait de man awk :

--re-interval
              Enable  the  use  of  interval expressions in regular expression
              matching (see Regular Expressions, below).  Interval expressions
              were not traditionally available in the AWK language.  The POSIX
              standard added them, to make awk and egrep consistent with  each
              other.   However, their use is likely to break old AWK programs,
              so gawk only provides them  if  they  are  requested  with  this
              option, or when --posix is specified.

Dernière modification par pingouinux (Le 14/10/2012, à 15:19)

En ligne

#24 Le 14/10/2012, à 15:36

credenhill

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

et en utilisant gawk plutot que awk ?

Hors ligne

#25 Le 14/10/2012, à 18:54

pingouinux

Re : [Résolu] Récupérer dans un tableau chaque ligne d'un fichier lu.

Chez moi, c'est la même chose :

$ type awk gawk
awk is hashed (/usr/bin/awk)
gawk is /usr/bin/gawk

$ md5sum /usr/bin/awk /usr/bin/gawk
6fe07f3bc9ebc52e0cb7705ddc87609a  /usr/bin/awk
6fe07f3bc9ebc52e0cb7705ddc87609a  /usr/bin/gawk

En ligne

Haut de page ↑