使用Bash打开并将数据写入文本文件?


247

如何通过Linux中的Shell脚本自动将数据写入文本文件?

我能够打开该文件。但是,我不知道如何向其中写入数据。

Answers:


409
echo "some data for the file" >> fileName

7
该运算符的名称是什么?我想找到有关它的手册。
弗拉德T.

96
操作员>将输出重定向到覆盖该文件(如果存在)的文件。>>将追加到现有文件中。
Triton Man

4
谢谢你,这里是它的链接到维基页面,以防有人需要en.wikipedia.org/wiki/...
弗拉德T.

11
如果您需要使用root特权来执行此操作,请按以下方式进行操作:sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat 2015年

1
如果我的文字是这样的并且由于某种原因我不能使用curlwget怎么办?
asedsami

145
#!/bin/sh

FILE="/path/to/file"

/bin/cat <<EOM >$FILE
text1
text2 # This comment will be inside of the file.
The keyword EOM can be any text, but it must start the line and be alone.
 EOM # This will be also inside of the file, see the space in front of EOM.
EOM # No comments and spaces around here, or it will not work.
text4 
EOM

1
多行输出效果不错。
Federico Zancan'9

7
新手将从确切知道如何处理此文件中受益。如何保存,如何运行等
Danny

13
请说明而不是简单地编写一段代码。这将使它对每个人(尤其是新手)都更有帮助。
卡斯珀·汉森

2
在这种情况下,带有$ some_var这样的变量的脚本会丢失。如何解决?
ATrubka


60

您可以将命令的输出重定向到文件:

$ cat file > copy_file

或附加到它

$ cat file >> copy_file

如果要直接编写命令,请输入 echo 'text'

$ echo 'Hello World' > file

3
如果您需要root许可:(sudo sh -c 'cat file > /etc/init/gunicorn.conf'由于上述lukaserat的评论)
航空

46
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 

38
对您的代码的解释将使它对其他人更有用。甚至诸如“ here document”和“ redirection”之类的词汇标注也可以将搜索者指向其他资源。
Palpatim 2014年

2
对于这样的事情,解释不是很必要。
Bhargav Nanekalva 2015年

6
当您已经知道答案时,永远不需要解释。对我而言,由于缺少详细信息,上述代码没有帮助。
索伦Ullidtz


1
在EOF之后-应该没有空格。
ЮрийСветлов

24

我知道这是一个该死的老问题,但是由于OP是关于脚本编写的,并且对于google将我带到这里的事实,还应该提到同时打开用于读取和写入的文件描述符。

#!/bin/bash

# Open file descriptor (fd) 3 for read/write on a text file.
exec 3<> poem.txt

    # Let's print some text to fd 3
    echo "Roses are red" >&3
    echo "Violets are blue" >&3
    echo "Poems are cute" >&3
    echo "And so are you" >&3

# Close fd 3
exec 3>&-

然后cat在终端上的文件

$ cat poem.txt
Roses are red
Violets are blue
Poems are cute
And so are you

此示例导致打开文件poem.txt以便在文件描述符3上进行读取和写入。它还显示* nix框比stdin,stdout和stderr(fd 0,1,2)知道更多的fd。它实际上占有很多。通常,可以在/proc/sys/file-max或中找到内核可以分配的文件描述符的最大数量,/proc/sys/fs/file-max但是使用高于9的任何fd都是危险的,因为它可能会与内部使用的Shell使用的fd相冲突。因此,请勿打扰,仅使用fd的0-9。如果您在bash脚本中需要更多9个文件描述符,则无论如何都应使用其他语言:)

无论如何,fd可以以许多有趣的方式使用。


14

我喜欢这个答案:

cat > FILE.txt <<EOF

info code info 
...
EOF

但会建议cat >> FILE.txt << EOF您是否只想在文件末尾添加一些内容,而不必清除已存在的内容

像这样:

cat >> FILE.txt <<EOF

info code info 
...
EOF

1
与答案添加一些解释如何回答帮助OP在固定电流问题
ρяσѕρєяķ

9

按照@lycono的要求将我的评论作为答案

如果您需要使用root特权来执行此操作,请按照以下方式进行操作:

sudo sh -c 'echo "some data for the file" >> fileName'

6
您可能要避免仅运行根外壳程序来打印字符串。尝试echo "some data for the file" | sudo tee -a fileName >/dev/null仅以teeroot 身份运行。
Tripleee '18

6

对于此处没有文档的环境(MakefileDockerfile等),您通常可以使用它printf来作为合理易读且有效的解决方案。

printf '%s\n' '#!/bin/sh' '# Second line' \
    '# Third line' \
    '# Conveniently mix single and double quotes, too' \
    "# Generated $(date)" \
    '# ^ the date command executes when the file is generated' \
    'for file in *; do' \
    '    echo "Found $file"' \
    'done' >outputfile

1
您在上方的评论尝试回显“文件的某些数据” | sudo tee -a fileName> / dev / null仅以根用户身份运行tee。 真的很有用!
Kojo

5

我以为有几个非常好的答案,但是没有所有可能性的简要总结。从而:

此处大多数答案背后的核心原理是重定向。对于写入文件,有两个重要的重定向操作符:

重定向输出:

echo 'text to completely overwrite contents of myfile' > myfile

追加重定向输出

echo 'text to add to end of myfile' >> myfile

这里文件

提到的其他内容echo 'text',也可以通过“此处的文档”以交互方式写入文件,而不是通过固定的输入源,该文档在上面的bash手册的链接中也有详细介绍。这些答案,例如

cat > FILE.txt <<EOF 要么 cat >> FILE.txt <<EOF

使用相同的重定向运算符,但通过“此处文档”添加另一层。在上述语法中,您通过的输出写入FILE.txt cat。仅在给交互式输入指定了一些特定的字符串(在这种情况下为“ EOF”)之后才进行写操作,但这可以是任何字符串,例如:

cat > FILE.txt <<'StopEverything' 要么 cat >> FILE.txt <<'StopEverything'

也会一样工作。在这里,文档还会寻找各种分隔符和其他有趣的解析字符,因此请查看文档以获取有关此内容的更多信息。

这里的字符串

有点费解,并且更多地是在理解重定向和Here Documents语法方面的练习,但是您可以将Here Document样式语法与标准重定向运算符结合在一起,成为Here String:

重定向cat输入的输出

cat > myfile <<<'text to completely overwrite contents of myfile'

追加cat输入的重定向输出

cat >> myfile <<<'text to completely overwrite contents of myfile'


0

也可以在这里使用文件和vi,下面的脚本生成带有3行和变量插值的FILE.txt

VAR=Test
vi FILE.txt <<EOFXX
i
#This is my var in text file
var = $VAR
#Thats end of text file
^[
ZZ
EOFXX

然后文件将有3行,如下所示。“ i”将启动vi插入模式,并类似地使用Esc和ZZ关闭文件。

#This is my var in text file
var = Test
#Thats end of text file

0

这是我的答案。$ cat文件> copy_file


1
什么是文件和copy_file?
XPD
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.