![]() |
Hei og Velkommen fra USA til UNIX og Linux Forums! Takk for besøket og Delta i vårt globale samfunn.
|
|
google unix.com
|
|||||||
| Forums | Registrer | Forum Rules | Lenker | Album | FAQ | Medlemsliste | Kalender | Søke | Dagens innlegg | Marker forumene som lest |
| Shell programmering og Skripting Post spørsmål om ksh, csh, SH, Bash, Perl, PHP, SED, awk og ANDRE shell scripts og Shell skriptespråk her. |
Mer UNIX og Linux Forum Emner Du kan finne nyttig
|
||||
| Tråd | Tråd startet | Forum | Svar | Siste innlegg |
| Shell script for tekst extraction fra en fil | vignesh53 | Shell programmering og Skripting | 3 | 02-05-2008 08:16 |
| Rapportfilen utvinning basert på Datoperiode | ganapati | Shell programmering og Skripting | 2 | 07-13-2006 12:26 |
| dato-utvinning fra en fil i ksh | homer_hn | Shell programmering og Skripting | 6 | 04-21-2006 02:51 |
| trenger hjelp til å legge linjer / kombinere linjer i en fil ... | mr_manny | Shell programmering og Skripting | 2 | 01-06-2006 06:45 |
| Hjelp på filen extraction | apalex | UNIX for Dummies Spørsmål og svar | 1 | 05-01-2001 11:29 |
![]() |
|
|
LinkBack | Thread Tools | Søk i denne tråden | Rate Thread | Visningsmoduser |
|
|
|
||||
|
Utvinning av forskjellige linjer fra et Hugh fil
Kjære medlemmer,
Jeg har en stor fil som genereres av kommandoen "whois for hundre av IP-adresser. Hvert avsnitt i filen starter med [Søk whois Jeg vil trekke ut de linjene som starter med disse ordene: [søk whois, OrgName, NetRange, inetnum, descr, eier, land i denne delen. Input: [Søk whois.XJHIOUIIOOPIOP] OrgName: Universitetet i C OrgID: U1 Adresse: OIT Adresse: NH By: BC StateProv: XY Postnummer: 000000 Land: MN NetRange: XXX.YYY.MN - XXX.YYY.MQ CIDR: LMANERIE NetName: UC [Søk whois.ABCE.TSD] % Rights begrenset av opphavsrett. % Se % Merk: Denne produksjonen har blitt filtrert. % For å få resultater for en database oppdateringen, bruker du "-B" flag inetnum: XXX.YYY.MN - XXX.YYY.MQ netname: NET-C descr: HB descr: University Land: PQ admin-c: Tye tech-c: SDF status: FGRG mnt-by: FSDGFG Kilde: FGDFSG rolle: OPRROKROTR Adresse: University Besøksadresse: DJFIEJRE Besøksadresse: DIJAIRJEJ Besøksadresse: EIREROERE Nødvendig effekt: [Søk whois.BUHIOUJIOU] OrgName: HHHHHHHHHH (kanskje ikke) NetRange: TTTTTTTTT (kanskje ikke) inetnum: FTYFYYYUII (kanskje ikke) descr: HIJKJKLLKL (Det vil være bedre hvis bare første forekomsten) Eier: JHKJOJOIPI (kanskje ikke) Land: OIOPOPOP (1. forekomst) Takke deg Med hensyn |
|
||||
|
Ulike registratorene bruke ulike utgangsformater. Så med mindre du er søkene et svært begrenset antall domener, for eksempel domener alle registrert av en person, eller av andre grunner alle registrerte med samme registrar eller bare et lite sett med registratorer, kan dette vise seg å være mer komplisert enn du tror .
Kanskje det ville være nyttig som et første skritt for å skille oppføringene til forskjellige filer, avhengig av [Søk ... linjen? Prøv csplit kommandoen for det. Deretter kan du opprette en parser for hver av de formatene du finner der inne. Hvordan vet du når du skal stoppe? Ofte en posten vil inneholde hierarkisk informasjon (spesielt for ARIN informasjon, som er hva ABCE.TSD eksempel ser slik ut) som senere linjene er mer spesifikk enn den tidligere dem. Så du ofte vil senere linjene, ikke i tidligere meldinger. (Men dette avhenger av hva du trenger dette for, selvsagt.) Allikevel, her er et forsøk på å implementere gjeldende spec. Dette bare plukker ut den første av noe etter søk linje: Code:
perl -ne 'if (/^\[Querying/) {
print; @wanted = qw(OrgName NetRange inetnum descr owner Country);
$wanted = &wanted(@wanted);
}
sub wanted {
return "^(" . join ("|", map { quotemeta $_ } @_) . "):";
}
if ($wanted && $_ =~ m/$wanted/i) {
print;
@wanted = grep { $_ ne $1 } @wanted;
$wanted = @wanted ? &wanted(@wanted) : "";
}' file
(I ettertid, kanskje det ville vært bedre å bruke en hash å holde oversikt over hvilke verdier som allerede er tatt, og ikke fange hvis nummerverdien sier vi allerede har det vi ser på. Skyv tatt seg til en matrise om å bevare rekkefølge er viktig.) Sist endret av æra; 04-27-2008 på 08:53.. Reason: Legg til / i flagget å gjøre målrettet ignorere saken |
|
||||
|
Kjære Era,
Jeg vil skriptet bør ta inndatafilen som en variabel samt utdatafilen. Jeg har to tekstfiler: (1) Liste over mapper der skriptet skal fungere (2) Liste over input filer som skriptet skal fungere. På grunn av manglende Perl kunnskap jeg prøvde mislykket. I Shell skript jeg bruker: for i in `(cat countries.txt)` gjøre for j i `(cat year.txt)` gjøre for k i `(cat land / $ i / $ j)` gjøre Samme måte som jeg vil ha den perl script ta inndatafil som variabel Takk |
|
||||
|
Som et spørsmål om shell koding stil, parentesene er helt unødvendig, og greier i backticks fungerer dårlig hvis det er et filnavn med mellomrom i den.
Jeg ser ikke hvorfor du ikke kunne bruke den shell script å bryte Perl kode; det er ikke mye det som Perl fungerer bedre enn skallet, annet enn ikke å måtte lese landet filen igjen og igjen (men du kan optimalisere det i shell script, too). Men likevel, her går. Jeg er redd dette er helt utestet. Code:
#!/usr/bin/perl
die "Usage: $0 dir yearfile countryfile" unless (@ARGV == 3);
open (Y, "$ARGV[1]") || die "$0: Could not open $ARGV[1]: $!\n";
open (C, "$ARGV[2]") || die "$0: Could not open $ARGV[2]: $!\n";
my @countries = <C>;
close C;
while ($year = <Y>) {
for $country (@countries) {
handle ("$ARGV[0]/$year/$country");
}
}
close Y;
sub handle {
my ($file) = @_;
open (F, $file) || die "$0: Could not open $file: $!\n";
while (<F>) {
if (/^\[Querying/) {
print; @wanted = qw(OrgName NetRange inetnum descr owner Country);
$wanted = &wanted(@wanted);
}
if ($wanted && $_ =~ m/$wanted/i) {
print;
@wanted = grep { $_ ne $1 } @wanted;
$wanted = @wanted ? &wanted(@wanted) : "";
}
close F;
}
}
sub wanted {
return "^(" . join ("|", map { quotemeta $_ } @_) . "):";
}
|
![]() |
| Hugseliste |
| Thread Tools | Søk i denne tråden |
| Visningsmoduser | Ranger denne tråden |
|
|