当前位置:  开发笔记 > 编程语言 > 正文

快速unix命令显示文件中间的特定行?

如何解决《快速unix命令显示文件中间的特定行?》经验,为你挑选了10个好方法。

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

使用grep,我找到了一个我想看一下的文件区域,第347340107行.

做的事情除了

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

...需要head读取日志文件的前347万行,是否有一个快速简单的命令,可以将347340100 - 347340200(例如)转储到控制台?

更新我完全忘了grep可以打印匹配的上下文......这很有效.谢谢!



1> Sklivvz..:

如果您知道行号,我找到了另外两个解决方案,但没有别的(没有grep可能):

假设你需要20到40行,

sed -n '20,40p;41q' file_name

要么

awk 'FNR>=20 && FNR<=40' file_name


+1:虽然您可能希望在打印后退出.如果文件非常庞大,可能会提供一些性能优势.
sed -n '20,40p; 41q'file_name然后退出.

2> WCC..:
# print line number 52
sed -n '52p' # method 1
sed '52!d' # method 2
sed '52q;d' # method 3,  efficient on large files 

方法3对大文件有效

显示特定线条的最快方式


@XiongChiamiov sed -n'1,500p; 501q'打印1-500怎么样?

3> 小智..:

用GNU-grep你可以说

grep --context=10 ...


此命令不起作用,在sed -n', p'下面正在运行
或者更具体地说,10行之前:grep -B 10 ...或10行之后:grep -A 10 ...
这实际上是*不是你想要的,因为即使匹配在最高位,它也会处理整个文件.此时,头/尾或尾/头组合更有效.
这根本不满足问题,因为这没有提供输出特定_line_的方法,如所提出的那样.

4> unwind..:

没有,文件不是行可寻址的.

在文本文件中没有找到行n开头的常量方法.您必须流式传输文件并计算换行符.

使用最简单/最快的工具来完成工作.对我来说,使用head使不是更有意义grep,因为后者的方式更加复杂.我不是说" grep很慢",但事实并非如此,但如果它比head这种情况更快,我会感到惊讶.head基本上,这是一个错误.


除非行是以字节为单位的固定宽度,否则您不知道在不计算文件开头的新行字符的情况下移动文件指针的位置.

5> itsmatt..:

关于什么:

tail -n +347340107 filename | head -n 100

我没有测试它,但我认为这样可行.



6> Luka Marinko..:

我首先将文件分成几个较小的文件

$ split --lines=50000 /path/to/large/file /path/to/output/file/prefix

然后grep生成的文件.



7> sehe..:

我更喜欢进入less

键入50%以转到文件的一半,

43210G 去43210行

:43210 做同样的事

和那样的东西.

更好的是:点击v开始编辑(当然是在vim中),在那个位置.现在,请注意vim具有相同的键绑定!



8> kenorb..:

您可以使用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!).



9> 小智..:

得到 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.



10> 小智..:

如果您要读取的行号是100

head -100 filename | tail -1

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有