tcl - 在搜索结果中包含第 nr 行
问题描述
我试图弄清楚如何在日志文件中搜索“word”,还包括在哪一行找到“word”。
另外,如果一个人可以从下到上阅读?
有任何想法吗?
谢谢!
set seen_trigger2 ".foo"
bind pub -|- $seen_trigger2 seen2:main
proc number {list} {
lmap item $list {list [incr number] $item}
}
proc seen2:main {nick uhost hand chan text} {
set f [open /home/mydir/eggdrop/logs/mylog.txt]
set lines [split [read $f] "\n"]
close $f
set pattern $text
set reverseNumberedLines [lreverse [number $lines]]
foreach lineInfo [lsearch -all -inline -index 1 $lines $pattern] {
lassign $lineInfo lineNumber lineContent
putlog "$lineNumber : $lineContent"
}
}
...
谢谢格伦杰克曼!
谢谢Donal研究员!
解决方案
从下到上读取是相当昂贵的,除非在所有行长度完全相同的退化情况下。阅读全部内容,分成几行和反转更容易。
# Some features used aren't in 8.5 and before
package require Tcl 8.6
# Generates “line” numbers
proc number {list} {
lmap item $list {list [incr number] $item}
}
# Classic get-all-the-lines code snippet
set f [open theFile.txt]
set lines [split [read $f] "\n"]
close $f
# Number and reverse
set reverseNumberedLines [lreverse [number $lines]]
# Find the matching lines
foreach lineInfo [lsearch -all -inline -index 1 $lines $pattern] {
lassign $lineInfo lineNumber lineContent
puts "$lineNumber : $lineContent"
}
请注意,我正在使用该-index 1
选项,该选项基本上适用lindex $item 1
于列表中的每个项目(第一个子项目是行号,第二个是行文本),然后再进行搜索。因为我们已经应用了所有的行号,所以我们不关心我们找到它们的实际索引,并且可以-inline
得到结果。
推荐阅读
- design-patterns - 使用 pub/sub 处理大型同时工作负载?
- node.js - 直接使用批处理文件输出作为nodejs变量而不使用txt
- python-3.x - 从 pdf 生成的表中提取数据 (Tabula)
- kdb - 在 KDB/Q 中,如何将数字剪辑到 -1、1 范围内?
- python - Locust - 重试某些状态码,但默认处理所有其他状态码
- python - 如何在 Python 中使用 while 循环发出多个 API 请求?
- reactjs - 带有有效负载 { name : 'home'} 的操作“导航”未被任何导航器处理
- python - 使用 Flask、Ajax 将数据提取到同一页面中的表单
- python - 如何使用其他两列连接一列?
- typescript - 如何使用 Nock 访问原始请求正文?