我想大家都知道有用的Linux命令行工具head
和tail
。 head
允许您打印文件的第一个X行, tail
相同但打印文件的结尾。 什么是打印文件中间的好命令? middle --start 10000000 --count 20
(打印第10万行至第10000000行)。
我正在寻找能够有效处理大文件的东西。 我试过tail -n 10000000 | head 10
tail -n 10000000 | head 10
,它是可怕的缓慢。
sed -n '10000000,10000020p' filename
你可能可以像这样加快速度:
sed -n '10000000,10000020p; 10000021q' filename
在这些命令中,选项-n
使sed
“禁止自动打印模式空间”。 p
命令“打印当前模式空间”和q
命令“立即退出sed脚本而不处理任何input…”引号来自于sed
man
页 。
顺便说一句,你的命令
tail -n 10000000 filename | head 10
从档案末尾的第一百万行开始,而你的“中间”命令似乎从一开始的千万分之一开始 ,这相当于:
head -n 10000010 filename | tail 10
问题是,对于具有可变长度行的未sorting文件,任何进程将不得不通过文件计算换行符。 没有办法使这个快捷方式。
但是,如果对文件进行了sorting(例如,带有时间戳的日志文件)或者具有固定长度的行,则可以根据字节位置查找文件。 在日志文件的例子中,你可以做一个二进制search的时间范围,就像我的Python脚本一样。 在固定logging长度文件的情况下,这非常简单。 你只要在文件中寻找linelength * linecount
字符。
*我保留意义,发布另一个更新的脚本。 也许我会在这些日子里面谈谈。
我发现了以下使用sed
sed -n '10000000,+20p' filename
希望对某人有用!
这是我第一次在这里张贴! 无论如何,这一个很容易。 假设您要从您的文件file.txt中拉出8872行。 这是你如何做到的:
cat -n file.txt | grep'^ * 8872'
现在的问题是在这之后find20行。 要做到这一点,你呢
cat -n file.txt | grep -A 20'^ * 8872'
对于周围或之前的行,请参阅grep手册中的-B和-C标志。
丹尼斯的答案是要走的路。 但是在bash下使用head&tail:
middle(){head -n $ [$ 1 + $ 2] | 尾巴-n $ 2; }
这扫描了第一个$ 1 + $ 2线两次,所以比丹尼斯的答案更糟糕。 但是你不需要记住所有的sed字母来使用它….
ruby版本。
ruby -pe 'next unless $. > 10000000 && $. < 10000020' < filename.txt
这可能对某人有用。 丹尼斯和多克斯提供的“sed”解决scheme是非常好的,即使它看起来更快。
你可以用'nl'。
nl filename | grep <line_num>
例如,这个awk将打印20到40之间的行
awk'{if((NR> 20)&&(NR <40))print $ 0}'/ etc / passwd
如果你知道行数,比如你想从文件中得到第1,3,5行,就说/ etc / passwd:
perl -e 'while(<>){if(++$l~~[1,3,5]){print}}' < /etc/passwd
使用以下命令获取特定范围的行
awk 'NR < 1220974{next}1;NR==1513793{exit}' debug.log | tee -a test.log
这里debug.log是我的文件,它由缺less的行组成,我用来打印从1220974行号到1513793的行到一个文件test.log。 希望这将有助于捕捉线的范围。