extraire des lignes d'un fichier de log

extraire des lignes d'un fichier de log - Linux et OS Alternatifs

Marsh Posté le 12-11-2003 à 11:34:27    

Bonjour,
 
j'ai un fichier de log de rsync.
Il faut que je récupère les noms de fichiers transférés.
 
Pour ce faire, je dois prendre, entre 2 lignes,
les noms de fichiers ne se terminant pas par un '/'
.......mais je n'y arrive pas.
Pourtant je pense que ce n'est pas trop compliqué.
 
A une certaine ligne (pas forcément fixe) commence un liste de répertoires et de noms de fichiers.
Cette liste se termine à une ligne qui est aussi inconnue(dépend du nombre de fichiers).
 
Ex:

Code :
  1. Wed Nov 12 00:00:00 CET 2003
  2. PING intranet (192.168.50.108) from 192.168.100.150 : 1(29) bytes of data.
  3. 9 bytes from intranet (192.168.50.108): icmp_seq=1 ttl=63
  4. --- intranet ping statistics ---
  5. 1 packets transmitted, 1 received, 0% loss, time 0ms
  6. building file list ... done
  7. deleting 01_Nomenclatures/V520489097_ArconST_Subrack_2448_120_3000_wiNema/nomenclature_V520489097.htm
  8. deleting 01_Nomenclatures/V520489096_ArconST_Subrack_48_120_300_wiNema/nomenclature_V520489096.htm
  9. deleting 01_Nomenclatures/V511102254_ArconSTI_1250_110_230/nomenclature_V511102254.htm
  10. deleting 01_Nomenclatures/V510489111_SUBRACK_HDS_50A-120V_2U/nomenclature_V510489111.htm
  11. deleting 01_Nomenclatures/V510489110_SUBRACK_HDS_30A-230V_1U/nomenclature_V510489110.htm
  12. .......
  13. ./
  14. 01_Nomenclatures/
  15. 01_Nomenclatures/2399049523_ArconST300230_SubRack/Test_UL.xls
  16. 01_Nomenclatures/3620000000_GROUP_COMPONENT_STI_RDI_1_48/
  17. 01_Nomenclatures/3620000001_GROUP_COMPONENT_RDI_3_48/
  18. 01_Nomenclatures/3620000002_MainBoard_STI_300_48_TCG/archive_res510k.doc
  19. .....
  20. rsync[11057] (sender) heap statistics:
  21.   arena:         311704   (bytes from sbrk)
  22.   ordblks:           10   (chunks not in use)
  23.   smblks:             0
  24.   hblks:              0   (chunks from mmap)
  25.   hblkhd:             0   (bytes from mmap)
  26.   usmblks:            0 
  27.   fsmblks:            0
  28.   uordblks:      286952   (bytes used)
  29.   fordblks:       24752   (bytes free)
  30.   keepcost:        9632   (bytes in releasable chunk)
  31. Number of files: 1911
  32. Number of files transferred: 0
  33. Total file size: 297544312 bytes
  34. Total transferred file size: 0 bytes
  35. Literal data: 0 bytes
  36. Matched data: 0 bytes
  37. File list size: 71980
  38. Total bytes written: 71996
  39. Total bytes read: 20


 
En l'occurence je veux récupérer :

Code :
  1. 01_Nomenclatures/2399049523_ArconST300230_SubRack/Test_UL.xls
  2. 01_Nomenclatures/3620000002_MainBoard_STI_300_48_TCG/archive_res510k.doc


 
J'aimerais faire ceci avec un script shell, pour la facilité de mise à jour.


---------------
Il n'est pas nécéssaire de réussir pour persévérer.
Reply

Marsh Posté le 12-11-2003 à 11:34:27   

Reply

Marsh Posté le 12-11-2003 à 11:40:09    

tu saurais delimiter la zone ou les fichiers se trouvent ?
 
est ce qu'il y a un motif qui peut apparaitre pour dire "là je vais avoir mes fichiers" et "là y en a plus" (il y a des "....." dans ton exemple, sont ils toujours là ?)

