0

特定の行の後にファイル行を探し、それらを処理してそこからデータを取得するスクリプトを使用しています。

ファイル「sample.log」に次のような行がある場合、例で説明しましょう

qwerty asdf foo bar
foo 
time: 1:00 PM
foo1 bar1
foo foo fooo copying file abc/def/ghi/foo.txt
bar bar1 bar2 copying file efg/qwe/bar.txt
foo

私のスクリプトは、次の時刻以降にコンテンツを検索する必要があります: 1:00 PM. これらの行を見つけた後、パターン「copying」に一致する行を探し、その行で指定されたパスを取得する必要があります。

この場合、別のファイルに書き込まれる出力は、

abc/def/ghi/foo.txt
efg/qwe/bar.txt

次のコマンドを使用してこれを試しましたが、空の文字列を出力として取得しました。これで私を導いてください

    sed -n '/^time: 1:00 PM/{/^(.*)copying file/s/^(.*)copying file //p}' ../../sample.log
4

3 に答える 3

2

すでに Tcl を使用している場合は、Tcl でコーディングできます。

set fid [open "FILE" r]
set have_time false
while {[gets $fid line] != -1} {
    if {$have_time && [regexp {copying file (.*)} $line -> filename]} {
        puts $filename
    } elseif {[string first "time:" $line] > -1} {
        set have_time true
    }
}
close $fid

ファイルが非常に大きい場合exec sedは、高速になる可能性がありますが、自分で確認する必要があります。

exec sedを行う場合は、Tcl 内では単一引用符に特別な意味がないことに注意してください。中括弧を使用して sed プログラムを引用します。

exec sed -e {do stuff here} FILE
于 2012-12-18T03:37:08.767 に答える
1

これはあなたのために働くかもしれません(GNU sed):

sed -ne '/1:00 PM/,$!b' -e 's/.*copying.* //w copy' file
于 2012-12-18T07:42:46.447 に答える
1
sed '/1:00 PM/,$ {/copying/s:.*file \(.*\):\1:p};d' FILE
于 2012-12-18T01:25:47.857 に答える