2010-03-13 76 views

回答

249

head採取第一線,從一個文件,並且-n參數可用於指定多少行應提取:

line=$(head -n 1 filename) 
+1

比read方法的開銷要大得多。 '$()'分離出一個子shell,並且使用外部命令(* any * external command)意味着你調用'execve()',調用鏈接器和加載器(如果它使用共享庫,通常情況下)等 – 2017-08-01 16:17:17

+1

它可能更短:'line =「$(head -1 FILENAME)」' – nikolay 2017-08-10 16:20:19

+0

還有: 'line = \'head -1 FILENAME \'' – 2018-02-13 10:22:46

9
line=$(head -1 file) 

將正常工作。 (如前面的答案)。但是

line=$(read -r FIRSTLINE < filename) 

會稍微快一點,因爲read是一個內置的bash命令。

+17

第二種方法不能像寫入,因爲'read'不會打印任何東西(所以'line'變成空白),並且也在子shell中執行(所以'FIRSTLINE'被設置爲第一行,但只在子shell中,因此之後不可用) 。解決方案:只需使用'read -r line 2010-03-13 19:31:03

35

使用bash讀取第一行,使用read聲明。例如

read -r firstline<file 

firstline將是你的變量(無需分配到另一個)

+0

嘗試使用'cat ... |讀取-r VAR'並且它失敗:( – sorin 2013-05-31 13:22:02

+0

你怎樣讀第二行? – qed 2014-02-24 22:10:43

+1

@sorin,'cat ... | var VAR在大多數shell中都會失敗(據我所知除了'zsh'之外),因爲管道中的每個組件都將運行在不同的子shell中,這意味着'$ VAR'將在子shell中設置(在管道完成執行後立即停止存在),而不是在調用shell中。 '讀取VAR << EOF \ n $(cat ...)\ nEOF'(其中每個'\ n'都是一個換行符)。 – zrajm 2017-03-28 11:12:43

8

這足以和存儲的filename在變量$line的第一行:

read -r line < filename 

我也喜歡awk爲此:

awk 'NR==1 {print; exit}' file 

要存儲行本身,請使用var=$(command)語法。在這種情況下,line=$(awk 'NR==1 {print; exit}' file)

甚至sed

sed -n '1p' file 

具有同等line=$(sed -n '1p' file)


查看示例,當我們喂readseq 10,也就是說,數字從1到10的順序:

$ read -r line < <(seq 10) 
$ echo "$line" 
1 

$ line=$(awk 'NR==1 {print; exit}' <(seq 10)) 
$ echo "$line" 
1 
+1

'sed'1!d; q''(或者'sed -n '1p; q'')會模仿你的'awk'邏輯c並阻止進一步閱讀文件。因爲我們只想要第一行,所以我們可以用'sed q'或'awk'1; {exit}''或者甚至'grep -m1 ^'(更少的代碼,相同的基本邏輯)來作弊。 (這不是對downvote查詢的回覆。) – 2016-06-01 23:45:20

+0

@AdamKatz這是一套非常好的方法,謝謝!我發現'grep'非常聰明。我們當然也可以說'head -n 1 file'。 – fedorqui 2016-06-02 08:26:25

+0

是的,'head -n1'會更快(更小的二進制加載),'read'會更快(不需要二進制加載,這是內置的)。當我剛剛打印第一行時,我特別喜歡'grep -m1 --color .',因爲它也會爲此行添加顏色,這對於表格標題非常有用。 – 2016-06-02 15:53:03

4

的問題沒有問這是最快的,但要加到sed答案,-n'1p'表現不佳,因爲模式空間仍在大文件上掃描。出於好奇,我發現,「頭」戰勝SED狹義:

# best: 
head -n1 $bigfile >/dev/null 

# a bit slower than head (I saw about 10% difference): 
sed '1q' $bigfile >/dev/null 

# VERY slow: 
sed -n '1p' $bigfile >/dev/null 
3

只是echo源文件的第一清單到你的目標文件。

echo $(head -n 1 source.txt) > target.txt 
+1

對於哪個'head -n 1 source.txt> target.txt'將完全相同。 – YoYo 2016-12-12 05:19:13