Lệnh unix để xóa N ký tự đầu tiên của một dòng là gì?


238

Ví dụ: tôi có thể muốn:

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

Tôi đã nghĩ rằng trcó thể có khả năng để làm điều này nhưng tôi không chắc chắn.

Câu trả lời:


355

Sử dụng cut. Ví dụ. để loại bỏ 4 ký tự đầu tiên của mỗi dòng (tức là bắt đầu trên char thứ 5):

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

1
Bạn có biết tại sao đường ống không hoạt động không? Khi tôi chạy về cơ bản lệnh đó, 'cut' sẽ không in kết quả ra thiết bị xuất chuẩn ... nếu tôi chỉ chạy 'log -f logfile | cắt -c 5- 'tôi có thể thấy kết quả ... vấn đề phải xảy ra với grep tôi đang sử dụng cygwin FYI cảm ơn
les2

Điều gì xảy ra nếu bạn không thêm đường ống cuối cùng và cắt? về cơ bản, nếu bạn loại bỏ phần cuối cùng của dòng?
LB40

nó "đuôi" logfile, lọc nó bằng grep (nghĩa là tất cả các dòng có "org.springframework" trong chúng được in ra stdout) khi tôi thêm đường ống vào 'cắt' ... nó sẽ bị treo CÁCH, nếu tôi loại bỏ 'grep' the 'cut' hoạt động bình thường ... tôi đang nghĩ có gì đó không đúng với cách tôi đang sử dụng grep ... cũng có thể là một thứ cygwin
les2

1
oh tôi hiểu ... tại sao bạn sử dụng đuôi? chỉ cần làm grep org.springframework logfile | cắt -c 5- nhưng tôi nghĩ sed đẹp hơn :-)
LB40

6
Vấn đề là, grep đó đang đệm các khối lớn trước khi gửi chúng đi cắt vì có thể thấy rằng nó không ghi vào thiết bị đầu cuối. Sử dụng grep --line-buffered "org.springframeworkđể giải quyết vấn đề đó.
Steen Schütt

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

và bạn thay 5 bằng số bạn muốn ... nó nên thực hiện thủ thuật ...

EDIT nếu cho mỗi dòng sed 's/^.\{5\}//g' logfile


29

Bạn có thể sử dụng cut:

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

-c: nhân vật

file.txt: tập tin đầu vào

new_file.txt: tập tin đầu ra

N-: Các ký tự từ N đến cuối được cắt và xuất ra tệp mới.

Cũng có thể có các đối số khác như: 'N', 'N-M', '-M' có nghĩa là ký tự thứ n, ký tự thứ n đến mth, ký tự đầu tiên đến mth.

Điều này sẽ thực hiện các hoạt động cho từng dòng của tập tin đầu vào.


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

sẽ loại bỏ 900 ký tự đầu tiên

cut sử dụng 900- để hiển thị ký tự thứ 900 đến cuối dòng

tuy nhiên khi tôi chuyển tất cả những thứ này qua grep tôi không nhận được gì


4
"cut -c 1-900" sẽ không "xóa 900 ký tự đầu tiên" - nó sẽ chỉ còn lại 900 ký tự đầu tiên. Nếu bạn muốn xóa 900 ký tự đầu tiên, hãy sử dụng "cut -c 901-"
iammichael

cũng là 900 ký tự đầu tiên trên mỗi dòng, mỗi câu trả lời của @ iammichael
Blair Conrad

1
'cut -c 900- "sẽ xóa 899 ký tự đầu tiên, phải không?
Yiding Zhou

4

Tôi nghĩ rằng đây awksẽ là công cụ tốt nhất cho việc này vì nó có thể vừa lọc vừa thực hiện các chức năng thao tác chuỗi cần thiết trên các dòng được lọc:

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

hoặc là

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

1

Đây là chức năng đơn giản, được thử nghiệm trong bash. Param thứ nhất của hàm là chuỗi, param thứ 2 là số ký tự được loại bỏ

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

Sử dụng: nhập mô tả hình ảnh ở đây


2
bạn có thể đơn giản hóa điều này để lặp lại $ {1: $ 2}
kdub
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.