Bashを使用してデータを開いてテキストファイルに書き込みますか?


247

Linuxのシェルスクリプトでテキストファイルにデータを自動的に書き込むにはどうすればよいですか?

ファイルを開くことができました。しかし、私はそれにデータを書き込む方法がわかりません。

回答:


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

7
このオペレーターの名前は何ですか?それについてのマニュアルを見つけたいのですが。
Vlad T.

96
演算子>出力がファイルにリダイレクトされ、ファイルが存在する場合は上書きされます。>>は既存のファイルに追加されます。
トリトンマン、

4
ここで、ありがとう誰かがそれを必要とする場合には、Wikiページへのリンクですen.wikipedia.org/wiki/...
ヴラドT.

11
あなたがroot権限でこれを行うために必要がある場合は、それをこのように実行しますsudo sh -c 'echo "some data for the file" >> fileName'
lukaserat

1
テキストがこのようなもので、何らかの理由で使用できない場合はcurlどうなりwgetますか?
asedsami 2016

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
マルチライン出力をうまく活用してください。
フェデリコザンカン

8
初心者は、このファイルをどう処理するかを正確に知ることでメリットを得られます。保存方法、実行方法など
Danny

14
単にコードを置くのではなく、説明してください。それはそれがすべての人、特に初心者にとって非常に役立つでしょう。
キャスパーB.ハンセン

2
この場合、$ some_varのような変数を持つスクリプトは失われます。どうすれば修正できますか?
ATrubka


60

コマンドの出力をファイルにリダイレクトできます。

$ cat file > copy_file

またはそれに追加

$ cat file >> copy_file

直接書きたい場合、コマンドは echo 'text'

$ echo 'Hello World' > file

3
ルート権限が必要な場合sudo sh -c 'cat file > /etc/init/gunicorn.conf':(上記のlukaseratのコメントに感謝)
aero

46
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 

38
コードの説明は、他の人がより使いやすくするために大いに役立ちます。「ヒアドキュメント」や「リダイレクト」などの語彙の呼び出しでも、検索者を他のリソースにポイントできます。
Palpatim 14

2
このようなものは説明はそれほど必要ありません。
Bhargav Nanekalva

6
すでに答えがわかっている場合は説明は不要です。詳細が不足しているため、上記のコードは役に立ちません。
セーレンUllidtz


1
EOFの後-スペースを入れないでください。
ЮрийСветлов

24

私はこれがいまいましい質問であることを知っていますが、OPはスクリプティングに関するものであり、グーグルが私をここに連れてきたという事実のため、同時に読み取りと書き込みのためにファイル記述子を開くことについても言及する必要があります。

#!/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ボックスは、fdinがstdin、stdout、およびstderr(fd 0、1、2)だけであることを示しています。それは実際にはたくさんあります。通常、ファイルの最大数は、カーネルが割り当てることができディスクリプタで見つけることができる/proc/sys/file-max/proc/sys/fs/file-maxが、それは、FDの内部でシェルが使用すると競合する可能性があるので9上の任意の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のための答えを持ついくつかの説明を追加
ρяσѕρєяK

9

@lyconoからのリクエストに応じて、コメントを回答として移動する

root権限でこれを行う必要がある場合は、次のようにします。

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

6
文字列を出力するためだけにルートシェルを実行したくない場合があります。rootとしてecho "some data for the file" | sudo tee -a fileName >/dev/nullのみ実行するteeようにしてください。
Tripleee

6

hereドキュメントが利用できない環境(、、など)MakefileではDockerfileprintfかなり読みやすく効率的なソリューションに使用できます。

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を実行します。 本当に役に立ちました!
古城

5

完全に良い答えはいくつかあると思いましたが、すべての可能性の簡潔な要約はありませんでした。したがって:

ここでのほとんどの答えの背後にある中心的なプリンシパルはリダイレクトです。2つは、ファイルに書き込むための重要なリダイレクト演算子です。

出力のリダイレクト:

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'

同様に動作します。ここで、ドキュメントはさまざまな区切り文字やその他の興味深い解析文字も探します。詳細については、ドキュメントを参照してください。

ヒア・ストリングス

少し複雑で、リダイレクトとヒアドキュメントの構文の両方を理解するための練習問題ですが、ヒアドキュメントスタイルの構文と標準のリダイレクト演算子を組み合わせて、ヒア文字列にすることができます。

cat入力の出力のリダイレクト

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

cat入力のリダイレクト出力の追加

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


0

hereドキュメントと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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.