我正在使用一个脚本,该脚本在特定行之后查找文件行并处理它们以从中获取数据。
让我用一个例子来说明, 如果文件“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
答案 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