![]() |
|
|
google unix.com
|
|||||||
| Fóruns | Registar | Fórum Regimento | Ligações | Álbuns | FAQ | Lista deputados | Calendário | Pesquisa | Today's Posts | Mark Forums Read |
| Programação Shell Script e Post perguntas sobre ksh, CSH, SH, BASH, Perl, PHP, SED, Awk e outros scripts shell e shell scripts línguas aqui. |
Mais UNIX e Linux Fórum Tópicos Você pode achar Helpfull
|
||||
| Fio | Thread Starter | Fórum | Respostas | Última postagem |
| Shell script para extração de um arquivo texto | vignesh53 | Programação Shell Script e | 3 | 02-05-2008 08:16 |
| Relatório baseado na extração arquivo Data gama | Ganapati | Programação Shell Script e | 2 | 07-13-2006 12:26 |
| data de extracção a partir de um arquivo em ksh | homer_hn | Programação Shell Script e | 6 | 04-21-2006 02:51 |
| precisam de ajuda anexando linhas / combinando linhas dentro de um arquivo ... | mr_manny | Programação Shell Script e | 2 | 01-06-2006 06:45 |
| ajudar no processo extração | apalex | UNIX para Dummies Perguntas & Respostas | 1 | 05-01-2001 11:29 |
![]() |
|
|
Linkback | Thread Tools | Pesquisar este Thread | Rate Thread | Display Modes |
|
|
|
||||
|
Extracção de várias linhas de um arquivo hugh
Caros colegas,
Tenho um enorme arquivo gerado pelo comando "whois" para centenas de IPs. Cada seção do arquivo começa com [Busca Whois Gostaria de extrair as linhas que começam com qualquer uma destas palavras: [Busca whois, OrgName, NetRange, inetnum, descr, o proprietário, o País na mesma secção. Entrada: [Busca whois.XJHIOUIIOOPIOP] OrgName: Universidade de C OrgID: U1 Endereço: OIT Endereço: NH Cidade: BC StateProv: XY CEP: 000000 País: MN NetRange: XXX.YYY.MN - XXX.YYY.MQ CIDR: LMANERIE NetName: UC [Busca whois.ABCE.TSD] % Direitos restringidos por direitos autorais. Ver% % Nota: Esta saída foi filtrada. Para receber% da produção para uma atualização de dados, use o "-B" flag inetnum: XXX.YYY.MN - XXX.YYY.MQ netname: NET-C descr: MP descr: A Universidade país: PQ admin-c: Tye tech-c: SDF estado: FGRG mnt-by: FSDGFG fonte: FGDFSG papel: OPRROKROTR Endereço: A Universidade endereço: DJFIEJRE endereço: DIJAIRJEJ endereço: EIREROERE Necessário saída: [Busca whois.BUHIOUJIOU] OrgName: HHHHHHHHHH (pode ou não presente) NetRange: TTTTTTTTT (pode ou não presente) inetnum: FTYFYYYUII (pode ou não presente) descr: HIJKJKLLKL (Será melhor se apenas primeira ocorrência) proprietário: JHKJOJOIPI (pode ou não presente) País: OIOPOPOP (1 ª ocorrência) Obrigado No que diz respeito |
|
||||
|
Diferentes registradores utilizam diferentes formatos de saída. Portanto, a menos que você esteja pesquisando um conjunto muito limitado de domínios, por exemplo, todos os domínios registrados por uma pessoa, ou por outras razões todos os inscritos no mesmo registo, ou apenas um pequeno conjunto de registradores, isto pode revelar-se mais complexa do que você pensou .
Talvez fosse útil como um primeiro passo para separar as entradas de arquivos diferentes dependendo do [Busca ... linha? Experimente o csplit comando para isso. Então, você pode criar um parser para cada um dos formatos que você encontrar lá dentro. Como você sabe quando parar? Muitas vezes, um recorde que incluirá hierárquica informação (especialmente para a ARIN informação, que é o seu aspecto de ABCE.TSD exemplo), na qual o posterior linhas são mais específicos do que os anteriores. Então muitas vezes você deseja que o linhas mais tarde, e não os anteriores. (Mas isso depende do que você precisa para este, naturalmente.) Enfim, aqui vai uma tentativa de aplicar o seu actual spec. Isto simplesmente escolhe o primeiro de alguma coisa após a Busca linha: Código:
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
(Em retrospectiva, talvez teria sido melhor usar um hash para manter controle dos valores que já são capturados, e não se capturar o hash diz que já temos o que estamos a olhar para um. Empurre a capturou aqueles que se preservar um array ordem é importante.) Última edição por época; em 04/27/2008 08:53.. Motivo: Adicionar / i bandeira para fazer correspondência ignorar caso |
|
||||
|
Caro Era,
Quero que o script deve ter o ficheiro de entrada como uma variável, bem como arquivo de saída. Tenho dois arquivos texto: (1) Lista de pastas em que o script deve trabalho (2) Lista de ficheiros de entrada, em que o script deve funcionar. Devido à falta de Perl conhecimento Tentei vencida. No shell script eu uso: para i em `(gato countries.txt)» fazer para j em `(gato year.txt)» fazer para k em `(gato países / $ i / $ j)» fazer Mesma maneira que eu quero o perl script tomar as inputfile como variável Obrigado |
|
||||
|
Por uma questão de estilo concha codificação, os parênteses são completamente desnecessárias, e outras coisas no backticks funciona mal, se há um nome de arquivo com espaços nele.
Não vejo por que você não pode usar esse script para embrulhar o Perl código, não há nada mais há que Perl faz melhor do que o reservatório, com excepção de não ter de ler o arquivo país uma e outra vez (mas você pode otimizar que, no shell script, também). Mas de qualquer maneira, aqui vai. Eu tenho medo isso é completamente testado. Código:
#!/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 $_ } @_) . "):";
}
|
![]() |
| Marcadores |
| Thread Tools | Pesquisar este Thread |
| Display Modes | Esta taxa Thread |
|
|