awk / sed para imprimir apenas até o caractere sublinhado

10

Como posso usar o awk ou sed para imprimir uma string apenas até o primeiro caractere sublinhado?

Antes:

host100_044 2
host101_045 2
host102_046 2

Depois de:

host100
host101
host102
Rubstr
fonte

Respostas:

20

Isso pode ser feito com cut:

cut -d _ -f 1

por exemplo

$ echo host100_044 2 | cut -d _ -f 1
host100

Também com awkpode ser feito com awk -F_ '{print $1}'(provavelmente existe uma maneira mais limpa de fazer isso)

Renan
fonte
@ Renan Como modifico essa função de corte se quero que a saída contenha todas as informações de entrada, além de executar o corte?
BIOMAN
2

Outra alternativa para sed:

echo 'host100_044 2' | sed 's/^\(.*\)_.*$/\1/'

Se você os tiver em um arquivo, poderá chamá-lo da seguinte maneira;

cat fileName | sed 's/^\(.*\)_.*$/\1/'
scriptmonster
fonte
1
echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} {printf("host%s ", $1)}'  | cut -d ' ' -f2-

Resultado:

host100 host101 host102

Com novas linhas:

echo host100_044 2 host101_045 2 host102_046 2| sed 's/_/ /g' | awk 'BEGIN { RS="host"} $1 ~ /[0-9]/ {print "host"$1}'

Resultado:

host100
host101
host102
jftuga
fonte
1

Usando sed:

echo host100_044 2 | sed 's;_.*;;'


Usando a sedopção de edição no local,

sed -i.old 's;_.*;;' infile
Prince John Wesley
fonte
Estava apenas escrevendo o mesmo, mesmo que a awksolução já esteja publicada (e cutprovavelmente seja a melhor neste caso), já que ele perguntou sed, mas você me venceu com segundos :-). Você pode até remover o $, pois ele corresponderá .*ao final da linha por padrão.
Daniel Andersson
@DanielAndersson: sim.
Prince John Wesley
1
$ echo "host100_044 2" | awk -F'_' '{print $1}'
host100

Os -F'_'instrui awka usar sublinhados como delimitadores de campo. O awkscript em si apenas imprime o primeiro campo.

Sergey Fadeev
fonte
0

Isso imprimirá a saída antes _:

sed 's/_.*//' -filename

y.kashyap007
fonte