Linux:提取文件的第一行

标签 linux bash shell openwrt

我正在使用 OpenWrt 和非常的空间。

尝试从文件中提取第一行。该行需要进入变量并从文件中删除。我可以使用 head 将其放入变量但不能使用 tail 因为据我所知我必须做 tail file > newFile 并且我没有空间容纳第二个文件。

有人知道是否有更好的技术吗?

最佳答案

编辑:您不能将我的旧答案(见下文)用于 OpenWrt,因为 OpenWrt 未随 ed 一起提供。多可惜。所以这里有两种方法:

vi 方式

vi 也是一个真正的编辑器,所以下面的代码可以工作:

vi -c ':1d' -c ':wq' file > /dev/null

我们用vi打开文件,用命令:1d删除第一行,用:wq保存退出,将所有输出重定向到 /dev/null。酷、干净、简短。

哦,你当然会跑:

firstline=$(head -n1 file)

在运行此 vi 命令以将文件的第一行放入变量 firSTLine 之前。

注意。在内存很少的系统上,当 file 很大时,此方法会失败。

dd 方式

dd 是一个很棒的工具。其他答案中给出的 dd 方法确实很棒,但它们依赖于 OpenWrt 未附带的 truncate 实用程序。这是一个解决方法:

firstline=$(head -n1 file)
linelength=$(head -n1 file | wc -c)
newsize=$(( $(wc -c < file) - $linelength ))
dd if=file of=file bs=1 skip=$linelength conv=notrunc
dd if=/dev/null of=file bs=1 count=0 seek=$newsize

即使是大文件和非常小的内存,这也能正常工作!最后一个 dd 命令扮演其他答案中给出的 truncate 命令的角色。


旧答案是:

您可以为此使用 ed:

firstline=$(printf '%s\n' 1p d wq | ed -s file.txt)

在每次调用时,您将在变量 firSTLine 中获取文件 file.txt 的第一行,并且该行将从文件中删除。

关于Linux:提取文件的第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24285152/

相关文章:

linux - [Linux]按组或用户限制CPU使用

linux - 从 vcard (*.vcf) 文件中提取姓名和电子邮件信息

linux - 带输入文件和 ftp 的 For 循环

python - 记录循环脚本的开始和结束时间

linux - Linux 上 "accepted"fd 上的 setsockopt

linux - Godaddy虚拟主机根目录

Bash Echo 传递到另一个脚本,未按预期工作

linux - 如何在 Linux/Unix 上永久设置 $PATH

bash - 一个shell脚本如何控制另一个脚本

shell - pip 没有卸载软件包