2011-11-17 69 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