在cat命令中在文件后添加一行?


11

我可以cat file.txt获取文件的内容,但是我也想坚持自己选择的最后一行。

我试过管道,(cat file.txt ; echo "My final line") |但只有最后一行通过管道。如何加入猫和最后一线?

编辑以澄清一点:我不希望修改文件本身。我知道,如果可以的话,echo "My final line" >> file.txt或者echo "My final line" | tee -a file.txt我只是想在此特定命令的上下文中执行附加操作,以便可以将file.txtand 串联在一起"My final line"


1
也许像echo "My final line" >> file.txt
edwinksl

我不想将行实际上附加到文件对象,仅在命令/管道中。我已经知道,>>如果要编辑文件本身,可以在该行后附加。
DoubleBass

11
你不小心擦除了file.txt吗?您的管道代码片段应该可以正常工作。
蕨菜

@DoubleBass:Mathieu Mitchell的答案是一个更好的答案,因为它不会修改文件(内存中或磁盘上的文件),而是利用内置命令的功能。
Bryan Boettcher

Answers:


30

您可以cat结合使用从stdin读取的功能和读取多个文件的功能来实现此目的。

~$ cat file.txt
Hello from file.txt

~$ echo "My final line" | cat file.txt -
Hello from file.txt
My final line

您也可以在前面加上一行,例如:

~$ echo "My final line" | cat - file.txt
My final line
Hello from file.txt

请注意,您不仅限于一行。cat将从stdin读取直到达到EOF。curl例如,您可以将输出从传递到之前或之后cat

~$ curl -s http://perdu.com | cat file.txt -
Hello from file.txt
<html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre>    * <----- vous &ecirc;tes ici</pre></strong></body></html>

1
(cat file.txt ; echo "My final line") | …也可以做到。但是,将其cat用于设计时最好采用+1。
ctrl-alt-delor

@ ctrl-alt-delor:子外壳还具有附加的派生过程的缺点,这是相对昂贵的。例如,尝试echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | catvs. ( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | cat甚至{ head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat
大卫·佛斯特

11

要将行添加到文件,您可以只使用shell append重定向操作符>>(该文件将带有open(2)-ed O_APPEND标志):

echo 'My final line' >>file.txt

现在,如果您只想查看文件内容并添加最后一行,则可以使用cat两个参数:

  • 首先,显然您的文件 file.txt
  • 第二个参数是您选择的字符串,并将字符串作为文件名传递(cat仅用于处理文件),您可以利用流程替换,<()它将返回文件描述符(/proc/self/fd/<fd_number>)

将这些放在一起:

cat file.txt <(echo 'My final line')

如果要分页输出,请假设less是您最喜欢的寻呼机:

less file.txt <(echo 'My final line')

<()适用于bash,但它还可以用于其他shell?Ksh?短跑?
jpaugh

1
@jpaugh kshzsh-是的,dash-号
heemayl

这将修改原件。
ctrl-alt-delor

11
sed -e '$aMy final line' file.txt

man sed选项-e

-e script, --expression=script
    add the script to the commands to be executed

$匹配最后一行并 a追加字符串。

如果要将行永久添加到文件,请使用 -i

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if SUFFIX supplied)

将命令更改为

sed -i -e '$aMy final line' file.txt

1
使用单引号,并且您不需要反斜杠。
通配符

7

在问题的注释中已经对此进行了澄清,但在此处再次添加它作为答案。

问题中提到的命令,

(cat file.txt ; echo "My final line") | other command

可以按预期工作-括号中形成的子外壳的所有输出都通过管道传递给第二个命令。

如果文件未以新行结尾,则将回显的字符串附加到最后一行–这与此处的所有其他解决方案相同,可以通过在其之前添加另一个(空)回显来解决。


1
如果文件不以换行符结尾,则使用awkawk 1 file.txt; echo "My final line"awk 1 file这是补偿文件末尾缺少EOL的好技巧。
muru 17-10-25,3

如果文件没有以新行结尾,您也可以使用echo "\nMy final line"而不必依赖awk
fregante
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.