尝试调试服务器的问题,我唯一的日志文件是20GB的日志文件(甚至没有时间戳!为什么人们System.out.println()
用作日志?在生产中?!)
使用grep,我找到了一个我想看一下的文件区域,第347340107行.
做的事情除了
head -<$LINENUM + 10> filename | tail -20
...需要head
读取日志文件的前347万行,是否有一个快速简单的命令,可以将347340100 - 347340200(例如)转储到控制台?
更新我完全忘了grep可以打印匹配的上下文......这很有效.谢谢!
如果您知道行号,我找到了另外两个解决方案,但没有别的(没有grep可能):
假设你需要20到40行,
sed -n '20,40p;41q' file_name
要么
awk 'FNR>=20 && FNR<=40' file_name
# print line number 52 sed -n '52p' # method 1 sed '52!d' # method 2 sed '52q;d' # method 3, efficient on large files
方法3对大文件有效
显示特定线条的最快方式
用GNU-grep你可以说
grep --context=10 ...
没有,文件不是行可寻址的.
在文本文件中没有找到行n开头的常量方法.您必须流式传输文件并计算换行符.
使用最简单/最快的工具来完成工作.对我来说,使用head
使多不是更有意义grep
,因为后者的方式更加复杂.我不是说" grep
很慢",但事实并非如此,但如果它比head
这种情况更快,我会感到惊讶.head
基本上,这是一个错误.
关于什么:
tail -n +347340107 filename | head -n 100
我没有测试它,但我认为这样可行.
我首先将文件分成几个较小的文件
$ split --lines=50000 /path/to/large/file /path/to/output/file/prefix
然后grep生成的文件.
我更喜欢进入less
和
键入50%以转到文件的一半,
43210G 去43210行
:43210
做同样的事
和那样的东西.
更好的是:点击v开始编辑(当然是在vim中),在那个位置.现在,请注意vim
具有相同的键绑定!
您可以使用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
是退出编辑器的命令(添加!
到强制退出,例如-scq!
).
得到 ack
Ubuntu / Debian安装:
$ sudo apt-get install ack-grep
然后运行:
$ ack --lines=$START-$END filename
例:
$ ack --lines=10-20 filename
来自$ man ack
:
--lines=NUM Only print line NUM of each file. Multiple lines can be given with multiple --lines options or as a comma separated list (--lines=3,5,7). --lines=4-7 also works. The lines are always output in ascending order, no matter the order given on the command line.
如果您要读取的行号是100
head -100 filename | tail -1