Как использовать sed для выборочного удаления начальных нулей

Системный журнал является средством, которое управляет, куда, регистрируя вывод, включая материал dmesg, паника ядра, и т.д., отправляется. Существует несколько различных широко использующихся демонов системного журнала, но я полагаю, что они - все более или менее то же в целях этого обсуждения.

У демона системного журнала есть конфигурационный файл в /etc. Традиционно, это syslog.conf, но для альтернативы rsyslogd (используемый с современным .rpm основывал дистрибутивы), например, это rsyslog.conf. Не добираясь также в то, как эта конфигурация работает, несколько директив обычно там достойны рассмотрения здесь:

# Emergencies are sent to everybody logged in.
*.emerg                         *

# Log all kernel messages to the console.
kern.*                                                 /dev/console

Первый - то, почему определенные серьезные ошибки появятся на всем ttys. Однако это не включает терминалы GUI, означая, что Вы ничего не будете видеть в X.

Второй отправляет все сообщения от ядра до /dev/console*, который обычно синонимичен с /dev/tty0, который, как обычно понимают, является "текущей виртуальной консолью", хотя это все еще не будет консолью GUI.

Можно установить устройство для использования в качестве консоли с параметром начальной загрузки ядра, например, console=/dev/tty6. Можно, вероятно, получить текущее устройство с cat /sys/devices/virtual/tty/console/active.

Существует почтенное (как в, предынтернет-эра) названное приложение для GUI xconsole который отобразит сообщения, отправленные в /dev/console. Это не использует современные комплекты программ системного обеспечения, к сожалению, и если Вы хотите настроить его, необходимо использовать Xresources файл:

XConsole*text.width:          1000
XConsole*text.height:         300
XConsole*background:          #cccccc
XConsole*font:                -adobe-helvetica-medium--normal-*-14-*-*-*-*-*-iso8859-1

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

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

Вы могли также указать FIFO или сокет в syslog.conf и реализовать Ваш собственный метод получения сообщений в X.

*Debian произошел, системы также имеют a /dev/xconsole на устройство и это сошлются в их syslog.conf.

3
24.11.2014, 00:53
4 ответа

sed -r '/^..../s/:0+/:/g'

были бы в порядке? (Улучшенный ответ от Gilles, который сохраняет первым 4 символа нетронутый)

0
27.01.2020, 21:08

Рекурсивный анализ в подкаталогах

Анализ выходных данных find ненадежен. Что делать, если в нем было имя файла с новой строкой? Используйте найти... -exec... , что гарантирует надежную обработку.

find . -type f -exec sh -c '…' {} \;

Фрагмент оболочки ... получает имя файла в $0 . Обратите внимание, что это отдельный процесс оболочки, он не наследует переменные или функции от родительского сценария. Можно ускорить обработку с помощью одного подпроцесса оболочки для обработки нескольких файлов.

find . -type f -exec sh -c 'for x; do … done' _ {} +

На этот раз в цикле имя файла находится в переменной x .

Разбиение имени файла

Вызов внешних утилит, таких как sed , cut и т.д., является хрупким: необходимо быть предельно осторожным, чтобы избежать искажения некоторых имен файлов. Вам это не нужно: встроенных функций обработки последовательностей оболочки достаточно для того, что вы хотите сделать здесь. Задано имя файла $ x :

directory=${x%/*}
basename=${x##*/}
extension=…
if [ -n "$extension" ]; then
  mkdir -p "$directory/extension"
  mv "$x" "$directory/extension"
fi

Расширение

Какое расширение файла? Это часть после одной из . в названиях. Нет стандарта, который говорит, какой. Вы должны решить, что вы считаете внутренним номером в таких случаях, как foo.tar.gz или bar-1.2 .

Вот пример кода, который рассматривает общие расширения сжатия для вложенности и требует, чтобы расширения содержали букву, так что foo-1.2.tar.gz считается имеющим расширение tar.gz .

extension=
while case "${basename##*.}" in
        gz|bz2|xz) extension=.${basename##*.}$extension;; # stackable extension
        *) false;;
do
  basename=${basename%.*}
done
case "${basename##*.}" in
  "$basename") :;; # no . ==> no extension
  *[!0-9A-Za-z]*) :;; # only allow alphanumeric characters
  *[A-Za-z]*) extension=${basename##*.}$extension;; # non-stackable extension
  *) false;; # require at least one letter
esac
extension=${extension#.}
-121--128957-

Изменение urxvt на urxvt256c исправило это!

-121--251290-

Таким образом, требуется удалить прогоны 0 , но только тогда, когда им предшествует двоеточие.

sed -e 's/:00*/:/g'
8
27.01.2020, 21:08

Аналогичный подход с помощью awk:

awk '{gsub(/:0*/,":")}1' file
2001:db8:3cd:::ef45:6:123
3
27.01.2020, 21:08

, Если вы все еще интересуетесь тем, как удалить любой нуль кроме---в первых 4 цифрах, можно просто сделать как:

sed 'H;g;s/\(\n\([^:]*\)\)*0*/\2/g
' <<\IN
2001:0db8:03cd:0000:0000:ef0405:00060:0123
IN

ПРОИЗВОДИТ

2001:db8:3cd:::ef45:6:123

хорошо, таким образом, это глобально соответствует или нулю или большему количеству последовательностей новой строки, сопровождаемой нулем или больше не символы двоеточия или нуль, или больше обнуляет. Первая последовательность разделяется на две подгруппы - та, которая включает \newline и тот, который не делает. Тот, который делает, \1 - но подгруппа, которая не делает - и которая заменяет его - \2 . Так дополнительное символ \newline отбрасывается. И любой обнуляет подобранный, которые не находятся в той последовательности, не сохранены вообще - и таким образом, они также удалены.

новая строка только получена во-первых с старый H - который добавляет строку для содержания пространства после символ \newline (который всегда запускается пустой) - и затем g и - который gets h располагает с интервалами старое пространство путем перезаписи образца.

3
27.01.2020, 21:08

Теги

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