Làm việc với các tệp lớn trong VIM


108

Tôi đã thử mở một tệp lớn (~ 2GB) trong VIM nhưng nó bị nghẹt. Tôi thực sự không cần chỉnh sửa tệp, chỉ cần nhảy xung quanh một cách hiệu quả.

Làm cách nào để làm việc với các tệp rất lớn trong VIM?



5
Vim sẽ không sao miễn là bạn :set binaryđầu tiên ...
ephemient

1
Đây là một mục tiêu tốt cho một hệ thống tập tin cầu chì mới! splitfs hoặc thứ gì đó tương tự ... Tôi thích nó!
rodrigo

1
Quá muộn ... này đã tồn tại: sourceforge.net/projects/joinsplitfs
Rodrigo

5
Bạn cần một máy nhắn tin, không phải một trình biên tập, thưa ông! Xem câu trả lời của Jim bên dưới.
Lester Cheung

Câu trả lời:


85

Tôi đã có một tệp 12GB để chỉnh sửa hôm nay. Plugin vim LargeFile không hoạt động với tôi. Nó vẫn sử dụng hết bộ nhớ của tôi và sau đó in ra một thông báo lỗi :-(. Tôi cũng không thể sử dụng hexedit vì nó không thể chèn bất cứ thứ gì, chỉ cần ghi đè. Đây là một cách tiếp cận thay thế:

Bạn chia nhỏ tệp, chỉnh sửa các phần và sau đó kết hợp lại. Bạn vẫn cần gấp đôi dung lượng ổ đĩa.

  • Grep cho một cái gì đó xung quanh dòng bạn muốn chỉnh sửa:

    grep -n 'something' HUGEFILE | head -n 1
    
  • Giải nén dải tệp đó. Giả sử các dòng bạn muốn chỉnh sửa nằm ở dòng 4 và 5. Sau đó thực hiện:

    sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
    
    • Các -ntùy chọn là cần thiết để ngăn chặn hành vi mặc định của sed để in tất cả mọi thứ
    • 4,5p in dòng 4 và 5
    • 5q hủy bỏ sed sau khi xử lý dòng 5
  • Chỉnh sửa SMALLPARTbằng trình chỉnh sửa yêu thích của bạn.

  • Kết hợp tệp:

    (head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new 
    
    • tức là: chọn tất cả các dòng trước các dòng đã chỉnh sửa từ HUGEFILE (trong trường hợp này là 3 dòng trên cùng), kết hợp nó với các dòng đã chỉnh sửa (trong trường hợp này là dòng 4 và 5) và sử dụng tập hợp các dòng kết hợp này để thay thế tương đương (trong trường hợp này là 5 dòng trên cùng) trong HUGEFILE và ghi tất cả vào một tệp mới.

    HUGEFILE.newbây giờ sẽ là tệp đã chỉnh sửa của bạn, bạn có thể xóa bản gốc HUGEFILE.


30

Đây đã là một câu hỏi lặp đi lặp lại trong nhiều năm. (Các con số liên tục thay đổi, nhưng khái niệm thì giống nhau: làm cách nào để xem hoặc chỉnh sửa các tệp lớn hơn bộ nhớ?)

Rõ ràng morehoặc lesslà những cách tiếp cận tốt để chỉ đơn thuần đọc các tệp --- lessthậm chí còn cung cấp vinhư keybindings để cuộn và tìm kiếm.

Một Freshmeat tìm kiếm trên "các tập tin lớn" gợi ý rằng hai biên tập viên sẽ được đặc biệt phù hợp với nhu cầu của bạn.

Một sẽ là: lfhex ... một trình chỉnh sửa tệp hex lớn (phụ thuộc vào Qt). Điều đó, rõ ràng, đòi hỏi phải sử dụng GUI.

Một cái khác dường như phù hợp với việc sử dụng bảng điều khiển: hed ... và nó tuyên bố có vimgiao diện giống như (bao gồm một exchế độ?).

Tôi chắc chắn rằng tôi đã thấy các trình soạn thảo khác cho Linux / UNIX có thể duyệt qua các tệp mà không cần tải toàn bộ vào bộ nhớ. Tuy nhiên, tôi không nhớ tên của họ. Tôi đặt câu trả lời này thành một mục "wiki" để khuyến khích những người khác thêm liên kết của họ vào những người biên tập như vậy. (Có, tôi quen thuộc với các cách giải quyết vấn đề bằng cách sử dụng splitcat; nhưng tôi đang nghĩ đến các trình chỉnh sửa, đặc biệt là các trình chỉnh sửa console / nguyền rủa có thể phân phối với điều đó và tiết kiệm cho chúng tôi thời gian / độ trễ và chi phí không gian đĩa mà các cách tiếp cận như vậy đòi hỏi) .


23

Vì bạn không cần thực sự chỉnh sửa tệp:

  1. view(hoặc vim -R) sẽ hoạt động tốt trên các tệp lớn.
  2. Hoặc bạn có thể sử dụng morehoặcless

"Chokes" ý bạn là mất một lúc để mở? Hay thực sự gặp sự cố? Phải mất hơn 4 phút trên hộp Linux không phải gần đây của tôi để mở tệp 2,7GB trong view(chỉ cần thử và tính giờ). Được, điều đó không chính xác ngay lập tức, nhưng nó hoạt động.
ChssPly76

Vâng, nó đứng yên. Tôi chắc chắn nếu tôi chờ đợi nó sẽ mở ra. Tôi đã đi với ít hơn vì nó mở ngay lập tức và tôi đã quen với việc điều hướng.
hoju

9

Tôi đã viết một kịch bản nhỏ dựa trên câu trả lời của Florian sử dụng nano (trình soạn thảo yêu thích của tôi):

#!/bin/sh

if [ "$#" -ne 3 ]; then
  echo "Usage: $0 hugeFilePath startLine endLine" >&2
  exit 1
fi

sed -n -e $2','$3'p' -e $3'q' $1 > hfnano_temporary_file
nano hfnano_temporary_file
(head -n `expr $2 - 1` $1; cat hfnano_temporary_file; sed -e '1,'$3'd' $1) > hfnano_temporary_file2
cat hfnano_temporary_file2 > $1
rm hfnano_temporary_file hfnano_temporary_file2

Sử dụng nó như thế này:

sh hfnano yourHugeFile 3 8

Trong ví dụ đó, nano sẽ mở ra các dòng từ 3 đến 8, bạn có thể chỉnh sửa chúng, và khi bạn lưu và thoát, các dòng đó trong tệp tin khổng lồ sẽ tự động được ghi đè lên các dòng đã lưu của bạn.


3

Tôi đã gặp vấn đề tương tự, nhưng đó là kết xuất mysql 300GB và tôi muốn loại bỏ DROPvà thay đổi CREATE TABLEthành CREATE TABLE IF NOT EXISTSvì vậy không muốn chạy hai lệnh gọi sed. Tôi đã viết script Ruby nhanh này để đánh lừa tệp với những thay đổi đó:

#!/usr/bin/env ruby

matchers={
    %q/^CREATE TABLE `foo`/ => %q/CREATE TABLE IF NOT EXISTS `foo`/,
    %q/^DROP TABLE IF EXISTS `foo`;.*$/ => "-- DROP TABLE IF EXISTS `foo`;"
}

matchers.each_pair { |m,r|
    STDERR.puts "%s: %s" % [ m, r ]
}

STDIN.each { |line|
    #STDERR.puts "line=#{line}"
    line.chomp!
    unless matchers.length == 0
        matchers.each_pair { |m,r|
            re=/#{m}/
            next if line[re].nil?
            line.sub!(re,r)
            STDERR.puts "Matched: #{m} -> #{r}"
            matchers.delete(m)
            break
        }
    end
    puts line
}

Được mời như thế

./mreplace.rb < foo.sql > foo_two.sql

Chỉ cần lưu ý để chạy, để chạy nó như một exe đòi hỏi chmod +x mreplace.rbđầu tiên, bạn cũng có thể chỉruby mreplace.rb ..
Smar

Cảm ơn @Steeve McCauley! Công việc tốt đẹp. Chính xác những gì tôi đang tìm kiếm khi tìm kiếm câu trả lời cho câu hỏi này.
Nate Ritter

3

Đối với một dòng chữ lớn (in các ký tự từ 1đến 99):

cut -c 1-99 filename

2

Đã muộn nhưng nếu bạn chỉ muốn điều hướng qua tệp mà không cần chỉnh sửa nó, bạn catcũng có thể thực hiện công việc.

% cat filename | less

hoặc đơn giản hơn:

% less filename

8
Lưu ý rằng catviệc kiểm tra tệp trước tiên là cực kỳ ngu ngốc, vì nó có nghĩa là tệp sẽ hoàn toàn nằm trong bộ nhớ (vì vậy lesscó thể tìm kiếm tệp) hoặc không thể tìm thấy nó; catchỉ đưa ra luồng đầu ra tĩnh.
Smar

1

emacs hoạt động rất tốt với các tệp có dung lượng 100 megabyte, tôi đã sử dụng nó trên các tệp nhật ký mà không gặp quá nhiều khó khăn.

Nhưng nói chung khi tôi có một số loại nhiệm vụ phân tích, tôi thấy viết một script perl là một lựa chọn tốt hơn.


0

Chủ đề cũ. Nhưng tuy nhiên (chơi chữ :)).

 $less filename

hoạt động kém hiệu quả hơn nếu bạn không muốn chỉnh sửa và chỉ quan sát xung quanh, đó là trường hợp để kiểm tra các tệp nhật ký lớn.

Tìm kiếm trong các công việc ít hơn như vi

Phần tốt nhất, nó có sẵn theo mặc định trên hầu hết các bản phân phối. Vì vậy, sẽ không có vấn đề gì đối với môi trường sản xuất.


Tìm kiếm trong tệp văn bản 650MB với ít được chứng minh là PITA. Sử dụng vim với LargeFile hoạt động giống như một sự quyến rũ.
MariusCC

2
@MariusCC Sau đó, bạn không làm việc với các tệp hơn 2 GB, sức hấp dẫn của bạn sẽ mất dần khi gặp sự cố!
deepdive

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.