grepping para vários itens

1

Tenho cerca de 6 itens dos quais eu preciso extrair e o arquivo de despejo básico do LDAP

fullName:
uid:
email:
...

os dois pontos são necessários para a pesquisa, principalmente porque o uid aparece em vários lugares no arquivo, mas o uid: é o que eu preciso. Eu tentei escapar do cólon, mas qualquer combinação que eu use poderia aumentar o primeiro item de pesquisa, mas não o segundo item. Então eu tenho mais três ou quatro itens para adicionar à lista.

saída existente:

gw1:~ # cat dump2.txt|awk "/email:/" && "/fullName:/"
-bash: /fullName:/: No such file or directory

gw1:~ # cat dump2.txt|grep -e "email:" -e "fullName:"
fullName: LDAP Proxy2
fullName: Student Email Administrator
fullName: Richard C. Holly
fullName: Jene E. Brown

resultado esperado:

gw1:~ # cat dump2.txt|awk "/email\:/" print{','} && "/fullName\:/" print{','} && "/gid\:/"
email: [email protected] , fullName: LDAP Proxy2, gui: 987

Anote o formato csv.

    
por brad 02.10.2014 / 07:01

2 respostas

3

Vamos começar com um arquivo de entrada de amostra:

$ cat dump.txt
some: other
email: [email protected]
fullName: LDAP Proxy2
gui: 987
other: thing

Para extrair as linhas desejadas e reformatá-las como CSV:

$ awk '/email:|fullName:|gui:/{s=s", "$0} END{print substr(s,3)}' dump.txt
email: [email protected], fullName: LDAP Proxy2, gui: 987

Como funciona:

  • /email:|fullName:|gui:/{s=s", "$0}

    Esta é uma condição seguida por uma declaração. A condição é a expressão regular /email:|fullName:|gui:/ , que é verdadeira apenas para linhas que contêm uma das strings que você está procurando. Em expressões regulares, o símbolo | significa lógica-ou.

    Se a condição for verdadeira, a instrução será executada. A instrução faz com que uma vírgula, um espaço, a linha atual seja anexada à variável s .

    awk implicitamente percorre todas as linhas do arquivo e o acima é executado em cada linha.

  • END{print substr(s,3)}

    Quando terminarmos de ler o arquivo de entrada, queremos imprimir todos, exceto os dois primeiros caracteres de s . Os dois primeiros caracteres são "," que são supérfluos. A função substr é usada para removê-los.

Saída de amostra

Usando o arquivo que você forneceu em paste.ee e selecionando para os campos que você especificou nos comentários ("mail: "," fullName "e" uid "), eu obtenho:

$ awk '/mail:|fullName:|uid:/{s=s", "$0} END{print substr(s,3)}' dump.txt
mail: [email protected], uid: pgroce, fullName: Patti K. Groce

Todos os campos são encontrados.

Entrada com campos em branco

De acordo com os comentários, considere dump3.txt , que tem algumas entradas em branco no final:

$ cat dump3.txt
other: thing
mail: [email protected]
uid: pgroce
fullName: Patti K. Groce
mail:
mail:
Other: Thing
mail:
$ awk '/mail:|fullName:|uid:/{s=s", "$0} END{print substr(s,3)}' dump3.txt
mail: [email protected], uid: pgroce, fullName: Patti K. Groce, mail:, mail:, mail:

Conforme solicitado, as entradas vazias são impressas como entradas vazias.

    
por 02.10.2014 / 07:09
0

Você pode analisar todo o arquivo em um hash Perl e imprimir os campos obrigatórios (dados como argumentos de entrada após o nome do arquivo):

perl -nle '
    BEGIN{
        $input_file = shift;
        $required_fields = shift
    }
    my ($field,$val) = split/:/;
    next unless defined $field; #Skip lines with no field names
    $fields{$field} = $val;
    END{
        print join ",",@fields{split/,/,$required_fields}
    }' your_file 'email,fullName,gui'
    
por 02.10.2014 / 08:40