Добавить шаблон перед разделителем

файл журнала для сканирования fsck

Технически "файл журнала" для fsck - это стандартный выход / стандартный ошибка . Это может быть перенаправлено и захвачено, но это не обязательно так.

Помните, что при запуске fsck файловая система недоступна для записи, поэтому дело не только в &> /var/log/mountall.log . Его вывод должен быть захвачен, а затем в какой-то момент зарегистрирован.

Используя / forcefsck или эквивалентный параметр ядра (например, fsck.mode = force ), фактический fsck запускается init (в случае параметра ядра, через который он передается, поэтому он не может быть универсальным по форме). Как init обрабатывает это, зависит от init; очевидно, выскочка на Ubuntu сохраняет вывод и регистрирует его (возможно, продолжайте читать). Systemd, похоже, сообщает некоторые подробности через системный журнал (если он включен, и, предположительно, в свой собственный журнал).

Я не уверен, что системы, основанные на Debian до 8 (systemd), регистрируют это вообще или даже то, как это было обработано. Сценарий SysV /etc/init.d/mountall.sh не относится к fsck, но, конечно, mount вызовет его автоматически, если файловая система не была проверена достаточно недавно (это может быть то, что вы на самом деле привыкли видеть в файле mountall.log выскочки, поэтому раньше я написал «возможно»).

Таким образом, обработка "forcefsck", вероятно, встроена прямо в исполняемый файл SysV init. Он действительно выводит на консоль, но я никогда не замечал, чтобы это было записано где-нибудь в Debian.

Если вы хотите проверить последний раз, когда файловая система была fsck'd, используйте:

dumpe2fs -h /dev/[node]| grep "Mount count"

Где [узел] - настоящий раздел. Это количество раз, когда fs монтировался с момента последней проверки (минимум 1, если он в настоящее время смонтирован).

2
26.11.2018, 22:40
3 ответа

ВBash:

#!/usr/bin/env bash

if [ "$#" -eq 0 ]
then
    printf "Missing argument\n" >&2
    exit 1
fi

num_of_delimiters="$(grep -o '|' <<< "$1" | wc -l)"
sting="$(sed -E 's,\s+\|,|,g' <<< "$1")"
sting="$(sed -E 's,\|\s+,|,g' <<< "$sting")"

case "$num_of_delimiters" in
    1)
    echo "$(cut -d '|' -f1 <<< "$sting")"=ID and "$(cut -d '|' -f2 <<< "$sting")"=Name
    ;;
    2)
    echo "$(cut -d '|' -f1 <<< "$sting")" = ID and "$(cut -d '|' -f2 <<< "$sting")" = Name and \
         "$(sed  's/./\U&/' <<< "$(cut -d '|' -f3 <<< "$sting")")" = OS
    ;;
    *)
    printf "More than 2 delimiters or no delimiters\n" >&2
    exit 2
esac

Он также будет печатать пробелы, как вы показали в своем примере, и будет преобразовать первую букву третьего слова в верхний регистр. Примеры:

$./sting.sh "2 | Ram"
2=ID and Ram=Name
$./sting.sh "1 |Chris|ubuntu"
1 = ID and Chris = Name and Ubuntu = OS

https://www.shellcheck.net/не сообщает об ошибках.

0
27.01.2020, 22:02
awk -F '|' '
            { printf("%d = ID and %s = Name", $1, $2) } 
    NF == 3 { printf(" and %s = OS", $3) }
            { printf("\n") }' file

Это будет генерировать

1 = ID and Chris = Name and ubuntu = OS
2 = ID and  Ram = Name

для приведенных данных. Код awkпросто вставляет два первых поля в шаблон формата printf. Если доступно третье поле, часть ОС выводится в той же строке. Затем строка завершается символом новой строки.

2
27.01.2020, 22:02

Привет с Миллером http://johnkerl.org/miller/doc, начиная с этого входного файла

1|Chris|ubuntu 2|Ram

и работает

mlr --ifs "|" label ID,Name,OS input.csv

У вас будет

ID=1,Name=Chris,OS=ubuntu ID=2,Name=Ram

2
27.01.2020, 22:02

Теги

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