2011-08-04 37 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 ... 

我有一個如上所示的文件。我想從中提取文件名並輸出到標準輸出爲:sed/awk:從文本流中提取圖案

server_log_1.log 
server_log_2.log 
server_log_3.log 

有人可以幫忙嗎?謝謝!

文件名稱模式是server_log_xxx.log,它只在一行中出現一次。

+0

由於文件名裏可以包含任何字符(空格,換行,控制字符,大多數Unix文件系統,除了'什麼「\ 0''和'」 /'' ),那3行可以是一個有效的文件名。沒有辦法可靠地識別文件名,除非您對有效的文件名和可以出現在兩個'...'中的內容添加一些限制。您特別需要小心,因爲記錄未經分析的用戶控制變量(例如輸入,主機名)的日誌文件可能成爲針對寫入不佳的分析程序的注入攻擊的目標。 – jw013

+0

jw013:不需要,在文件名中需要''\ n'',否則這3行是三個條目 –

+0

@yi''\ n''是文件名中的有效字符。對於「所有可能的文件名」,你無法真正做出任何理智的匹配,並且正如我指出的那樣,整行或任何級聯(直到文件系統的文件名長度限制)是一個有效的文件名。現在託德指定了他正在尋找的模式變得更加合理(儘管「xx」部分仍未指定,但它們可能代表數字)。我並不真正按照你所說的「不」來進行。 – jw013

回答

16

假設在「XXX」佔位符是唯一的數字:

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

很好的答案,謝謝! – Dagang

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

將'p'添加到's'命令的末尾,並添加'-n'選項,除非您想要查看與模式不匹配的每一行。 – jw013

0

使用awk和你的輸入模式:

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

看它這裏的行動:https://ideone.com/kcadh

HTH

3

管你的文件通過以下命令:

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

sed's /.* \(server_log_ [0-9] \ + \ .log \)。*/\ 1 /'更簡單一些,對吧? – Dagang

+0

正確,但帶有大括號。它以前不適用於我,因爲我省略了'。*'。更新我的解決方案 –