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.

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-

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


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.


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


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)'

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


2
Sie können dies vereinfachen, um $ {1: $ 2}
kdubs
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.