2011-11-17 55 views
26

我有一个300MB的sql转储,在特定的行上给我一个错误。输出特定行巨大的文本文件

但该行位于文件的中间。什么是最好的方法?

head -n middleLine dump.sql > output

或者我可以只输出我需要的线?

+0

你需要这条线之后什么也或者只是什么之前? –

回答

33

你可以使用sed -n -e 123456p your.dump打印线123456

+0

太棒了!谢谢。我实际上使用'sed -n 123,130p my.dump'来输出行范围! – balsagoth

+2

也许这只是我,但在我看来,糟糕的风格,跳过'-e'。我也经常在'-e'之后引用sed命令,因为它经常包含各种奇怪的:-)字符......我会写它'sed -n -e'123,130 p'my.dump'。 – 2011-11-17 12:30:16

3

您可以使用SED:

sed -n "x p" dump.sql 

其中x是行号。

-4

如果您知道该行上我会用grep的短语。如果短语 “ERRORTEXT” 使用:

$ cat dump.sql | grep "errortext" 
+0

这不是我所要求的。这将输出文件中的每个“errortext”,而不是我需要输出的行。 – balsagoth

+0

超过猫| grep无用,而grep也可以处理文件。查看http://partmaps.org/era/unix/award.html –

22

如果文件很长,可以考虑使用

sed -n 'X{p;q}' file 

其中X是行号。它将在到达该行后停止读取文件。

+4

+1,找到该行后退出。 –

+4

在某些系统上,如osx,它需要一个额外的分号:'sed -n'X {p; q;}'文件' – LopSae

2

这可能会为你工作:

sed 'X!d;q' file 

其中X是行号。

4

如果sed太慢供你品尝,你也可以使用

cat $THE_FILE | head -n $DESIRED_LINE | tail -n 1 
+1

如果我运行类似于:“started ='date +%s%3N'; for i in {1..500}; do echo“$ longlist”| sed -n 10p; done; stoped ='date +%s%3N'; echo“scale = 3; ($ stoped - $ started)/ 1000“| bc”,并且与head -n 10 |相比较tail -n 1,sed在我的系统中速度更快。 – desgua

3

这也可以用Perl完成:

perl -wnl -e '$. == 4444444 and print and exit;' 

4444444是要打印的行号。

请注意,一旦打印行,该文件应该关闭,因此您不会继续阅读它。

2

您也可以尝试像awk

awk 'NR==YOUR_LINE_NO{print}' file_name