<> == How can I print the n'th line of a file? == One dirty (but not quick) way is: {{{#!highlight bash sed -n "${n}p" < "$file" }}} But this reads the entire file even if only the third line is desired, which can be avoided by using the `q` command to quit on line `$n`, and deleting all other lines with the `d` command: {{{#!highlight bash sed "${n}q;d" < "$file" }}} Or {{{#!highlight bash sed "$n!d;q" < "$file" }}} Which appears to be faster with all of GNU, busybox and ast-open sed implementations. Another method is to grab lines starting at `n`, then get the first line of that. {{{#!highlight bash <"$file" tail -n "+$n" | head -n 1 }}} As that uses more specialized tools, that's generally generally significantly faster. Another approach, using [[AWK]]: {{{#!highlight bash awk -v n="$n" 'NR==n{print;exit}' < "$file" }}} If more than one line is needed, it's easy to adapt any of the previous methods: {{{#!highlight bash x=3 y=4 sed "$x,$y!d;${y}q" < "$file" # Print lines $x to $y; quit after $y. tail -n "+$x" < "$file" | head -n "$(( y - x + 1 ))" # Same, generally faster awk -v x="$x" -v y="$y" 'NR>=x; NR==y{exit}' < "$file" # Same, generally slower }}} Or a counter with a simple `read` loop, though that's going to be orders of magnitude slower for any input with more than a few hundred lines. {{{#!highlight bash # Bash/ksh/zsh { m=0 while ((m++ < x - 1)) && read -r _; do : done head -n "$((y - x + 1))" } < "$file" }}} To read into a variable, it is preferable to use `read` or `mapfile` aka `readarray` rather than an external utility. More than one line can be read into the given array variable or the default array `MAPFILE` by adjusting the argument to mapfile's -n option: {{{#!highlight bash # Bash4 { mapfile -s "$((x - 1))" -n "$((y - x + 1))" lines printf %s "${lines[@]}" } < "$file" }}} === See Also === * [[BashFAQ/001]] * http://wiki.bash-hackers.org/commands/builtin/mapfile ---- CategoryShell