Mở và ghi dữ liệu vào tệp văn bản bằng Bash?


247

Làm cách nào tôi có thể tự động ghi dữ liệu vào tệp văn bản bằng cách viết shell trong Linux?

Tôi đã có thể mở tập tin. Tuy nhiên, tôi không biết cách ghi dữ liệu vào đó.

Câu trả lời:


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

7
Tên của nhà điều hành này là gì? Tôi muốn tìm một hướng dẫn về nó.
Vlad T.

96
toán tử> chuyển hướng đầu ra thành tệp ghi đè tệp nếu tồn tại. >> sẽ nối vào một tập tin hiện có.
Triton Man

4
Cảm ơn bạn, đây là liên kết đến trang wiki, trong trường hợp ai đó cần nó en.wikipedia.org/wiki/iêu
Vlad T.

11
Nếu bạn cần làm điều này với quyền root, hãy làm theo cách này:sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat

1
Điều gì xảy ra nếu văn bản của tôi giống như thế này và vì bất kỳ lý do gì, tôi không thể sử dụng curlhoặc wget?
asbedami

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
Đẹp đi đầu ra đa dòng.
Federico Zancan

8
Người mới sẽ có lợi khi biết chính xác phải làm gì với tệp này. Làm thế nào để lưu nó, làm thế nào để chạy nó, v.v.
Danny

14
Hãy giải thích thay vì chỉ đơn giản là đưa lên một đoạn mã. Nó sẽ làm cho nó hữu ích hơn nhiều cho mọi người - đặc biệt là người mới.
Casper B. Hansen

2
Trong trường hợp này, các tập lệnh với các biến như $ some_var bị mất. Làm thế nào nó có thể được cố định?
ATrubka


60

Bạn có thể chuyển hướng đầu ra của lệnh sang tệp:

$ cat file > copy_file

hoặc thêm vào nó

$ cat file >> copy_file

Nếu bạn muốn viết trực tiếp lệnh là echo 'text'

$ echo 'Hello World' > file

3
Nếu bạn cần sự cho phép root: sudo sh -c 'cat file > /etc/init/gunicorn.conf'(nhờ nhận xét của lukaserat ở trên)
aero

46
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 

38
Một lời giải thích về mã của bạn sẽ đi một chặng đường dài hướng tới việc làm cho nó dễ sử dụng hơn đối với người khác. Ngay cả các chú thích từ vựng như "tài liệu ở đây" và "chuyển hướng" cũng có thể hướng người tìm đến các tài nguyên khác.
Palpatim

2
Giải thích là không cần thiết cho một cái gì đó như thế này.
Bhargav Nanekalva 17/08/2015

6
Giải thích là không bao giờ cần thiết khi bạn đã biết câu trả lời. Đối với tôi mã trên không hữu ích do thiếu chi tiết.
Søren Ullidtz


1
Sau EOF - nên không có khoảng trắng.
Юрий Светлов

24

Tôi biết đây là một câu hỏi cũ chết tiệt, nhưng vì OP nói về kịch bản, và thực tế là google đã đưa tôi đến đây, nên mở các mô tả tệp để đọc và viết cùng một lúc.

#!/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>&-

Sau đó, cattập tin trên thiết bị đầu cuối

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

Ví dụ này làm cho tệp poem.txt được mở để đọc và ghi trên bộ mô tả tệp 3. Nó cũng cho thấy các hộp * nix biết nhiều fd hơn sau đó chỉ là stdin, stdout và stderr (fd 0,1,2). Nó thực sự giữ rất nhiều. Thông thường, số lượng mô tả tệp tối đa mà kernel có thể phân bổ có thể được tìm thấy trong /proc/sys/file-maxhoặc /proc/sys/fs/file-maxsử dụng bất kỳ fd nào trên 9 đều nguy hiểm vì nó có thể xung đột với fd được sử dụng bởi shell. Vì vậy, đừng bận tâm và chỉ sử dụng 0-9 của fd. Nếu bạn cần thêm 9 mô tả tệp trong tập lệnh bash, bạn nên sử dụng một ngôn ngữ khác :)

