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

mat*_*t b 190 unix linux bash text

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

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

做的事情除了

head -<$LINENUM + 10> filename | tail -20 
Run Code Online (Sandbox Code Playgroud)

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

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

Skl*_*vvz 371

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

假设你需要20到40行,

sed -n '20,40p;41q' file_name
Run Code Online (Sandbox Code Playgroud)

要么

awk 'FNR>=20 && FNR<=40' file_name
Run Code Online (Sandbox Code Playgroud)

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

WCC*_*WCC 104

# print line number 52
sed -n '52p' # method 1
sed '52!d' # method 2
sed '52q;d' # method 3,  efficient on large files 
Run Code Online (Sandbox Code Playgroud)

方法3对大文件有效

显示特定线条的最快方式

  • @XiongChiamiov sed -n'1,500p; 501q'打印1-500怎么样? (7认同)
  • 前两行/方法效率较低的原因是它们继续处理第 52 行之后的所有行,直到结束,而 #3 在打印第 52 行后停止。 (4认同)
  • 这个答案将有助于解释所有论证的作用。 (2认同)

小智 69

用GNU-grep你可以说

grep --context=10 ...

  • 此命令不起作用,在sed -n'<start>,<end> p'下面正在运行 (12认同)
  • 或者更具体地说,10行之前:grep -B 10 ...或10行之后:grep -A 10 ... (7认同)
  • 这实际上是*不是你想要的,因为即使匹配在最高位,它也会处理整个文件.此时,头/尾或尾/头组合更有效. (5认同)
  • 这根本不满足问题,因为这没有提供输出特定_line_的方法,如所提出的那样. (3认同)
  • 这实际上不是所问的。@matt b,你为什么不不接受这个答案? (3认同)
  • **不工作**! (2认同)

unw*_*ind 24

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

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

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

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

its*_*att 20

关于什么:

tail -n +347340107 filename | head -n 100
Run Code Online (Sandbox Code Playgroud)

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


Luk*_*nko 12

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

$ split --lines=50000 /path/to/large/file /path/to/output/file/prefix
Run Code Online (Sandbox Code Playgroud)

然后grep生成的文件.


seh*_*ehe 12

我更喜欢进入less

  • 键入50%以转到文件的一半,
  • 43210G 去43210行
  • :43210 做同样的事

和那样的东西.

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


ken*_*orb 9

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

可以使用以下测试文件测试上述命令:

seq 1 20 > file.txt
Run Code Online (Sandbox Code Playgroud)

说明:

  • +或者-c后跟命令 - 在读取文件后执行(vi/vim)命令,
  • -s - 静音模式,也使用当前终端作为默认输出,
  • q然后-c是退出编辑器的命令(添加!到强制退出,例如-scq!).


小智 6

得到 ack

Ubuntu / Debian安装:

$ sudo apt-get install ack-grep
Run Code Online (Sandbox Code Playgroud)

然后运行:

$ ack --lines=$START-$END filename
Run Code Online (Sandbox Code Playgroud)

例:

$ ack --lines=10-20 filename
Run Code Online (Sandbox Code Playgroud)

来自$ 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.
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您要读取的行号是100

head -100 filename | tail -1
Run Code Online (Sandbox Code Playgroud)