shell 匹配最后两行

我想匹配一个文本文件除了最后两行以外的其他行

cat xx
1
2
3
4
5
6
7
8

我想匹配1-6,

阅读 2.2k
2 个回答

head -n -2 /path/to/file

楼上的答案是标准的解决方案,那么我来提供一种另外的解决方案吧。

bash 4+中提供一种内建命令mapfile,在 bash 官方手册中,是这么解释的:

Read lines from the standard input into the indexed array variable array, or from file descriptor fd if the -u option is supplied.
从标准输入中读取一行数据存入索引数组,或者提供-u 选项,从文件描述符中读取行数据

这里利用 bash 的重定向可以做一些有趣的事,也就是用纯粹的 bash 内建命令解决这个问题。

# 使用 mapfile,利用代码块构建一行命令
mapfile -n 0 line < /path/to/file; echo -e "${line[@]:0:((${#line[@]} -2))}"

这样可以达到head -n -2命令的效果,但是会说了,这样这么麻烦有什么意义?

使用 bash 的内建命令可以提升处理速度,这里我对两个命令做了测试:

# 一个拥有52行文本的文件
# head 命令
time head -n -3 tmp.txt
# 内建命令
time { mapfile -n 0 line < tmp.txt; printf '%s\n' "${line[@]:0:((${#line[@]} -2))}";} >/dev/null

结果如下:
clipboard.png

head 命令随着执行时间会变化,但内建命令总体保持稳定
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进