Che cos'è un comando unix per eliminare i primi N caratteri di una riga?


238

Ad esempio, potrei voler:

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

Stavo pensando che trpotrebbe avere la possibilità di farlo, ma non ne sono sicuro.

Risposte:


355

Usa cut. Per esempio. per eliminare i primi 4 caratteri di ogni riga (ovvero iniziare dal 5 ° carattere):

tail -f logfile | grep org.springframework | cut -c 5-

1
hai idea del perché la pipa non funziona? quando eseguo essenzialmente quel comando, 'cut' non stampa i risultati su stdout ... se ho appena eseguito 'tail -f logfile | cut -c 5- 'posso vedere i risultati ... il problema deve essere con grep sto usando cygwin FYI grazie
les2

cosa succede se non si aggiunge l'ultimo tubo e si taglia? in sostanza, se rimuovi l'ultima parte della linea?
LB40

"codifica" il file di log, filtrandolo con grep (ovvero, tutte le righe con "org.springframework" sono stampate su stdout) quando aggiungo la pipe per "tagliare" ... si blocca TUTTAVIA, se elimino 'grep' il 'taglio' funziona correttamente ... sto pensando che qualcosa non va nel modo in cui sto usando grep ... potrebbe anche essere una cosa cygwin
les2

1
oh capisco ... perché usi la coda? basta fare grep org.springframework logfile | taglia -c 5- ma penso che sed sia più bello :-)
LB40

6
Il problema è che grep sta eseguendo il buffering di grossi blocchi prima di inviarli per tagliare perché può vedere che non sta scrivendo su un terminale. Utilizzare grep --line-buffered "org.springframeworkper risolvere quel problema.
Steen Schütt,

48
sed 's/^.\{5\}//' logfile 

e sostituisci 5 con il numero che vuoi ... dovrebbe fare il trucco ...

MODIFICA se per ogni riga sed 's/^.\{5\}//g' logfile


29

Puoi usare cut:

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

-c: personaggi

file.txt: file di input

new_file.txt: file di uscita

N-: I caratteri da N alla fine devono essere tagliati e inviati al nuovo file.

Può anche avere altri argomenti come: 'N', 'N-M', '-M' che significa ennesimo carattere, dall'ennesimo al nono carattere, rispettivamente dal primo al nono carattere.

Ciò eseguirà l'operazione su ciascuna riga del file di input.


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

rimuoverebbe i primi 900 caratteri

cut usa 900- per mostrare il 900 ° carattere alla fine della riga

comunque quando installo tutto questo attraverso grep non ottengo nulla


4
"cut -c 1-900" non "rimuoverà i primi 900 caratteri" - lascerà solo i primi 900 caratteri. Se vuoi rimuovere i primi 900 caratteri, usa "cut -c 901-"
iammichael

inoltre sono i primi 900 caratteri su ogni riga, per la risposta di @ iammichael
Blair Conrad,

1
'cut -c 900- "rimuoverà i primi 899 caratteri, no?
Yiding Zhou

4

Penso che awksarebbe lo strumento migliore per questo in quanto può sia filtrare che eseguire le necessarie funzioni di manipolazione delle stringhe su linee filtrate:

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

o

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

1

Ecco una funzione semplice, testata in bash. Il primo parametro della funzione è stringa, il secondo parametro è il numero di caratteri da eliminare

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

Uso: inserisci qui la descrizione dell'immagine


2
puoi semplificarlo per fare eco $ {1: $ 2}
kdubs il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.