Obter conteúdo antes de dois pontos

8

Eu tenho um arquivo de texto no Linux, onde o conteúdo é como abaixo:

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com

Quero obter o conteúdo antes dos dois pontos, como abaixo:

help.helloworld.com
dev.helloworld.com

Como posso fazer isso dentro do terminal?

Gabrial Johnas
fonte
2
O greputilitário é usado para procurar linhas que correspondam a expressões regulares. Você poderia usá-lo aqui, mas seria mais apropriado usar uma ferramenta que extrai dados de campos com algum delimitador, como o cututilitário.
Kusalananda
Enviei uma edição para extrair a palavra "grep" e substituí-la por "find" no título e "get" no corpo da pergunta, para evitar o problema X / Y de assumir que grepé a ferramenta certa para resolver o problema real. problema.
Monty Harder
11
Tudo o que posso dizer é que o conteúdo antes dos dois pontos é muito melhor do que o conteúdo depois dos dois pontos ;-).
Peter - Restabelece Monica

Respostas:

35

É para isso que cutserve:

$ cat file
help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
foo:baz:bar
foo

$ cut -d: -f1 file
help.helloworld.com
dev.helloworld.com
foo
foo

Você acabou de definir o delimitador para :with -d:e pedir para imprimir apenas o 1º campo ( -f1).

terdon
fonte
19

Ou uma alternativa:

$ grep -o '^[^:]*' file
help.helloworld.com
dev.helloworld.com

Isso retorna todos os caracteres iniciados no início de cada linha ( ^) que não são dois pontos ( [^:]*).

Freddy
fonte
18

Definitivamente recomendaria awk:

awk -F ':' '{print $1}' file

Usa :como um separador de campos e imprime o primeiro campo.

Centimane
fonte
5

resposta atualizada

Considerando o seguinte arquivo file.txt:

help.helloworld.com:latest.world.com
dev.helloworld.com:latest.world.com
no.colon.com
colon.at.the.end.com:

Você pode usar sedpara remover tudo após os dois pontos:

sed -e 's/:.*//' file.txt

Isso funciona para todos os casos de canto apontados nos comentários - se terminar em dois pontos, ou se não houver dois pontos, embora não tenham sido mencionados na pergunta em si. Obrigado a @Rakesh Sharma, @mirabilos e @Freddy pelos comentários. Responder a perguntas é uma ótima maneira de aprender.

Randy Josleyn
fonte
4
sed -e 's/:.*//' file.txté outra maneira com o Posix sed.
Rakesh Sharma
11
sed -ne 'y/:/\n/;P' file.txttambém pode ser usado.
Rakesh Sharma
Faça .+para.*
Rakesh Sharma
@Randy Joselyn Desde há um implícito ifna s///psintaxe, você precisa modificar seu regex para cuidar de linhas sem dois pontos, algo como: sed -nEe 's/([^:]*)(:.*|)/\1/p'. Note que isso requer, GNU sedmas, de qualquer maneira, você está no GNU sed, portanto isso não deve importar.
Rakesh Sharma
Esta resposta poderia ter sido a minha favorita, mas o ERE é desnecessário. sed -n '/:/s/^\([^:]*\):.*$/\1/p(adicione --posixse você usar o GNU sed, apenas para apesar do extensionismo deles)
mirabilos
4

Requer GNU grep. Não funcionaria com o grep padrão, por exemplo, no macOS ou em qualquer outro BSDs.

Você quer dizer assim:

grep -oP '.*(?=:)' file

Resultado:

help.helloworld.com
dev.helloworld.com
schrodigerscatcuriosity
fonte
4
Se houver dois ou mais dois pontos na linha, isso imprimirá tudo até o último, e não o que o OP precisa. Tente echo foo:bar:baz | grep -oP '.*(?=:)'. Isso funcionará para o exemplo do OP, mas não para o caso geral, conforme descrito na pergunta.
terdon
há apenas uma cólon e sua multa de trabalho, mas graças para a atualização
Gabrial Johnas
-1

Você pode conseguir isso com o manuseio do string bash, removendo a correspondência mais longa do string diretamente para cada linha da seguinte maneira:

for line in $(cat inputfile); do echo "${line%%:*}"; done

Essa pode ser uma alternativa útil se você estiver analisando o arquivo em um script de shell (embora eu suspeite que o uso de cut possa ser mais eficiente).

Jim Rippon
fonte