Как объединить две строки в одну с разделителем

Файл / etc / mtab записывается командами mount и umount . Чтобы сохранить его в точности, потребуется немного поработать, потому что они могут обновлять / etc / mtab , только если этот файл доступен и доступен для записи.

Для обычного случая, когда / etc монтируется для чтения и записи в какой-то момент во время загрузки, дистрибутивы настраивают сценарий, который перезаписывает / etc / mtab во время запуска, как только корневой раздел смонтирован для чтения и записи. Это необходимо в случае, если система отключилась без размонтирования всего (например, из-за сбоя системы или сбоя питания).

В вашем случае, когда / etc находится в overlayfs, либо сценарий запуска запускается не в то время, когда / etc все еще доступен только для чтения, либо он не поддерживает случай наложения корня. Поэтому, если вы хотите сохранить / etc / mtab как обычный файл, вам придется настроить этот сценарий или время его выполнения.

Но вам, вероятно, не нужно этого делать. Обычно / etc / mtab является символической ссылкой на / proc / mounts . Эти два файла содержат в основном одинаковую информацию с одинаковым синтаксисом; с точки зрения приложений, которые их читают, они совместимы. Поскольку / proc / mounts отражает текущую информацию о ядре, она всегда актуальна, и команды mount и umount их не касаются.

Обратной стороной / proc / mounts по сравнению с / etc / mtab является то, что он показывает информацию (особенно параметры монтирования), напечатанную ядром, а не точные параметры. передается команде mount . Так что немного информации теряется. Однако эта информация редко бывает полезной.

6
26.08.2016, 15:20
7 ответов

Дополнительная фильтрация, которую вы выполняете для удаления новой строки, применяется только к команде date , поэтому попробуйте

{ cat /proc/loadavg && date; } | tr -d '\n'
1
27.01.2020, 20:20

Вот так:

( cat /proc/loadavg && date ) | sed 'N; s/\n/ @@ /'

Во-первых, ваши попытки не работают, потому что канал | применяется только к date , а не к обеим командам. Чтобы обойти это, вам нужно запустить cat ... && date в подоболочке, а затем перенаправить stdout подоболочки.

Тогда tr '\ n' '@@' не работает, потому что вы не можете заменить символ несколькими символами.

И sed 's / \ n / @@ / g' не работает, потому что sed может видеть строки только по одной. Чтобы он видел новые строки, вам нужно объединить обе строки ввода в одном буфере. Это то, что делает N выше.

7
27.01.2020, 20:20

Это может вам помочь,

( cat /proc/loadavg && date ) | awk 'ORS=" @@ "'
3
27.01.2020, 20:20

Вы можете сделать это:

echo `cat /proc/loadavg` @@ `date`
8
27.01.2020, 20:20

Как насчет этого?

export DELIMITER=' @@ '; cat /proc/loadavg | tr -d '\n'; echo -n "$DELIMITER" && date

Вывод: 0,34 0,39 0,40 1/1065 29353 @ @ Fr 26. Авг, 09:30:26 CEST 2016

Он удаляет новую строку только после вывода строки с помощью cat, затем отображает строку-разделитель без новой строки (-n) и, наконец, добавляет вывод даты.

0
27.01.2020, 20:20

Просто для чего-то другого...

(cat /proc/loadavg && date) | paste -d@ - - | sed 's/@/ @@ /' 

paste -d@ - - вставляет две строки бок о бок с "@" между ними. Затем sed заменяет одиночный "@" на " @@ "

2
27.01.2020, 20:20

Лучше всего использовать printf . У вас есть две строки, и вы хотите вывести их с дополнительным форматированием. Это именно то, что делает printf .

$ printf "%s @@ %s\n" "$(cat /proc/loadavg)" "$(date)"

Ваша попытка tr не работает, поскольку tr изменяет символов , а не слова. Вы можете использовать его для замены символов новой строки одним единственным символом:

$ ( cat /proc/loadavg; date ) | tr '\n' '@'

... но это не совсем то, что вам нужно.

Ваша попытка sed не работает, так как новая строка удаляется из ввода sed (т.е. sed -n '/ \ n / p' inputfile никогда бы ничего не напечатал).

Вы все еще можете сделать это с помощью sed , если вы прочитаете вторую строку (с даты ) с помощью команды редактирования N при редактировании первой строки (которая помещает между ними новую строку):

$ ( cat /proc/loadavg; date ) | sed 'N;s/\n/ @@ /'

... но я лично предпочел бы решение printf .

15
27.01.2020, 20:20

Теги

Похожие вопросы