O que é um comando unix para excluir os primeiros N caracteres de uma linha?

238

Por exemplo, eu posso querer:

tail -f logfile | grep org.springframework | <command to remove first N characters>

Eu estava pensando que trpoderia ter a capacidade de fazer isso, mas não tenho certeza.

les2
fonte

Respostas:

355

Use cut. Por exemplo. para remover os 4 primeiros caracteres de cada linha (ou seja, comece no 5º caractere):

tail -f logfile | grep org.springframework | cut -c 5-
iammichael
fonte
1
você tem alguma idéia de por que o cano não funciona? quando executo essencialmente esse comando, 'cut' não imprime os resultados em stdout ... se eu apenas executar 'tail -f logfile | cut -c 5' eu posso ver os resultados ... o problema deve ser com grep eu estou usando cygwin FYI graças
les2
o que acontece se você não adicionar o último tubo e cortar? basicamente, se você remover a última parte da linha?
LB40 09/06/09
ele "arrasta" o arquivo de log, filtrando-o com grep (ou seja, todas as linhas com "org.springframework" nelas são impressas em stdout) quando adiciono o pipe para 'cortar' ... ele trava NO ENTANTO, se eu eliminar 'grep' o 'cut' funciona corretamente ... eu estou pensando errado de algo com a forma como eu estou usando grep ... poderia ser uma coisa cygwin também
les2
1
oh entendo ... por que você usa cauda? basta fazer grep arquivo de registro org.springframework | cut -c 5, mas eu acho que o sed é mais agradável :-)
LB40
6
O problema é que o grep está armazenando em buffer grandes pedaços antes de enviá-los para o corte, pois pode ver que não está gravando em um terminal. Use grep --line-buffered "org.springframeworkpara resolver esse problema.
Steen Schütt 07/07
48
sed 's/^.\{5\}//' logfile 

e você substitui 5 pelo número que você quer ... deve fazer o truque ...

EDITAR se para cada linha sed 's/^.\{5\}//g' logfile

LB40
fonte
29

Você pode usar cut:

cut -c N- file.txt > new_file.txt

-c: personagens

file.txt: Arquivo de entrada

new_file.txt: arquivo de saída

N-: Caracteres de N ao final a serem cortados e enviados para o novo arquivo.

Também pode ter outros argumentos, como: 'N', 'N-M', '-M', que significa enésimo caractere, enésimo a mésimo caractere, primeiro ao mésimo caractere, respectivamente.

Isso executará a operação para cada linha do arquivo de entrada.

Ankur
fonte
4
tail -f logfile | grep org.springframework | cut -c 900-

removeria os primeiros 900 caracteres

cut usa 900- para mostrar o 900º caractere no final da linha

no entanto, quando eu canalizo tudo isso através do grep, não recebo nada

les2
fonte
4
"cut -c 1-900" não "removerá os primeiros 900 caracteres" - deixará apenas os primeiros 900 caracteres. Se você quiser remover o primeiro 900 caracteres, use "cut -c 901-"
iammichael
também os primeiros 900 caracteres em cada linha, por resposta de @ iammichael
Blair Conrad
1
'cut -c 900- "removerá os primeiros 899 caracteres, não é?
Yiding Zhou
4

Eu acho awkque seria a melhor ferramenta para isso, pois ele pode filtrar e executar as funções de manipulação de string necessárias em linhas filtradas:

tail -f logfile | awk '/org.springframework/ {print substr($0, 6)}'

ou

tail -f logfile | awk '/org.springframework/ && sub(/^.{5}/,"",$0)'
John B
fonte
1

Aqui está uma função simples, testada no bash. O primeiro parâmetro da função é string, o segundo parâmetro é o número de caracteres a serem removidos

function stringStripNCharsFromStart { echo ${1:$2:${#1}} }

Uso: insira a descrição da imagem aqui

Para Kra
fonte
2
você pode simplificar isso para fazer eco de $ {1: $ 2}
kdubs 12/04/19