2011-08-04 30 views
7
2011-07-01 ... /home/todd/logs/server_log_1.log ... 
2011-07-02 ... /home/todd/logs/server_log_2.log ... 
2011-07-03 ... /home/todd/logs/server_log_3.log ... 

Tôi có một tệp trông giống như trên. Tôi muốn trích xuất tên tệp từ nó và xuất ra STDOUT là:sed/awk: Trích xuất mẫu từ luồng văn bản

server_log_1.log 
server_log_2.log 
server_log_3.log 

Ai đó có thể trợ giúp? Cảm ơn!

Mẫu tên tệp là server_log_xxx.log và mẫu chỉ xảy ra một lần trong một dòng.

+0

Vì tên tệp có thể chứa bất kỳ ký tự nào (dấu cách, dòng mới, ký tự điều khiển, trên hầu hết các hệ thống tệp unix, ngoại trừ ''\ 0'' và''/''), 3 dòng đó có thể là một tên tệp hợp lệ. Không có cách nào để nhận ra tên tệp một cách đáng tin cậy trừ khi bạn thêm một số hạn chế về tên tệp hợp lệ và nội dung có thể xuất hiện trong hai '...'. Bạn đặc biệt muốn cẩn thận vì các tệp nhật ký ghi lại các biến do người dùng kiểm soát không an toàn (ví dụ: đầu vào, tên máy chủ) có thể là mục tiêu cho các cuộc tấn công tiêm đối với các trình phân tích cú pháp kém. – jw013

+0

jw013: không, bạn cần ''\ n'' trong tên tệp, nếu không 3 dòng đó là ba mục –

+0

@yi'' \ n'' là một ký tự hợp lệ trong tên tệp. Bạn có thể không thực sự làm bất kỳ kết hợp lành mạnh nào trong "tất cả tên tập tin có thể sở hữu", và chỉ là một ví dụ tôi đã chỉ ra rằng toàn bộ dòng hoặc bất kỳ kết nối nào (tối đa giới hạn tên tệp của hệ thống tệp) là tên tệp hợp lệ. Bây giờ Todd đã xác định mẫu mà anh đang tìm kiếm vấn đề trở nên hợp lý hơn (mặc dù phần 'xx' vẫn chưa được chỉ định, chúng có thể có nghĩa là đứng cho chữ số). Tôi không thực sự làm theo những gì bạn đang nói "không". – jw013

Trả lời

16

Giả định trình giữ chỗ "xxx" chỉ là chữ số:

grep -o 'server_log_[0-9]\+\.log' 
+0

Câu trả lời hay, cảm ơn! – Dagang

0
sed 's|.*/\([^/ ]*\).*|\1|' infile 
+3

Thêm 'p' vào cuối lệnh' s' và thêm tùy chọn '-n' trừ khi bạn muốn xem mọi dòng không khớp với mẫu. – jw013

0

Với awk và mô hình đầu vào của bạn:

awk 'BEGIN {FS="/"} 
    { print gensub(" .*$","","g",$5) }' INPUTFILE 

Xem nó hoạt động ở đây: https://ideone.com/kcadh

HTH

3

Pipe tập tin của bạn thông qua lệnh sau:

sed 's/.*\(server_log_[0-9]\+\.log\).*/\1/' 
+0

sed 's /.* \ (server_log_ [0-9] \ + \. Log \). */\ 1 /' đơn giản hơn, đúng không? – Dagang

+0

Phải, nhưng với niềng răng thoát. Nó không có tác dụng với tôi trước đây bởi vì tôi đã bỏ qua '. *'. Đã cập nhật giải pháp của tôi. –

Các vấn đề liên quan