Bash를 사용하여 텍스트 파일에 데이터를 열고 쓰시겠습니까?


247

Linux에서 셸 스크립트를 사용하여 텍스트 파일에 자동으로 데이터를 쓰려면 어떻게해야합니까?

파일을 열 수있었습니다. 그러나 데이터를 쓰는 방법을 모르겠습니다.

답변:


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

7
이 연산자의 이름은 무엇입니까? 그것에 관한 매뉴얼을 찾고 싶습니다.
Vlad T.

96
operator> 파일이 있으면 파일을 덮어 쓰는 출력으로 파일을 리디렉션합니다. >>는 기존 파일에 추가됩니다.
Triton Man

4
감사합니다, 여기 누군가가 그것을 필요로 할 경우를 대비하여 위키 페이지에 대한 링크가 있습니다. en.wikipedia.org/wiki/…
Vlad T.

11
루트 권한으로이 작업을 수행해야하는 경우 다음과 같이하십시오.sudo sh -c 'echo "some data for the file" >> fileName'
lukaserat

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

8
초보자는이 파일로 무엇을해야하는지 정확히 알면 도움이됩니다. 저장 방법, 실행 방법 등
Danny

14
단순히 코드를 작성하는 대신 설명하십시오. 모든 사람, 특히 초보자에게 훨씬 도움이 될 것입니다.
캐스퍼 B. 한센

2
이 경우 $ some_var와 같은 변수가있는 스크립트가 손실됩니다. 어떻게 고칠 수 있습니까?
ATrubka 2016 년


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

2
이와 같은 설명은 그다지 필요하지 않습니다.
Bhargav Nanekalva

6
이미 답을 알고있을 때는 설명이 필요하지 않습니다. 나에게 위의 코드는 세부 정보가 없기 때문에 도움이되지 않습니다.
Søren 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

이 예에서는 파일 설명자 3에서 읽고 쓸 수 있도록 poem.txt 파일을 열었습니다. 또한 * nix 상자는 stdin, stdout 및 stderr (fd 0,1,2)보다 더 많은 fd를 알고 있음을 보여줍니다. 실제로 많이 보유하고 있습니다. 일반적으로 커널이 할당 할 수있는 최대 파일 디스크립터 수는 9 개를 초과 /proc/sys/file-max하거나 /proc/sys/fs/file-maxfd를 사용하는 것은 쉘에서 내부적으로 사용하는 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의 요청에 따라 답변으로 내 의견 이동

루트 권한으로이를 수행해야하는 경우 다음과 같이하십시오.

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

6
문자열을 인쇄하기 위해 루트 쉘을 실행하지 않는 것이 좋습니다. 루트 echo "some data for the file" | sudo tee -a fileName >/dev/null로만 실행 하십시오 tee.
tripleee

6

여기에 문서를 사용할 수없는 환경 ( Makefile, Dockerfile등)의 경우 , 일반적 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
귀하의 코멘트 상기 echo "파일의 일부 데이터"| sudo tee -a tee를 루트로만 실행하려면 fileName> / dev / null입니다. 정말 유용했습니다!
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

here document 및 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

이것이 나의 대답이다. $ 고양이 파일> copy_file


1
file과 copy_file은 무엇입니까?
XPD
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.