如何在 Linux 中显示文本文件中的某些行?

如何在 Linux 中显示文本文件中的某些行?

我想每个人都知道 Linux 命令行实用程序很有用headtail.head允许您打印文件的前 X 行,tail执行相同操作但打印文件末尾。 打印文件中间部分的好命令是什么? 类似于middle --start 10000000 --count 20(打印第 10'000'000 行到第 10'000'010 行)。

我正在寻找一种可以有效处理大文件的方法。我试过了tail -n 10000000 | head 10,但速度太慢了。

答案1

sed -n '10000000,10000020p' filename

您也许可以像这样稍微加快速度:

sed -n '10000000,10000020p; 10000021q' filename

在这些命令中,该选项-n导致sed“禁止自动打印模式空间”。命令p“打印当前模式空间”和q命令“立即退出 sed 脚本而不处理任何其他输入...”引号来自sed man

顺便说一下,你的命令

tail -n 10000000 filename | head -n 10

从第一千万行开始结尾文件的,而你的“中间”命令似乎从文件的千万分之一开始开始这相当于:

head -n 10000010 filename | tail -n 10

问题是,对于行长可变的未分类文件,任何进程都必须遍历文件并计算换行符。没有捷径可走。

但是,如果文件已排序(例如,带有时间戳的日志文件)或具有固定长度的行,则可以根据字节位置在文件中查找。在日志文件示例中,您可以像我的 Python 脚本一样对时间范围进行二分搜索这里* 确实如此。对于固定记录长度文件,这真的很容易。您只需linelength * linecount在文件中查找字符即可。

* 我一直想发布该脚本的另一个更新。也许有一天我会抽出时间。

答案2

我发现以下用法sed

sed -n '10000000,+20p'  filename

希望它对某人有用!

答案3

这是我第一次在这里发帖!无论如何,这个很容易。假设您想从名为 file.txt 的文件中提取第 8872 行。操作方法如下:

cat -n 文件.txt | grep '^ *8872'

现在的问题是找到这之后的 20 行。要做到这一点,你需要

cat -n 文件.txt | grep -A 20'^ *8872'

对于周围或之前的行,请参阅 grep 手册中的 -B 和 -C 标志。

答案4

Perl 是王者:

perl -ne 'print if ($. == 10000000 .. $. == 10000020)' filename

相关内容