Додавання рядка до файлу в команді 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? Ваш фрагмент труби повинен працювати.
Брекен

@DoubleBass: відповідь Матьє Мітчелла є кращою, оскільки він не змінює файл (ні в пам'яті, ні на диску), а натомість використовує функцію вбудованої команди.
Брайан Ботчер

Відповіді:


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

Зауважте, що ви не обмежені одним рядком. catбуде читати з stdin, поки не досягне 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.
Девід Фоерстер

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, але для яких інших оболонок це працює? Кш? Тире?
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
залежаючи
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.