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

我想大家都知道有用的Linux命令行工具headtailhead允许您打印文件的第一个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。 希望这将有助于捕捉线的范围。