Was ist ein Unix-Befehl zum Löschen der ersten N Zeichen einer Zeile?

238

Zum Beispiel möchte ich vielleicht:

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

Ich dachte, das trkönnte die Fähigkeit dazu haben, aber ich bin mir nicht sicher.

les2
quelle

Antworten:

355

Verwenden Sie cut. Z.B. um die ersten 4 Zeichen jeder Zeile zu entfernen (dh mit dem 5. Zeichen zu beginnen):

tail -f logfile | grep org.springframework | cut -c 5-
Ich bin Michael
quelle
1
Haben Sie eine Vorstellung davon, warum das Rohr nicht funktioniert? Wenn ich im Wesentlichen diesen Befehl ausführe, druckt 'cut' die Ergebnisse nicht in stdout ... wenn ich nur 'tail -f logfile | ausführe cut -c 5- 'ich kann die Ergebnisse sehen ... das Problem muss mit grep sein Ich verwende Cygwin FYI danke
les2
Was passiert, wenn Sie nicht das letzte Rohr hinzufügen und schneiden? im Grunde, wenn Sie den letzten Teil der Zeile entfernen?
LB40
Es "tails" die Protokolldatei und filtert sie mit grep (dh alle Zeilen mit "org.springframework" werden in stdout gedruckt), wenn ich die Pipe zum "Ausschneiden" hinzufüge ... es hängt JEDOCH, wenn ich sie eliminiere 'grep' der 'cut' funktioniert richtig ... ich denke, etwas stimmt nicht mit der Verwendung von grep ... könnte auch eine Cygwin-Sache sein
les2
1
Oh, ich verstehe ... warum benutzt du Schwanz? mach einfach grep org.springframework logfile | cut -c 5- aber ich denke sed ist schöner :-)
LB40
6
Das Problem ist, dass grep große Chunks puffert, bevor sie zum Schneiden gesendet werden, da es sieht, dass es nicht in ein Terminal schreibt. Verwenden Sie grep --line-buffered "org.springframework, um dieses Problem zu lösen.
Steen Schütt
48
sed 's/^.\{5\}//' logfile 

und Sie ersetzen 5 durch die gewünschte Zahl ... es sollte den Trick machen ...

BEARBEITEN, wenn für jede Zeile sed 's/^.\{5\}//g' logfile

LB40
quelle
29

Sie können verwenden cut:

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

-c: Zeichen

file.txt: Eingabedatei

new_file.txt: Ausgabedatei

N-: Zeichen von N bis Ende werden ausgeschnitten und in die neue Datei ausgegeben.

Kann auch andere Argumente haben wie: 'N', 'N-M', '-M', was das n-te Zeichen, das n-te bis m-te Zeichen bzw. das erste bis m-te Zeichen bedeutet.

Dadurch wird die Operation für jede Zeile der Eingabedatei ausgeführt.

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

würde die ersten 900 Zeichen entfernen

cut verwendet 900-, um das 900. Zeichen bis zum Ende der Zeile anzuzeigen

Wenn ich das alles durch grep leite, bekomme ich nichts

les2
quelle
4
"cut -c 1-900" entfernt nicht "die ersten 900 Zeichen" - es bleiben nur die ersten 900 Zeichen übrig. Wenn Sie die ersten 900 Zeichen entfernen möchten, verwenden Sie "cut -c 901-"
iammichael
Außerdem sind es die ersten 900 Zeichen in jeder Zeile, gemäß @ iammichaels Antwort
Blair Conrad
1
'cut -c 900- "entfernt die ersten 899 Zeichen, nein?
Yiding Zhou
4

Ich denke, dies awkwäre das beste Werkzeug, da es die erforderlichen Zeichenfolgenmanipulationsfunktionen für gefilterte Zeilen sowohl filtern als auch ausführen kann:

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

oder

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

Hier ist eine einfache Funktion, die in Bash getestet wurde. Der erste Parameter der Funktion ist die Zeichenfolge, der zweite Parameter ist die Anzahl der zu entfernenden Zeichen

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

Verwendung: Geben Sie hier die Bildbeschreibung ein

Zu Kra
quelle
2
Sie können dies vereinfachen, um $ {1: $ 2}
kdubs