sed在特定行之后grep行进行进一步处理

时间:2012-12-18 01:08:31

标签: shell sed tcl

我正在使用一个脚本,该脚本在特定行之后查找文件行并处理它们以从中获取数据。

让我用一个例子来说明,  如果文件“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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

sed '/1:00 PM/,$ {/copying/s:.*file \(.*\):\1:p};d' FILE

答案 2 :(得分:1)

这可能适合你(GNU sed):

sed -ne '/1:00 PM/,$!b' -e 's/.*copying.* //w copy' file