Co to jest polecenie unixowe służące do usuwania pierwszych N znaków linii?


238

Na przykład mógłbym chcieć:

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

Myślałem, że trmoże to zrobić, ale nie jestem pewien.

Odpowiedzi:


355

Zastosowanie cut. Na przykład. aby usunąć pierwsze 4 znaki z każdego wiersza (tzn. rozpocząć od piątego znaku):

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

1
masz pojęcie, dlaczego rura nie działa? kiedy uruchamiam w zasadzie to polecenie, „cut” nie drukuje wyników na standardowe wyjście ... jeśli tylko uruchomię plik tail -f plik dziennika | cut -c 5- 'Widzę wyniki ... problem musi być z grep używam cygwin FYI dzięki
les2

co się stanie, jeśli nie dodasz ostatniej rury i nie wycniesz? w zasadzie, jeśli usuniesz ostatnią część linii?
LB40

„ogony” plik dziennika, filtrując go za pomocą grep (tzn. wszystkie linie z „org.springframework” są drukowane na standardowym wyjściu) kiedy dodam rurkę do „wycięcia” ... zawiesza się JEDNAK, jeśli wyeliminuję „grep” „cut” działa poprawnie… myślę, że coś jest nie tak z tym, jak używam grep… może to być również cygwin
les2

1
och, rozumiem ... dlaczego używasz ogona? po prostu zrób grep org.springframework logfile | cut -c 5-, ale myślę, że sed jest ładniejszy :-)
LB40

6
Problem polega na tym, że grep buforuje duże fragmenty przed wysłaniem ich do cięcia, ponieważ widzi, że nie zapisuje na terminalu. Użyj, grep --line-buffered "org.springframeworkaby rozwiązać ten problem.
Steen Schütt,

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

i zastąpisz 5 przez liczbę, którą chcesz ... to powinno załatwić sprawę ...

EDYCJA, jeśli dla każdej linii sed 's/^.\{5\}//g' logfile


29

Możesz użyć cut:

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

-c: postacie

file.txt: plik wejściowy

new_file.txt: plik wyjściowy

N-: Znaki od N do końca są wycinane i wyprowadzane do nowego pliku.

Może mieć także inne argumenty, takie jak: „N”, „N-M”, „-M” oznacza odpowiednio n-ty znak, n-ty do m-tego znaku, odpowiednio od pierwszego do m-tego znaku.

Spowoduje to wykonanie operacji na każdej linii pliku wejściowego.


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

usunie pierwsze 900 znaków

cut używa 900-, aby pokazać 900-ty znak do końca linii

jednak kiedy przepuszczam to wszystko przez grep, nic nie dostaję


4
„cut -c 1-900” nie usunie „pierwszych 900 znaków” - pozostawi tylko pierwsze 900 znaków. Jeśli chcesz usunąć pierwsze 900 znaków, użyj „cut -c 901-”
iammichael

także pierwsze 900 znaków w każdym wierszu, według odpowiedzi @ iammichael
Blair Conrad,

1
„cut -c 900-” usunie pierwsze 899 znaków, nie?
Yiding Zhou

4

Myślę, że awkbyłoby najlepszym narzędziem do tego, ponieważ może zarówno filtrować, jak i wykonywać niezbędne funkcje manipulacji ciągiem na filtrowanych liniach:

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

lub

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

1

Oto prosta funkcja, przetestowana w bash. Pierwszy parametr funkcji to ciąg znaków, drugi parametr to liczba znaków do usunięcia

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

Stosowanie: wprowadź opis zdjęcia tutaj


2
możesz to uprościć, aby uzyskać echo {1: 2 $}
kdubs
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.