如何根据cygwin中的起始和结束行号裁剪(剪切)文本文件?

bit*_*its 57 linux command-line cygwin

我有几个约100MB的日志文件.我个人认为处理这些大文件很麻烦.我知道我感兴趣的日志行只有200到400行左右.

从这些文件中提取相关日志行的好方法是什么,即我只想将行号范围传递给另一个文件.

例如,输入是:

filename: MyHugeLogFile.log
Starting line number: 38438
Ending line number:   39276
Run Code Online (Sandbox Code Playgroud)

是否有一个命令,我可以在cygwin中运行cat只能在该文件中的那个范围?我知道如果我能以某种方式在stdout中显示该范围,那么我也可以管道输出文件.

注意:添加Linux标记以提高可见性,但我需要一个可能在cygwin中运行的解决方案.(通常linux命令在cygwin中有效).

Joh*_*web 111

听起来像是一份工作sed:

sed -n '8,12p' yourfile
Run Code Online (Sandbox Code Playgroud)

...将第8到第12行发送yourfile到标准输出.

如果您想要添加行号,您可能希望先使用cat -n:

cat -n yourfile | sed -n '8,12p'
Run Code Online (Sandbox Code Playgroud)

  • 我认为第一个不涉及"猫"的解决方案最适合我.简洁明了. (2认同)

Dav*_*vid 11

您可以用来wc -l计算总行数.

然后head,您可以组合并tail获得所需的范围.让我们假设日志是40,000行,你想要最后的1562行,然后是你想要的第一行838行.所以:

tail -1562 MyHugeLogFile.log | head -838 | ....
Run Code Online (Sandbox Code Playgroud)

或者使用sed或更简单的方法awk.


Dor*_*ian 8

当我试图在一个包含10万行的文件中分割文件时,我看到了这个帖子.比sed更好的解决方案是:

split -l 100000 database.sql database-
Run Code Online (Sandbox Code Playgroud)

它将提供如下文件:

database-aaa
database-aab
database-aac
...
Run Code Online (Sandbox Code Playgroud)


Mar*_*ier 7

如果您只想剪切文件的一部分 - 比如从第26行到第142行 - 并将其输入到新文件中: cat file-to-cut.txt | sed -n '26,142p' >> new-file.txt


thk*_*ala 6

这个怎么样:

$ seq 1 100000 | tail -n +10000 | head -n 10
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009
Run Code Online (Sandbox Code Playgroud)

它用于tail从第 10,000 行开始输出,然后head只保留 10 行。

相同(几乎)的结果sed

$ seq 1 100000 | sed -n '10000,10010p'
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009
10010
Run Code Online (Sandbox Code Playgroud)

这样做的好处是可以直接输入行范围。