Gjest Slettet-t1pvX92QsX Skrevet 17. januar 2014 Del Skrevet 17. januar 2014 Heisann. Jeg har et script her som jeg trenger hjelp til. Jeg er relativt ny innenfor programmering, og definitivt helt ny innen Perl. Målet for scriptet mitt er å bruke ordene som er lagret i 'keyword.txt' og kun hente frem resultater som matcher disse ordene. Jeg skal bruke "syslog" filen i fra Linux og hente ut strenger som inneholder nøkkelordet som er lagret i "keyword.txt" (kan være forskjellige tjenester). Eksempel på hvordan regex strengen matcher i syslog filen: http://regex101.com/r/jT2cM4 Eksempler på hvordan resultatet skal se ut til slutt når det er skrevet til filen: **dhclient:** virtual-machine Jan 15 07:39:36 bound to 192.168.83.135 -- renewal in 816 seconds. dhclient: **dhclient:** virtual-machine Jan 15 07:39:36 bound to 192.168.83.135 -- renewal in 816 seconds. dhclient: **NetworkManager[1478]:** virtual-machine Jan 15 07:39:36 <info> (eth0): DHCPv4 state changed renew -> renew NetworkManager[1478]: **NetworkManager[1478]:** virtual-machine Jan 15 07:39:36 <info> (eth0): DHCPv4 state changed renew -> renew NetworkManager[1478]: Noen tips? 1. Scriptet laster først inn nøkkelord filen "keyword.txt" og lagrer denne i @kw arrayet. 2. Syslog filen hentes inn (som jeg skal hente ut informasjon fra.) 3. Åpner output.txt som skal skrives til. 4. While loop som gjør bruk av regex "^([a-zA-Z]{3}\s\d{2})\s(\d{2}:\d{2}:\d{2})\s(.*?)\s(.*?)\s(.*)" som fanger alt som ligger mellom åpne mellomrom og deler dem inn i grupper som kan brukes senere. 5. Lagrer resultatene fra regex matches i @results arrayet i tillegg til at keys blir lagt til for å separere gruppene. 6. Jeg vil lage en if statement der jeg vil hente inn informasjonen fra 'keyword.txt" filen. Jeg vil her bruke informasjonen fra keywords filen og kun filtrere ut det som matcher disse i henhold til syslog filen. "networkmanager", "dhclient", "kernel" etc hvor dette blir lagret i output filen. 7. print OUTPUT "**$4** $3 $1 $2 $5 $4"."\n"; her har jeg sortert rekkefølgen på resultatene jeg har allerede lagret fra regex. use strict; use warnings; $|=1; sub main { 1# # Open the keyword file for reading. open FILE, 'keyword.txt' or die "Can't open file: $!\n"; my @kw = <FILE>; 2# # Open the syslog file for reading. my $input = '/var/log/syslog'; open(INPUT, $input) or die("Input file $input not found.\n"); 3# # Open the output file for writing. my $output = 'output.txt'; open(OUTPUT, '>'.$output) or die "Can't create $output.\n"; 4# # Read the input file one line at a time. while(my $line = <INPUT>) { # Regex to capture between spaces. for($line =~ /^([a-zA-Z]{3}\s\d{2})\s(\d{2}:\d{2}:\d{2})\s(.*?)\s(.*?)\s(.*)/g) { #5 # Stores the results of the regex in the array. my @results; my ($key1, $key2, $key3, $key4, $key5) = ($1, $2, $3, $4, $5); # Pushes the keys in the array @results. push @results, { key1 => $key1, key2 => $key2, key3 => $key3, key4 => $key4, key5 => $key5, }; #6 # Match the keyword file and only print matches from it. Save to file. #7 print OUTPUT "**$4** $3 $1 $2 $5 $4"."\n"; } } } close(INPUT); close(OUTPUT); close(OUTPUT); } main(); Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå