有沒有一種「規範」的方式來作到這一點? 我一直在使用head -n | tail -1
head -n | tail -1
能夠達到目的,可是我一直在想是否有一個Bash工具專門從文件中提取一行(或一系列行)。 數組
「規範」是指一個程序,其主要功能就是這樣作。 bash
# print line number 52 sed '52!d' file
sed有用的單行腳本 ide
使用awk
能夠很是快: 函數
awk 'NR == num_line' file
若是爲true,則執行awk
的默認行爲: {print $0}
。 工具
若是您的文件碰巧很大,則最好在讀取所需行後exit
。 這樣能夠節省CPU時間。 ui
awk 'NR == num_line {print; exit}' file
若是要從bash變量中提供行號,能夠使用: spa
awk 'NR == n' n=$num file awk -v n=$num 'NR == n' file # equivalent
這個問題被標記爲Bash,這是Bash(≥4)的處理方式:使用帶有-s
(跳過)和-n
(計數)選項的mapfile
。 unix
若是您須要獲取文件file
的第42行: code
mapfile -s 41 -n 1 ary < file
此時,您將擁有一個數組ary
,該數組的字段包含file
行(包括結尾的換行符),在此咱們跳過了前41行( -s 41
),並在讀取了一行( -n 1
以後)中止了-n 1
)。 這就是第42行。 要打印出來: get
printf '%s' "${ary[0]}"
若是您須要必定範圍的行,請說範圍爲42–666(含),並說您不想本身作數學,並在stdout上打印它們:
mapfile -s $((42-1)) -n $((666-42+1)) ary < file printf '%s' "${ary[@]}"
若是您也須要處理這些行,則存儲尾隨的換行符並非很方便。 在這種狀況下,請使用-t
選項(修剪):
mapfile -t -s $((42-1)) -n $((666-42+1)) ary < file # do stuff printf '%s\n' "${ary[@]}"
您能夠使用一個函數爲您執行此操做:
print_file_range() { # $1-$2 is the range of file $3 to be printed to stdout local ary mapfile -s $(($1-1)) -n $(($2-$1+1)) ary < "$3" printf '%s' "${ary[@]}" }
沒有外部命令,只有Bash內置函數!
要使用帶有變量做爲行號的sed打印第n行:
a=4 sed -e $a'q:d' file
這裏的-e標誌用於將腳本添加到要執行的命令。
對於大文件,最快的解決方案始終是tail | head,前提是兩個距離:
S
E
衆所周知。 而後,咱們能夠使用如下代碼:
mycount="$E"; (( E > S )) && mycount="+$S" howmany="$(( endline - startline + 1 ))" tail -n "$mycount"| head -n "$howmany"
多少隻是所需的行數。