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。找到这些行后,它必须查找与“复制”模式匹配的行并获取该行中指定的路径。

在这种情况下,写入另一个文件的输出应该是

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
sed '/1:00 PM/,$ {/copying/s:.*file \(.*\):\1:p};d' FILE
于 2012-12-18T01:25:47.857 回答
1

这可能对您有用(GNU sed):

sed -ne '/1:00 PM/,$!b' -e 's/.*copying.* //w copy' file
于 2012-12-18T07:42:46.447 回答