cat 명령에서 파일에 줄을 추가 하시겠습니까?


12

나는 cat file.txt파일의 내용을 얻을 수는 있지만 내가 선택한 마지막 줄에 고정하고 싶습니다.

파이핑을 시도 (cat file.txt ; echo "My final line") |했지만 최종 라인 만 파이프를 통과합니다. 고양이와 결승선에 어떻게 가입 할 수 있습니까?

명확히하기 위해 편집하십시오 : 파일 자체를 수정하고 싶지 않습니다. 나는 이런 경우라면 내가 할 수있는 것을 알고 echo "My final line" >> file.txt또는 echo "My final line" | tee -a file.txt그러나 나는 단지 내가 파이프의 연결에 할 수 있도록이 특정 명령의 컨텍스트 내에서 APPEND을하려고 file.txt하고 "My final line".


1
아마도 echo "My final line" >> file.txt?
edwinksl

실제로 명령 / 파이핑에서 파일 객체에 행을 추가하고 싶지 않습니다. >>파일 자체를 편집하려면 줄을 추가 할 수 있다는 것을 이미 알고 있습니다.
DoubleBass

11
실수로 지웠 file.txt습니까? 파이프 스 니펫이 작동해야합니다.
Bracken

@DoubleBass : Mathieu Mitchell의 대답은 파일 내 (메모리 내 또는 디스크)를 수정하지 않고 내장 명령의 기능을 활용하기 때문에 더 좋습니다.
Bryan Boettcher

답변:


30

당신이 활용할 수있는 cat이를 달성하기 위해 여러 개의 파일을 읽을 수있는 그것의 능력과 결합 STDIN에서 읽기의 능력을.

~$ cat file.txt
Hello from file.txt

~$ echo "My final line" | cat file.txt -
Hello from file.txt
My final line

다음과 같이 줄을 추가 할 수도 있습니다.

~$ echo "My final line" | cat - file.txt
My final line
Hello from file.txt

한 줄로 제한되지 않습니다. catEOF에 도달 할 때까지 stdin에서 읽습니다. curl예를 들어 의 출력 을 앞에 추가하거나에 추가하기 위해의 출력을 전달할 수 있습니다 cat.

~$ curl -s http://perdu.com | cat file.txt -
Hello from file.txt
<html><head><title>Vous Etes Perdu ?</title></head><body><h1>Perdu sur l'Internet ?</h1><h2>Pas de panique, on va vous aider</h2><strong><pre>    * <----- vous &ecirc;tes ici</pre></strong></body></html>

1
(cat file.txt ; echo "My final line") | …또한 할 것입니다. 그러나 cat설계된 용도로 사용하는 것이 +1이 좋습니다.
ctrl-alt-delor

@ ctrl-alt-delor : 서브 쉘은 또한 비교적 비싼 포크 프로세스의 단점이 있습니다. 예를 들어위한 시도 echo "$$" "$BASHPID" | head -q -n 1 /proc/mounts - | cat( head -q -n 1 /proc/mounts; echo "$$" "$BASHPID" ) | cat, 심지어 나 { head -q -n 1 /proc/mounts; echo "$$" "$BASHPID"; } | cat.
David Foerster

12

파일에 행을 추가하려면 쉘 추가 리디렉션 연산자를 사용 >>하면됩니다 (파일은 플래그 open(2)와 함께 -ed됩니다 O_APPEND).

echo 'My final line' >>file.txt

이제 마지막 줄이 추가 된 파일의 내용 을 보려면cat 두 가지 인수를 사용하십시오.

  • 먼저, 파일은 분명히 말합시다 file.txt
  • 두 번째 인수는 선택한 문자열이며 문자열을 파일 이름으로 ( cat파일 만 처리하는 경우) 전달하면 프로세스 대체를 활용할 수 있습니다 .이 <()경우 파일 설명자 ()가 반환됩니다 /proc/self/fd/<fd_number>).

이것들을 정리하면 :

cat file.txt <(echo 'My final line')

less선호하는 호출기로 가정하여 출력을 페이징하려면 다음을 수행 하십시오.

less file.txt <(echo 'My final line')

<()bash에서는 작동하지만 다른 쉘에서는 작동합니까? Ksh? 대시?
jpaugh

1
@jpaugh ksh, zsh-예, dash-아니요
heemayl

원본을 수정합니다.
ctrl-alt-delor

11
sed -e '$aMy final line' file.txt

에서 man sed옵션-e

-e script, --expression=script
    add the script to the commands to be executed

$마지막 줄과 일치하고 a문자열을 추가합니다.

파일에 줄을 영구적으로 추가하려면 다음을 사용하십시오. -i

-i[SUFFIX], --in-place[=SUFFIX]
    edit files in place (makes backup if SUFFIX supplied)

명령을 다음으로 변경

sed -i -e '$aMy final line' file.txt

1
작은 따옴표를 사용하면 백 슬래시가 필요하지 않습니다.
와일드 카드

7

그것은 질문에 대한 의견에서 이미 명확했지만 여기에 대답으로 다시 추가했습니다.

질문에 언급 된 명령은

(cat file.txt ; echo "My final line") | other command

예상대로 작동 – 괄호로 형성된 서브 쉘의 모든 출력이 두 번째 명령으로 파이프됩니다.

파일이 줄 바꿈으로 끝나지 않으면 반향 된 문자열이 마지막 줄에 추가됩니다.이 줄은 다른 모든 솔루션에서 일반적이며 다른 (빈) 반향을 추가하여 해결할 수 있습니다.


1
파일이 줄 바꿈으로 끝나지 않으면 awk:을 사용 awk 1 file.txt; echo "My final line"합니다. awk 1 file파일 끝에서 누락 된 EOL을 보완하는 좋은 방법입니다.
muru

파일이 줄 바꿈으로 끝나지 않으면, echo "\nMy final line"의존하지 않고도 사용할 수 있습니다awk
fregante
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.