Добавить строку в файл в команде cat?

11

Я могу сделать, 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".

DoubleBASS
источник
1
Может быть что-то подобное echo "My final line" >> file.txt?
Edwinksl
Я не хочу на самом деле добавить строку к объекту файла, просто в команду / трубопровод. Я уже знаю, что могу добавить строку, >>если я хочу редактировать сам файл.
DoubleBass
11
Вы случайно стерли file.txt? Ваш фрагмент кода должен работать.
Папоротник
@DoubleBass: ответ Матье Митчелла лучше, так как он не изменяет файл (ни в памяти, ни на диске), но вместо этого использует функцию встроенной команды.
Брайан

Ответы:

30

Вы можете использовать catспособность читать из стандартного ввода в сочетании с его способностью читать несколько файлов для достижения этой цели.

~$ 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

Обратите внимание, что вы не ограничены одной строкой. catбудет читать со стандартного ввода, пока не достигнет EOF. Вы можете передать выходные данные 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.
Дэвид Фёрстер
11

Для добавления строки в файл, вы можете просто использовать оператор перенаправления оболочки добавления >>(файл будет 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')
heemayl
источник
<()работает для bash, но для каких других оболочек он работает? КШ? Тире?
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
Используйте одинарные кавычки, и вам не нужен обратный слеш.
Wildcard
7

Это было уже разъяснено в комментариях к вопросу, но добавив его снова в качестве ответа здесь.

Команда, отмеченная в вопросе,

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

работает как положено - весь вывод подоболочки, сформированный скобками, передается второй команде.

Если файл не заканчивается новой строкой, возвращаемая строка добавляется к последней строке - это является общим для всех других решений здесь и может быть решено путем добавления еще одного (пустого) эха ранее.

Пауло Эберманн
источник
1
Если файл не заканчивается с новой строки, я хотел бы использовать awk: awk 1 file.txt; echo "My final line". awk 1 fileхороший трюк, чтобы компенсировать отсутствие EOL в конце файла.
Муру
Если файл не заканчивается новой строкой, вы также можете просто использовать echo "\nMy final line"без необходимости зависетьawk
fregante