Dù sao đi nữa, fd có thể được sử dụng theo nhiều cách thú vị.


14

Tôi thích câu trả lời này:

cat > FILE.txt <<EOF

info code info 
...
EOF

nhưng sẽ đề xuất cat >> FILE.txt << EOFnếu bạn muốn thêm một cái gì đó vào cuối tập tin mà không xóa sạch những gì đã tồn tại

Như thế này:

cat >> FILE.txt <<EOF

info code info 
...
EOF

1
Thêm một số lời giải thích với câu trả lời về cách câu trả lời này giúp OP khắc phục vấn đề hiện tại
ρяσѕρєя K

9

Di chuyển nhận xét của tôi dưới dạng câu trả lời, theo yêu cầu của @lycono

Nếu bạn cần làm điều này với quyền root, hãy làm theo cách này:

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

6
Bạn có thể muốn tránh chạy shell root chỉ để in một chuỗi. Cố gắng echo "some data for the file" | sudo tee -a fileName >/dev/nullchỉ chạy teenhư root.
tripleee

6

Đối với các môi trường không có tài liệu ở đây ( Makefile, Dockerfilev.v.), bạn thường có thể sử dụng printfcho một giải pháp hợp lý và hiệu quả.

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
Nhận xét của bạn ở trên Hãy thử echo "một số dữ liệu cho tệp" | sudo tee -a fileName> / dev / null để chỉ chạy tee với quyền root. đã thực sự hữu ích!
Kojo

5

Tôi nghĩ rằng có một vài câu trả lời hoàn toàn tốt, nhưng không có tóm tắt ngắn gọn về tất cả các khả năng; do đó:

Hiệu trưởng cốt lõi đằng sau hầu hết các câu trả lời ở đây là chuyển hướng . Hai là toán tử chuyển hướng quan trọng để ghi vào tệp:

Chuyển hướng đầu ra:

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

Nối đầu ra chuyển hướng

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

Tài liệu ở đây

Những người khác được đề cập, thay vì từ một nguồn đầu vào cố định như echo 'text', bạn cũng có thể tương tác ghi vào các tệp thông qua "Tài liệu ở đây", cũng được nêu chi tiết trong liên kết đến hướng dẫn sử dụng bash ở trên. Những câu trả lời, vd

cat > FILE.txt <<EOF hoặc là cat >> FILE.txt <<EOF

sử dụng các toán tử chuyển hướng tương tự, nhưng thêm một lớp khác thông qua "Tài liệu ở đây". Trong cú pháp trên, bạn viết thư cho FILE.txt thông qua đầu ra của cat. Việc viết chỉ diễn ra sau khi đầu vào tương tác được đưa ra một số chuỗi cụ thể, trong trường hợp này là 'EOF', nhưng đây có thể là bất kỳ chuỗi nào, ví dụ:

cat > FILE.txt <<'StopEverything' hoặc là cat >> FILE.txt <<'StopEverything'

cũng sẽ làm việc như vậy. Tại đây Tài liệu cũng tìm kiếm các dấu phân cách khác nhau và các ký tự phân tích cú pháp thú vị khác, vì vậy hãy xem các tài liệu để biết thêm thông tin về điều đó.

Đây

Một chút phức tạp và nhiều bài tập để hiểu cả cú pháp chuyển hướng và cú pháp Tài liệu ở đây, nhưng bạn có thể kết hợp cú pháp kiểu Tài liệu ở đây với các toán tử chuyển hướng tiêu chuẩn để trở thành Chuỗi ở đây:

Chuyển hướng đầu ra của mèo đầu vào

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

Nối đầu ra chuyển hướng của đầu vào mèo

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


0

Cũng có thể sử dụng ở đây tài liệu và vi, tập lệnh bên dưới tạo FILE.txt với 3 dòng và nội suy biến

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

Sau đó, tập tin sẽ có 3 dòng như dưới đây. "i" là bắt đầu chế độ chèn vi và tương tự để đóng tệp bằng Esc và ZZ.

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

0

đây là câu trả lời của tôi. $ tập tin mèo> copy_file


1
tập tin và copy_file là gì?
XPD
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.