Cách thêm nhiều tìm kiếm trong lệnh AWK


10

Tôi đang cố gắng tìm kiếm các tập tin được tạo vào tháng Sáu, tháng Bảy và tháng Tám. Tôi đã sử dụng phương pháp này

ls -lrth|awk '/[Jun][Jul][Aug]/ {print}'

nhưng nó không hoạt động.


1
Đối với bản ghi, [...]cấu trúc khớp với một ký tự, có thể là bất kỳ một trong các ký tự giữa các dấu ngoặc. Vì vậy, biểu thức của bạn khớp JJA hoặc Jug( Jtừ [Jun], utừ [Jul]gtừ [Aug]) nhưng không phải là chữ viết tắt tháng mà bạn hy vọng khớp.
tripleee

Câu trả lời:


12

Bạn có thể kết hợp trên nhiều mẫu như vậy:

awk '/Jun/ || /July/ || /Aug/' <(ls -lrh)

Điều này trả về tất cả các trận đấu cho tháng sáu, tháng bảy hoặc tháng tám. Bạn không yêu cầu printtuyên bố vì đó là awkhành động mặc định.


1
awk hiểu các biểu thức mở rộng, vì vậy đối với một mẫu đơn giản như bạn có thể viết nó dưới dạng awk '/Jun|Jul|Aug/'hoặcawk '/Ju[nl]|Aug/'
cas

5

Theo nguyên tắc chung, việc phân tích đầu ra của ls là một ý tưởng rất tồi . Một cách tốt hơn để làm những gì bạn muốn là

stat -c "%n %y" * | grep 2013-0[678]

Ngoài ra, chỉ kiểm tra trường cuối cùng để bảo vệ khỏi trường hợp không thể xảy ra khi tên tệp là ngày:

stat -c "%n %y" *| awk '$NF ~ /2013-0[678]/' 

Từ man stat:

   -c  --format=FORMAT
          use the specified FORMAT instead of the default; output  a  new
          line after each use of FORMAT

   %y     time of last modification, human-readable
   %n     file name

Đó cũng là một ví dụ tốt. Tôi chưa bao giờ kiểm tra STAT trước đây. cảm ơn vì thông tin tuyệt vời
OmiPenguin

Có thể thay đổi thành ... | awk '$NF ~ /2013-0[678]/'để chỉ kiểm tra trường đầu ra cuối cùng, trong trường hợp (không chắc?) Ngay cả khi tên của tệp khớp với biểu thức chính quy ngay cả khi ngày không.
tripleee

3

lslà một lệnh để hiển thị thông tin về các tập tin trong một con người có thể đọc được. Không sử dụng nó trong các kịch bản .

Lệnh tìm tệp trong cây thư mục phù hợp với tiêu chí nhất định là find. Nếu bạn có GNU find (tức là Linux không nhúng hoặc Cygwin) hoặc FreeBSD find (tức là FreeBSD hoặc OSX), bạn có thể sử dụng -newermtđể khớp các tệp được sửa đổi lần cuối sau một ngày nhất định.

find . -newermt '1 June' ! -newermt '1 September' -print

Thêm một năm nếu bạn muốn khớp các tệp trong một năm cụ thể, thay vì năm dương lịch khi tập lệnh chạy.

Nếu việc triển khai tìm kiếm của bạn không có -newermt, bạn sẽ phải thực hiện -newer, so sánh ngày của tệp findđược tìm thấy với một tệp cố định. sử dụng touchđể tạo các tệp tạm thời với ngày bạn muốn sử dụng làm ranh giới.

dir=$(mktemp -d)
touch -d 201306010000 "$dir/from"
touch -d 201309010000 "$dir/to"
find . -newer "$dir/from" ! -newer "$dir/to" -print
rm -r "$dir"
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.