Imprime palavras / números específicos através de comandos grep / cut

7

Eu tenho um arquivo test.txt , que contém o seguinte resultado:

service_name1= apple/ball/cat/dog/egg/12.34.56/ball/apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl

e assim por diante até service_name1500

Eu quero saída como:

egg 12.34.56
joker 23.45.67

e assim por diante: o número da versão junto com a palavra antes disso.

    
por Donald 23.11.2016 / 11:37

6 respostas

10

Este deve ser um trabalho simples de cut :

cut -d/ -f5,6 --output-delimiter=" "
  • -d/ define o delimitador de entrada como /
  • -f5,6 produz apenas o 5º e o 6º campo
  • --output-delimiter=" " define o delimitador de saída como um espaço

A mesma coisa com awk , awk por padrão define o separador do campo de saída como espaço:

awk -F/ '{print ,}'

Exemplo:

% cat file.txt
service_name1= apple/ball/cat/dog/egg/12.34.56/ball/apple
service_name2= fan/girl/house/ice/joker/23.45.67/fan/girl

% cut -d/ -f5,6 --output-delimiter=" " file.txt
egg 12.34.56
joker 23.45.67

% awk -F/ '{print ,}' file.txt
egg 12.34.56 
joker 23.45.67
    
por heemayl 23.11.2016 / 12:03
8

a sed solution (funciona se a posição do campo da string da versão é consistente ou não, mas a forma da string da versão deve ser consistente)

$ sed -r 's#.*/(.*)/([0-9]{2}\.[0-9]{2}\.[0-9]{2}).*# #' test.txt
egg 12.34.56

joker 23.45.67

Explicação

  • -r usa ERE, portanto, não precisamos escapar de () metacaracteres
  • s#old#new# encontra o padrão old e substitui por new
  • .* corresponde a nenhum ou nenhum caractere nesta posição
  • (stuff) lembre-se de stuff para mais tarde
  • [0-9]{2}\.[0-9]{2}\.[0-9]{2} um padrão de [2 dígitos]. [2 dígitos]. [2 dígitos]
  • os dois padrões lembrados com um espaço entre
por Zanna 23.11.2016 / 11:44
5

Isso fará isso:

cut -d'/' -f5-6 test.txt | tr -s "/" " "
    
por Soren A 23.11.2016 / 11:43
3

Se você lida com posições de palavras fixas, isso funcionaria:

grep -e 'service_name[0-9]*=' test.txt|awk -F'/' '{ print " " }'
    
por 0x0C4 23.11.2016 / 11:43
2
$sed -r 's/.*\/([[:alpha:]]+)\/([\.0-9]*)\/.*/ /' test.txt

Explicação:

  • .* no início e no final corta todos os caracteres que não correspondem aos seguintes
  • O primeiro subgrupo ([[:alpha:]]+) entre colchetes corresponde apenas a caracteres alfabéticos
  • \/ corresponde a uma barra que será cortada
  • o próximo subgrupo ([\.0-9]*) corresponde a números e pontos e os armazena no segundo registro
  • após a barra única / vem a substituição com insere o primeiro e o segundo registro dos subgrupos correspondentes
por SeDav 23.11.2016 / 11:56
1

Uma linha longa e funcional de python:

$ python -c "import sys;print '\n'.join([ ' '.join(l.strip().split('/')[4:6]) for l in sys.stdin])" < input.txt          
egg 12.34.56
joker 23.45.67

Como funciona:

  • redirecionar o arquivo de entrada com < para o fluxo de stdin do python
  • use a compreensão da lista [item for item in sequence] para ler stdin linha por linha
  • .split() nos permite dividir as linhas na lista de palavras usando / como separador
  • extraia as palavras 4 e 5 (o [4: 6] indica que o último número não é inclusivo) e crie uma string usando ' '.join()
  • ter feito uma lista de strings que queremos, transformá-las em linhas usando '\n'.join() e imprimir tudo
por Sergiy Kolodyazhnyy 14.01.2017 / 14:58