有几种方法可以实现这个目标:
- 使用sed命令可以打印第n行:
sed -n "${n}p" "$file"
但是,这种方法会读取整个文件,即使只需要第三行。为了避免这个问题,可以使用q?命令在第n行退出,并使用d?命令删除其他所有行:
sed "${n}q;d" "$file"
- 另一种方法是获取从第n行开始的行,并获取其中的第一行:
tail -n "+$n" "$file" | head -n 1
- 使用AWK?也是一种方法:
awk -v n="$n" 'NR==n{print;exit}' "$file"
如果需要打印多行,可以轻松地修改任何先前的方法:
x=3 y=4
sed -n "$x,${y}p;${y}q;" "$file" # 打印$x到$y行;在第$y行后退出。
head -n "$y" "$file" | tail -n "$((y - x + 1))" # 同样
head -n "$y" "$file" | tail -n "+$x" # 如果你的tail支持的话
awk -v x="$x" -v y="$y" 'NR>=x{print} NR==y{exit}' "$file" # 同样
或者使用一个简单的读取循环计数器:
# Bash/ksh
m=0
while ((m++ < n)) && read -r _; do
:
done
head -n 1
为了将内容读入变量,最好使用read?或mapfile?而不是外部命令。可以通过调整mapfile?的-n?选项的参数,将多行内容读入给定的数组变量或默认数组MAPFILE?中:
# Bash4
mapfile -ts "$((n - 1))" -n 1 x <"$file"
printf '%s\n' "$x"
如果您觉得文章内容对你有一点帮助可以关注我,我在头条平台会持续分享更多实用的shell技巧和最佳实践,如果想系统的快速学习shell的各种高阶用法和生产环境避坑指南可以看看《shell脚本编程最佳实践》专栏,专栏里有更多的实用小技巧和脚本代码分享。