试图调试服务器的一个问题,我唯一的日志文件是一个20GB的日志文件(甚至没有时间戳!)为什么人们使用System.out.println()作为日志?在生产吗? !)

使用grep,我找到了我想要查看的文件区域,第347340107行。

除了做一些

head -<$LINENUM + 10> filename | tail -20 

... 这将需要头读取日志文件的前3.47亿行,是否有一个快速而简单的命令将行347340100 - 347340200(例如)转储到控制台?

我完全忘记了grep可以打印匹配前后的上下文…这很有效。谢谢!


当前回答

是什么:

tail -n +347340107 filename | head -n 100

我没有测试,但我认为这是可行的。

其他回答

是什么:

tail -n +347340107 filename | head -n 100

我没有测试,但我认为这是可行的。

你可以说GNU-grep

grep --context=10 ...

你可以使用ex命令,一个标准的Unix编辑器(现在是Vim的一部分),例如。

显示单行(例如第二行): Ex +2p -scq file.txt 对应的sed语法:sed -n '2p' file.txt 行范围(例如2-5行): Ex +2,5p -scq file.txt Sed语法:Sed -n '2,5p' file.txt 从给定的行到末尾(例如,第5行到文件末尾): Ex +5,p -scq file.txt Sed语法:Sed -n '2,$p' file.txt 多行范围(例如2-4行和6-8行): Ex +2,4p +6,8p -scq file.txt Sed语法:Sed -n '2,4p;6,8p' file.txt

以上命令可以用下面的测试文件进行测试:

seq 1 20 > file.txt

解释:

+或-c后跟命令-读取文件后执行(vi/vim)命令, -s -静默模式,也使用当前终端作为默认输出, Q后面加-c是退出编辑器的命令(add !强制退出,例如-scq!)。

我很惊讶,只有另一个答案(由Ramana Reddy)建议在输出中添加行号。下面搜索所需的行号并为输出上色。

file=FILE
lineno=LINENO
wb="107"; bf="30;1"; rb="101"; yb="103"
cat -n ${file} | { GREP_COLORS="se=${wb};${bf}:cx=${wb};${bf}:ms=${rb};${bf}:sl=${yb};${bf}" grep --color -C 10 "^[[:space:]]\\+${lineno}[[:space:]]"; }

不,没有,文件不是行寻址的。

在文本文件中,没有固定时间的方法来找到第n行的开始。您必须流遍文件并计算换行符。

使用你拥有的最简单/最快的工具来完成这项工作。对我来说,使用head比使用grep更有意义,因为后者要复杂得多。我并不是说“grep很慢”,它确实不是,但是如果它比head更快,我会感到惊讶。那基本上就是脑袋里的虫子了。