2011-08-04 9 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 

誰かが助けてもらえ:私はとSTDOUTに出力からファイル名を抽出したいですか?ありがとう!

ファイル名のパターンはserver_log_xxx.logであり、1行に1回しか発生しません。 AWKとご入力パターンと

+0

ファイル名は任意の文字(ほとんどのUNIXファイルシステム上のスペース、改行、制御文字、 '「\ 0''と'」/ ' '以外のものについてだけ含めることができますので、 )、その3行は1つの有効なファイル名になります。有効なファイル名と2つの '... 'に現れるものにいくつかの制限を加えない限り、ファイル名を確実に認識する方法はありません。特に、非手直しされたユーザ制御変数(例えば、入力、ホスト名)を記録するログファイルは、記述が不十分なパーサーに対する注入攻撃の対象になる可能性があるため、注意が必要です。 – jw013

+0

jw013:いいえ、ファイル名に ''\ n' 'が必要です。そうでなければ、3行は3つのエントリです。 –

+0

@yi'' \ n "はファイル名に有効な文字です。 "すべての可能なファイル名"にはまったくマッチすることはできません。例のように、行全体またはファイルシステムのファイル名の長さの上限までの任意の連結が有効なファイル名であることを私は指摘しました。 Toddが問題を探しているパターンを指定したので、これはより合理的になります( 'xx'の部分は未だに指定されていませんが、おそらく数字の意味です)。私はあなたが言っていることを本当に「続ける」ことに従わない。 – jw013

答えて

16

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

ここでアクションがそれを参照してください。想定する「XXX」のプレースホルダは、数字だけです:

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

良い答え、ありがとう! – Dagang

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

's'コマンドの最後に' p'を追加し、パターンと一致しないすべての行を見たい場合を除いて '-n'オプションを追加してください。 – jw013

3

パイプファイル:

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

sedの/.*/(server_log_ [0-9] \ + \。log \)。*/\ 1/'はもっと簡単ですよね? – Dagang

+0

右端が括弧で囲まれています。私が '。*'を省略したので、以前は私のためにはうまくいきませんでした。私のソリューションを更新しました。 –

関連する問題