Linux:提取文件的第一行

时间:2014-06-18 12:06:16

标签: linux bash shell openwrt

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

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

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

6 个答案:

答案 0 :(得分:4)

使用

sed -i -e '1 w /dev/stdout' -e '1d' file

答案 1 :(得分:3)

编辑:您不能使用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)

在每次通话时,您都会在变量file.txt中获取文件firstline的第一行,并且该行将从文件中删除。

答案 2 :(得分:2)

显示第一行并将其删除:

 head -1 file
 sed -i 1d file

但是,这会隐式创建一个临时文件。如本文中关于 sponge的指示,更好的解决方案可能是“In-place” editing of files

答案 3 :(得分:0)

我不会称之为优雅,但这是一种潜在的方式:

# Find the number of characters in the first line
BYTES=$(head -n 1 file | wc -c)
# Shift all the data in-place
dd if=file of=file bs=1 skip=$BYTES conv=notrunc
# Remove the extra bytes on the end
truncate -s -$BYTES file

答案 4 :(得分:0)

在没有任何临时文件的情况下,没有标准实用程序(dd除外)来修改文件。

可能有效的解决方案之一是:

LINELENGTH=$(head -1 test.txt | wc -c)
tail -n +2 test.txt | dd of=test.txt conv=notrunc
truncate -s -$LINELENGTH test.txt

有关此主题的讨论,请参阅https://unix.stackexchange.com/a/11074/15241

<强> 编辑:

首先使用curl下载文件(请参阅注释)。还有另一种选择:

curl URL | sed -e "1w first_line.txt" -e "1d" > rest.txt
firstline=$(cat first_line.txt)
rm first_line.txt

答案 5 :(得分:-2)

如果你有足够的公羊:

contents=$(cat file) 
echo "$contents" | sed -n '1 !p' > file

或者,使用ed:

ed file
2,$wq