我想每个人都知道有用的 Linux 命令行实用程序head
和tail
. head
允许您打印文件的前 X 行,tail
执行相同但打印文件末尾。打印文件中间的好命令是什么?类似的东西middle --start 10000000 --count 20
(打印第 10'000'000 行直到第 10'000'010 行)。
我正在寻找可以有效处理大文件的东西。我试过tail -n 10000000 | head 10
了,速度太慢了。
我想每个人都知道有用的 Linux 命令行实用程序head
和tail
. head
允许您打印文件的前 X 行,tail
执行相同但打印文件末尾。打印文件中间的好命令是什么?类似的东西middle --start 10000000 --count 20
(打印第 10'000'000 行直到第 10'000'010 行)。
我正在寻找可以有效处理大文件的东西。我试过tail -n 10000000 | head 10
了,速度太慢了。
您可能可以像这样加快速度:
在这些命令中,该选项
-n
会导致sed
“抑制模式空间的自动打印”。命令“p
打印 [s] 当前模式空间”和q
命令“立即退出 [s] sed 脚本而不处理任何输入......”引号来自sed
man
页面。顺便说一句,你的命令
从文件末尾的第 10 行开始,而您的“中间”命令似乎从开头的第 10 行开始,这相当于:
问题是对于具有可变长度行的未排序文件,任何进程都必须通过文件计数换行符。没有捷径可走。
但是,如果文件已排序(例如,带有时间戳的日志文件)或具有固定长度的行,则您可以根据字节位置查找文件。在日志文件示例中,您可以像我在此处的 Python 脚本* 那样执行一定范围内的二进制搜索。在固定记录长度文件的情况下,这真的很容易。您只需
linelength * linecount
在文件中查找字符。* 我一直想发布对该脚本的另一个更新。也许我会在这些日子里解决它。
我发现了以下用途
sed
希望它对某人有用!
这是我第一次在这里发帖!无论如何,这很容易。假设您想从名为 file.txt 的文件中提取第 8872 行。这是您的操作方法:
cat -n 文件.txt | grep '^ *8872'
现在的问题是在这之后找到 20 行。要做到这一点,你做
cat -n 文件.txt | grep -A 20 '^ *8872'
有关周围或之前的行,请参阅 grep 手册中的 -B 和 -C 标志。
丹尼斯的 sed 答案是要走的路。但是在 bash 下只使用 head & tail:
这会扫描前 $1+$2 行两次,因此比丹尼斯的回答差得多。但是你不需要记住所有那些 sed 字母来使用它......
使用以下命令获取特定范围的行
这里 debug.log 是我的文件,其中缺少行,我曾经将行号从 1220974 到 1513793 的行打印到文件 test.log。希望它有助于捕捉线条的范围。
Perl 为王:
红宝石单线版本。
它可能对某人有用。Dennis 和 Dox 提供的 'sed' 解决方案非常好,即使它看起来更快。
您可以使用“nl”。
例如,这个 awk 将打印 20 到 40 之间的行
如果您知道行号,假设您想从文件中获取第 1、3 和 5 行,例如 /etc/passwd: