Extrai uma parte de uma linha de um arquivo com sed

12

Eu quero ler uma parte de uma linha de um arquivo. Por exemplo:

POP3_SERVER_NAME = localhost

Quero devolver apenas localhost , usando sed.

Este texto está na terceira linha. Eu faço isso para extrair a linha:

sed -n '3p' installation.sh

Como eu extraio apenas a parte localhost ?

    
por Mercer 30.07.2013 / 17:18

7 respostas

18

o awk pode ser uma ferramenta melhor aqui.

$ cat test.dat
LINE 1
LINE 2
POP3_SERVER_NAME = localhost

Pesquise linhas que contenham "POP3_SERVER_NAME"; imprima o último campo. Isso não depende de POP3_SERVER_NAME estar sempre na linha 3, o que provavelmente é uma coisa boa.

$ awk '/POP3_SERVER_NAME/{print $NF}' test.dat
localhost

Dependendo do seu aplicativo, talvez seja necessário tornar a expressão regular mais rigorosa. Por exemplo, você pode querer corresponder apenas a linha que começa com POP3_SERVER_NAME.

$ awk '/^POP3_SERVER_NAME/{print $NF}' test.dat
localhost

O uso do sed é um pouco menos intuitivo. (Obrigado, estou ciente da ironia.) Enderece a linha que contém POP3_SERVER_NAME em qualquer lugar. Substitua uma string vazia por todo o texto desde o início da linha até o espaço opcional após "=". Então imprima.

sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat
    
por 30.07.2013 / 21:03
6

Substitua o comando p por uma substituição que remova a parte indesejada da linha.

sed -n '3 s/^[^=]*= *//p' installation.sh

Você pode querer corresponder a linha por palavra-chave e não por posição.

sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh
    
por 31.07.2013 / 03:04
4
echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost

Ou se você tiver o conteúdo em um arquivo:

sed 's/.*= //' somefile.txt
localhost
    
por 30.07.2013 / 17:19
3

Parece que você tem um arquivo de configuração. O que você poderia fazer é semelhante ao que Adam Siemeon / slm sugere:

sed -nr 's/[^=]+=\s*(.+)$//p' filename

onde [^=] exclui todos os caracteres '=', + diz um ou mais do mesmo tipo de caractere, isso é seguido por um% real = , \s de qualquer espaço em branco (incluindo tabulações \t e novo linhas \n , \r\n e espaços simples '', enquanto * significa zero ou mais do mesmo tipo, parênteses capturam o que está dentro para colocar as seqüências de caracteres correspondentes em \ 1, \ 2, ..., \ n placeholders de substituição, $ significa o fim de uma linha, seguindo o padrão típico de substituição: s/.../.../modifiers A opção de linha de comando -r significa sintaxe de regex estendida (por uma questão de conveniência) e -n significa produzir nada até ou a menos que seja explicitamente solicitado. O modificador p imprime o resultado.

Você pode fazer uma pesquisa global com o modificador g , como:

sed -nr 's/[^=]+=\s*(.+)$/ /pg' filename  # note the space after 

para que você obtenha uma string separada por ' ' (pode ser \n , \t ou o que você tem) que você pode processar facilmente.

Ambos são válidos desde que seus valores precedidos pelo caractere da equação se estendam até o final de uma linha e não sejam seguidos por comentários ou outros caracteres com semântica que se desvie de um simples "valor".

Editar:

Ainda não posso comentar aqui nas mensagens de outros. Para indicar a linha basta passar o número da linha, no seu caso 3, antes de s ou antes do caracter de citação inicial (assim como no vim).

sed -nr '3s/[^=]+=\s*(.+)$//p' filename

Por favor, dê uma olhada em info sed . Por exemplo, 3.2 e 4.7 são de particular interesse para você.

    
por 30.07.2013 / 18:16
3

Você pode usar o comando cut, definir o delimitador como '=' e depois imprimir o segundo campo assim:

cut -d'=' -f2
    
por 22.03.2015 / 16:19
2

Várias maneiras de fazer isso, considerando que seu arquivo é chamado de foobar :

Especifique o padrão para pesquisar:

PAT=POP3_SERVER_NAME

Extraia usando sed

sed -n "/$PAT/p" foobar | sed "s/$PAT = //"

Ou usando sed e cut

sed -n "/$PAT/p" foobar | cut -d' ' -f3
    
por 30.07.2013 / 21:31
1

A beleza do Linux / Unix é que geralmente há mais de uma maneira de realizar algo. No caso do op, existem pelo menos quatro maneiras diferentes de extrair o nome do servidor POP do arquivo:

  1. grep POP3_SERVER_NAME installation.sh | cut -d'=' -f2
  2. grep POP3_SERVER_NAME installation.sh | awk '{print $3}'
  3. grep POP3_SERVER_NAME installation.sh | sed 's/.*= //'
  4. sed -n 's/^.*POP3_SERVER_NAME = //p' installation.sh
por 15.03.2017 / 10:46

Tags