2012-10-28 27 views
13

Tôi có một tập tin văn bản lớn, tôi muốn nhìn thấy những dòng chứa "time spent" trong tập tin văn bản này, tôi sử dụng:Làm thế nào để grep một chuỗi sau một số dòng được chỉ định?

grep -in "time spent" myfile.txt 

Nhưng tôi chỉ quan tâm đến các dòng sau 50000. đầu ra tôi muốn xem các dòng sau 50000 và có chứa "thời gian dành cho". Có cách nào để làm việc này không?

Trả lời

27

Bạn có thể đuôi nó, sau đó grep:

tail -n +50000 myfile.txt | grep -in "time spent" 
+1

đó không làm việc rất tốt kể từ nó messes dòng số lên – BeniBela

+0

Lưu ý dấu '+'. nó seams vô ích nhưng nó có nghĩa là cái gì khác hơn đuôi -n 50000, nó có nghĩa là: đuôi bắt đầu từ dòng 50000 iso các dòng 50000 lat – gkephorus

4

Hoặc bạn có thể sử dụng sed. sed thể được sử dụng để bắt chước grep như thế này:

sed -n 's/pattern/&/p'

Theo mặc định sed in mỗi dòng thậm chí nếu thay không xảy ra. Sự kết hợp của -n/p làm cho sed chỉ in các đường mà xảy ra sự thay thế. Cuối cùng, chúng tôi thay thế pattern theo & có nghĩa là thay thế pattern một mình. Kết quả: chúng tôi chỉ bắt chước grep.

Bây giờ sed có thể thực hiện một loạt các dòng để hành động. Trong trường hợp của bạn:

sed -n '50000,$s/time spent/&/p' myfile.txt

Định dạng để xác định phạm vi là như sau: start,end Chúng tôi chỉ hướng dẫn sed làm việc từ dòng 50000 để $ có nghĩa là dòng cuối cùng.

+7

Câu trả lời được chấp nhận là chính xác. Lưu ý rằng 'tail -n + 2' (tất cả các dòng bắt đầu từ dòng 2) rất khác với' tail -n 2' (chỉ có 2 dòng cuối cùng). – user113215

+1

Vâng, tôi không hiểu. Rất tốt để biết, cảm ơn đã chỉ nó ra – neric

+1

Tôi thích phương pháp tiếp cận sed. Chỉ có một chương trình cần thiết, không có đường ống. – gkephorus

1

Bạn có thể sử dụng head + grep và nhóm lệnh với {...} để họ chia sẻ cùng một đầu vào:

{ head -n 50000 >/dev/null; grep -i PATTERN; } < infile 

head không tiêu thụ toàn bộ đầu vào, nó được chỉ 50000 dòng đầu tiên và bãi họ /dev/null; các dòng còn lại được xử lý bởi grep.
Nếu bạn cần số dòng prepended (như với grep -in), bạn có thể sử dụng awk:

awk 'NR>50000 && tolower($0)~/PATTERN/{print NR ": " $0}' infile 
2

trả lời cho grepping giữa bất kỳ số 2 dòng:

Using sed and grep: 

sed -n '1,50000p' someFile | grep <your_string> 
Các vấn đề liên quan