Reply

Marsh Posté le 12-11-2003 à 11:44:14    

En fait les fichiers apparaissent systématiquement après :

Code :
  1. building file list ... done


et se terminent avec:

Code :
  1. rsync[11057] (sender) heap statistics:


 
Mais dans cette liste, il y a des noms de fichiers effacés
(qui commentcent par : deleting)
et des noms de répertoires (qui se terminent par '/')
.......je ne veux pas ces 2-ci, seulement les fichiers mis à jour.
 
J'essaye avec awk, grep ......... mais pas moyen.


---------------
Il n'est pas nécéssaire de réussir pour persévérer.
Reply

Marsh Posté le 12-11-2003 à 11:46:04    

En gros, si j'arrive à lister les lignes comprises entre les 2 délimiteurs, je devrais m'en sortir avec grep,
mais je n'arrive pas à fournir la liste de ces lignes à grep.


---------------
Il n'est pas nécéssaire de réussir pour persévérer.
Reply

Marsh Posté le 12-11-2003 à 11:46:12    

T'as essayé de faire quelque chose avec --log-format=FORMAT ?
 

Citation :

This allows you to specify exactly what the rsync client logs to
              stdout on a per-file basis. The log format  is  specified  using
              the  same  format  conventions  as  the  log  format  option  in
              rsyncd.conf


 
 
Voilà le sus-dit format :
 

Citation :

log format
              The  "log  format"  option allows you to specify the format used
              for logging file transfers when transfer logging is enabled. The
              format  is  a  text  string containing embedded single character
              escape sequences prefixed with a percent (%) character.
 
              The prefixes that are understood are:
 
       o      %h for the remote host name
 
       o      %a for the remote IP address
 
       o      %l for the length of the file in bytes
 
       o      %p for the process id of this rsync session
 
       o      %o for the operation, which is either "send" or "recv"
 
       o      %f for the filename
 
       o      %P for the module path
 
       o      %m for the module name
 
       o      %t for the current date time
 
       o      %u for the authenticated username (or the null string)
 
       o      %b for the number of bytes actually transferred
 
       o      %c when sending files this gives the number  of  checksum  bytes
              received for this file
 
              The  default log format is "%o %h [%a] %m (%u) %f %l", and a "%t
              [%p] " is always added to the  beginning  when  using  the  "log
              file" option.
 
              A  perl  script  called  rsyncstats  to summarize this format is
              included in the rsync source code distribution.


Message édité par void_ppc le 12-11-2003 à 11:49:40
Reply

Marsh Posté le 12-11-2003 à 11:48:54    

.......je vais regarder ça


---------------
Il n'est pas nécéssaire de réussir pour persévérer.
Reply

Marsh Posté le 12-11-2003 à 11:56:59    

Code :
  1. perl -ne '$p=0 if (/^rsync\[/);print if ($p==1 && !/^deleting/ && !/\/$/); $p=1 if (/building file list ... done/);' toto.log


Reply

Marsh Posté le 12-11-2003 à 12:03:28    

hum...........parfait !
j'aurais voulu le faire en script shell,
mais je crois que je vais garder ça


---------------
Il n'est pas nécéssaire de réussir pour persévérer.
Reply

Marsh Posté le 12-11-2003 à 14:54:18    

ca peut aussi se faire avec awk ;) c'est a ca que je pensais
 
dans le principe, tu poses un flag quand tu rencontres la ligne "building file list ... done", et si ce flag est validé, tu ne garde que les lignes qui ne commencent pas par delete et ne finissent pas par / ;)
 

Code :
  1. gawk 'BEGIN {files = 0}
  2. /^building file.*/ {files = 1}
  3. /.*heap statistics.*/ {files = 0}
  4. ! ( /deleting .*/ || /.*\\$/ ) { if files==1 then { print $0 } }'


 
bon, le code doit etre foireux, c'est faitr de tete, mais ca doit pouvoir se faire comme ça ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed