我想每个人都知道 Linux 命令行实用程序很有用head
,tail
.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