我正在编写一个bash脚本来查找文件(如果不存在),然后创建该文件并将其附加到文件中:

Host localhost
    ForwardAgent yes
格式。
我知道您可以执行以下操作:

cat temp.txt >> data.txt


但是,由于它有两行,所以看起来很奇怪。有没有办法以这种格式添加该内容:

echo "hello" >> greetings.txt


#1 楼

# possibility 1:
echo "line 1" >> greetings.txt
echo "line 2" >> greetings.txt

# possibility 2:
echo "line 1
line 2" >> greetings.txt

# possibility 3:
cat <<EOT >> greetings.txt
line 1
line 2
EOT


如果需要sudo(其他用户特权)来写入文件,请使用以下命令:

# possibility 1:
echo "line 1" | sudo tee -a greetings.txt > /dev/null

# possibility 3:
sudo tee -a greetings.txt > /dev/null <<EOT
line 1
line 2
EOT


评论


@TheLegend称为“此处文档”。在手册页中查看该段落。

– Hauke Laging
13年5月27日在15:00

另一种可能性是(echo“ line 1”; echo“ line 2”)>> greetings.txt。

–ott--
13年5月27日在15:38

@ ott--您不需要真正的子shell(即可以保存一个新进程),这就足够了:{echo“ line 1”;回显“第2行”; } >> greetings.txt

– Hauke Laging
13年5月27日在16:10

EOT和EOF有什么区别?

– cikatomo
16年9月9日在18:34

@cikatomo在猫<< EOT中,EOT只是一个随机字符串。也可能是猫<< FOO。

– Hauke Laging
16年1月9日在20:37

#2 楼

printf '%s\n    %s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt


或者,如果要使用文字标签(而不是问题中的四个空格):

printf '%s\n\t%s\n' 'Host localhost' 'ForwardAgent yes' >> file.txt


您可以实现与echo效果相同,但具体实现因实现而异,而printf不变。

#3 楼

echo -e "Hello \nWorld \n" >> greetings.txt


#4 楼

另一种方法是使用tee
tee -a ~/.ssh/config << END
Host localhost
  ForwardAgent yes
END

tee手册页中的一些选择行:

tee实用程序将标准输入复制到标准输出,从而形成一个
复制零个或多个文件。
-a-将输出追加到文件,而不是覆盖它们。


#5 楼

这是在文件中附加多行的示例:

{
        echo '  directory "/var/cache/bind";'
        echo '  listen-on { 127.0.0.1; };'
        echo '  listen-on-v6 { none; };'
        echo '  version "";'
        echo '  auth-nxdomain no;'
        echo '  forward only;'  
        echo '  forwarders { 8.8.8.8; 8.8.4.4; };'
        echo '  dnssec-enable no;'
        echo '  dnssec-validation no;'
} >> your_file.txt


评论


值得注意的是,此变体是ShellCheck建议github.com/koalaman/shellcheck/wiki/SC2129的一部分。

–mloskot
12月11日15:32

#6 楼

SED可以这样在文件末尾附加一行:sed -i '$ a text to be inserted' fileName.file $选择文件末尾,a告诉它要附加,然后是要插入的文本。然后当然是文件名。

来源:
http://www.yourownlinux.com/2015/04/sed-command-in-linux-append-and-insert-lines -to-file.html
=========================
这种方法是否比其他解决方案有更多好处? />是的,这种方法还具有附加优势,可以将其附加到搜索中返回的所有文件,例如:
在许多目录中的每个html页面上都缺少。

================================ ====

评论


如果您将显示在文件中追加多行的语法,那么这将是该问题的答案(尽管不是很有用)。所有其他答案都只需编写新文本即可。该答案将读取整个文件并重写它以及添加的文本。这种方法比其他方法有什么好处吗?

– G-Man说“恢复莫妮卡”
16 Mar 18 '16 at 20:09

这仅适用于GNU sed。 BSD sed出现以下错误:命令a期望\,后跟文本。因此,请勿将其用于脚本解决方案;容易断裂。 (或正确执行此操作,因为BSD所需的语法与POSIX兼容,并且也适用于GNU sed。

–通配符
16 Mar 18 '16 at 20:28

其他答案可以与find一起使用,如下所示:find。 -name“ * .txt” -exec sh -c'printf“%s \ n \ t%s \ n”“主机本地主机”“ ForwardAgent是” >>“ $ 1”'sh {}“;”。

– G-Man说“恢复莫妮卡”
16-3-19在4:12



这是一个非常好的解决方案,因为它不执行流重定向(>,>>),因此不会遭受诸如运行sudo echo'something'> / file等问题。对我来说,它完全允许在lxd容器中的文件上添加一行,如下所示:lxc exec c sed-'$ a newline'/ myfile。

–德拉科·阿特(Draco Ater)
16年8月23日在19:19

当文件不是新行的末尾时,echo“ a new line” >> foo.file不会创建新行,但是sed -i'$ aa new line'foo.file可以,所以sed更好,尤其是您希望始终在文件后添加新行。

–zhouji
16/09/12在10:27



#7 楼

我使用sed是因为它可以与sudo一起使用。例如:

sudo sed -i '$ a text to be inserted' fileName.file 


替代方案非常丑陋,如:

sudo bash -c "echo a text to be inserted >> fileName.file"  


ssh。

评论


为什么这个答案不好?这看起来像我需要的解决方案。有什么问题吗?如果没有,我将使用它并对其进行投票。

–MountainX
16年7月23日在8:20

您的sed -i不以扩展名作为参数吗?您的示例可能具有错误的参数。

– protometa
17年1月4日在19:57

#8 楼

另一个衬里是:

echo "Greetings 1" >> greetings.txt && echo "Greetings 2" >> greetings.txt


我更喜欢-e选项,因为它提供了更多控制权:

echo -e "Greeting 1\nGreetings 2\n" >> greetings.txt


#9 楼

可以使用Perl或Python模拟cat >> out.txt,以达到相同的效果。 Perl:

perl -e 'open(fh,">>","./out.txt");while(<>){printf(fh "%s",$_)};close(fh);'


Python:

python -c 'import sys;f=open(sys.argv[1],"a");l=[i for i in sys.stdin];f.write("".join(l))' out.txt 


请注意,对于python,您必须按Ctrl + D两次。有关更多信息,请参见有关stackoverflow的相关问题。

#10 楼

除了主要答案外,如果文件需要超级用户权限,则仅在sudo前面添加echo是行不通的。但是echo以普通特权运行。

这将对超级用户有效:
>>

评论


您在这里不需要su(sudo su不好)。但是您是对的,您需要做一些事情来管理shell重定向;也许sudo sh -c“ echo stuff >> file.txt”。没有节余,而是更好的做法。

–roaima
19年8月8日在13:51