Làm cách nào để xuất một phần hoặc một số từ một mataching trong grep hoặc ack


2

Tôi có một tập tin văn bản demo.txtnhư dưới đây.

This is a line with id (9)
This (8) is another line with id
(10) This is a line with id too
11 This line does nothing

Các tập tin có một số dòng với id rải rác ngẫu nhiên. Mẫu id là số có dấu ngoặc đơn.

Công việc của tôi là tìm id lớn nhất trong tệp này để tôi biết id tiếp theo là gì khi thêm một dòng mới.

Công việc trước đây của tôi

ack-grep demo.txt -o --match '\(\d+\)' | sort -r | head -n 1

Kết quả là (9)nhưng không (10)như mong đợi của tôi. Tôi nghĩ lý do sortliên quan đến đầu ra là văn bản vì chúng có dấu ngoặc đơn.

Câu hỏi là: Làm thế nào tôi chỉ có thể xuất số từ ackhoặc grepđể sắp xếp sau mà vẫn khớp với mẫu (dấu ngoặc đơn trong ví dụ của tôi)?

Cảm ơn rất nhiều!


Hmm, không có 'ack' trên hệ thống của tôi để kiểm tra. Đây có phải là chương trình này? betterthangrep.com/install
Hennes

@ Hennes, vâng, đó là chương trình. Và trong Ubuntu tên là act-grep. Có một gói apt-get install ack-grep. Bản thân tôi thấy actổn định hơn grep.
Billy Chan

@BillyChan: Bạn có nghĩa ack-grepack, không act-grepact. Và làm thế nào để bạn có nghĩa là ack ổn định hơn grep? Tôi là tác giả của ack và tôi chắc chắn sẽ không đưa ra yêu sách như vậy.
Andy Lester

@AndyLester, cảm ơn vì công việc tốt đẹp của bạn trên ack. Tôi đã sử dụng greptrước đây nhưng đôi khi gặp lỗi lạ, sau đó tôi chuyển sang ackvà những lỗi như vậy biến mất. Vì vậy, tôi đã thêm yêu cầu như vậy vào ghi chú của mình nhưng thực sự không thể nhớ lại các trường hợp cho các lỗi.
Billy Chan

ack và grep cư xử khác nhau. Đối với một người, ack sẽ không tìm kiếm trong các tệp nhị phân trừ khi bạn đặc biệt yêu cầu nó, vì vậy có thể các lỗi bạn gặp phải là các cảnh báo về việc tìm kiếm dữ liệu nhị phân.
Andy Lester

Câu trả lời:


4

grep không thể được sử dụng để xuất các phần của trận đấu, nhưng tại sao không loại bỏ dấu ngoặc đơn?

Điều này hoạt động cho GNU grep:

grep -P '\(\d+\)' -o demo.txt | sed 's/[()]//g' | sort -nr | head -n1

Ví dụ sau cũng hoạt động cho BSD grep, ví dụ bạn có thể sử dụng trên OS X:

grep -E '\([[:digit:]]+\)' -o demo.txt | …    
grep -E '\([0-9]+\)' -o demo.txt | …

Để có kết quả mà chúng tôi muốn, chúng tôi thêm -nđối số sortđể sắp xếp số, cung cấp cho bạn 10kết quả đầu tiên.


1
Để hoàn thiện hơn (mặc dù tôi thích các gói được cài đặt mặc định hơn các tập lệnh perl được cài đặt thêm): ./ack-grep demo.txt -o --match '\(\d+\)' | sed 's/[()]//g' | sort -nr | head -n 1 (Sử dụng sắp xếp và sed của slhk).
Hennes

Vâng, tôi hình dung tôi sẽ sử dụng mặc định grepvì không phải ai cũng có thể có ack-grep, nhưng lệnh đầu tiên có thể dễ dàng được thay thế.
slhck

slhck, Câu trả lời hoạt động hoàn hảo. Lệnh sed rất thông minh. Cảm ơn rất nhiều! @Hennes, cảm ơn bạn quá!
Billy Chan
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.