tìm kiếm và sắp xếp ack / grep theo ngày sửa đổi


7

Có cách nào để acksắp xếp các kết quả được tìm thấy theo ngày sửa đổi không? (lý tưởng hiển thị ngày bên cạnh kết quả?). Nó không giống như ackcó một tùy chọn ngày, nhưng chỉ trong trường hợp.

Nếu điều này là không thể với ack, làm thế nào grephoặc sử dụng kết hợp các công cụ?


2
Xin chào, tôi là tác giả của ack. Không có lựa chọn nào như vậy, mặc dù bạn không phải là người đầu tiên muốn nó (bao gồm cả tôi). Lý do mà ack không thể làm điều đó là vì nó sẽ phải tải lên toàn bộ danh sách các tệp mà nó sẽ tìm kiếm vào bộ nhớ cùng một lúc, sau đó sắp xếp tất cả chúng theo ngày, rồi lại đi qua tất cả các tệp. Điều gì nếu bạn có 1.000.000 tập tin có thể trong một thư mục? Bạn phải đợi tất cả 1.000.000 tệp được quét và sắp xếp trước khi bạn nhìn thấy kết quả đầu tiên và thậm chí bạn có thể hết bộ nhớ trước khi điều đó xảy ra.
Andy Lester

Cảm ơn @AndyLester Điều đó có ý nghĩa. Tôi tự hỏi nếu lưu danh sách dưới tmphoặc tương tự có thể giúp đỡ. Điều đó có thể không hoạt động cho mọi môi trường, nhưng tôi đoán nó có thể ngăn chặn vấn đề đó.
Josh

Câu trả lời:


7

Không có ackhoặc grepcó bất kỳ khái niệm về ngày sửa đổi của tập tin. Vì vậy, bạn sẽ cần tạo danh sách các tệp trước, sau đó sắp xếp chúng dựa trên sau đó.

Bạn có thể sử dụng xargsđể chạy các đầu ra của một trong hai ackhoặc grepvào một lệnh mà sẽ cung cấp ngày sửa đổi. Đối với ngày sửa đổi, bạn có thể sử dụng statđể làm điều đó.

Thí dụ

$ grep -Rl awk * | xargs -n 1 stat --printf "%y ------ %n\n"
2013-11-12 10:06:16.000000000 -0500 ------ 100855/tst_ccmds.bash
2013-11-13 00:32:11.000000000 -0500 ------ 100911/cmd.bash
2013-11-23 03:16:17.000000000 -0500 ------ 102298/cmd.bash
2013-12-14 20:06:04.467708173 -0500 ------ 105159/cmd.txt
2013-12-16 03:20:48.166016538 -0500 ------ 105328/cmds.txt
2013-01-14 14:17:39.000000000 -0500 ------ 106932/red5-1.0.1.tar.gz

LƯU Ý: Phương pháp này sẽ chỉ hiển thị cho bạn tên của các tệp khớp với truy vấn của bạn cùng với ngày sửa đổi.


4

Với các công cụ GNU:

grep -H something * | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n

Hoặc là,

ack something | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n

Điều này sử dụng awkđể tách tên tệp khỏi grepđầu ra thông thường và awkcác cuộc gọi dateđể lấy ngày của tệp. grepđược cung cấp -Htùy chọn để đảm bảo rằng tên tệp được hiển thị trên đầu ra ngay cả khi chỉ có một tên xuất hiện trên dòng lệnh.

Như một ví dụ về đầu ra:

$ grep setupcon /etc/init.d/* | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}' | sort -n
2011-12-05 12:05 /etc/init.d/keymap.sh:# If setupcon is present, then we've been superseded by console-setup.
2011-12-05 12:05 /etc/init.d/keymap.sh:if type setupcon >/dev/null 2>&1; then
2011-12-08 18:00 /etc/init.d/console-setup:     if setupcon --save; then
2011-12-08 18:00 /etc/init.d/console-setup:test -f /bin/setupcon || exit 0
2012-04-28 02:41 /etc/init.d/kbd:if which setupcon >/dev/null
2012-09-30 18:02 /etc/init.d/keyboard-setup:    if setupcon -k 2>/dev/null; then
2012-09-30 18:02 /etc/init.d/keyboard-setup:test -f /bin/setupcon || exit 0

Giải thích về awkcác lệnh

  • -F:

    Cái này đặt dấu phân cách trường để :trường đầu tiên là tên tệp. (Chúng ta phải hy vọng rằng tên tệp không chứa dấu hai chấm.)

  • "date -r \""$1"\" +\"%F %R\"" | getline d

    Điều này chạy date -r filename +"%F %R"để có được ngày sửa đổi của tệp trong một hình thức phù hợp để sắp xếp. Ngày được lưu trữ trong biến d.

  • print d,$0

    Điều này in dữ liệu theo sau là dòng đầu ra từ grep.

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.