Переформатирование строки даты

По большей части Вы не должны устанавливать TERM вручную. Переменная всегда устанавливается автоматически, и существует только узкое стечение обстоятельств, где значение по умолчанию является неправильным.

Значение TERM потребности, на которые сошлются в terminfo базе данных системы (или для некоторых старомодная система в termcap базе данных). Terminfo и Termcap отображают терминальные типы на описание терминальных возможностей то использование приложений. Значение TERM терминальный тип.

Главная причина, почему Вы, возможно, иногда должны были бы измениться TERM то, если Вы входите в систему удаленно, когда локальная машина и удаленная машина имеют различные терминальные базы данных.

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

Примером этого является xterm с 16 цветами по сравнению с xterm с 256 цветами. Традиционный xterm поддерживает только 16 цветов, таким образом, это что xterm терминальная база данных указывает. Изменение xterm запись сделала бы пользователей более новых xterm версий счастливыми, но повредит конфигурацию пользователей более старых xterm версий, которые входят в систему удаленно. Переключение на новое имя — xterm-256color — обеспечивает более новые возможности каждый раз, когда доступно, но не распознан, если Вы входите в систему удаленно машин с более старой терминальной базой данных. Поскольку нет никакого решения, которое может удовлетворить всех, Вы получаете выбор: любая палка с xterm и не получайте 256 цветов или использование xterm-256color который не работает, если Вы входите в систему удаленных машин, которые не поддерживают его.

Отъезд значения по умолчанию xterm и установка termName ресурс к xterm-256color (который вызывает переменную среды TERM быть установленным на то же значение), таким образом оба разумный выбор. Установка TERM к произвольным значениям не работал бы, но оба xterm и xterm-256color имейте смысл.

2
09.05.2015, 01:55
3 ответа

Было бы возможно использовать SED для этого, но awk более естественно:

awk -F'"' -v OFS='"'  '$8 {cmd="date -d \""$8"\" +%FT%T%z"; cmd | getline $8; close(cmd)} 1' input.json
{"_id":"","timestamp":"2015-04-20T01:30:55-0700"}
{"_id":"","timestamp":"2015-04-20T01:32:25-0700"}
{"_id":"","timestamp":"2015-04-20T01:35:39-0700"}

Вышеуказанное шоу смещение -7: 00 часы. Это отражает часовой пояс системы системы. Изменение переменной оболочки TZ изменит по умолчанию.

Как это работает

  • -F '«-V ofs ='»

    . Это устанавливает как входные и выходные сепараторы поля .

  • $ 8 {cmd = " Дата -D \ "" $ 8 "\" +% ft% t% z "; cmd | getline $ 8; Закрыть (cmd)}

    с « в качестве сепаратора поля, дата является номером поля 8. Это создает строку с помощью правильной команды дата , а затем запускает команду, захватывая выходные данные в обновленное поле 8.

    $ 8 спереди означает, что эта часть будет только Будьте запуска, если есть непустое значение для поля 8. Это позволяет, например, пустые строки проходить через безмолярные.

  • 1

    Это криптичный стенография AWK для «печати этой линии».

обрабатывающую дополнительные двойные кавычки

, поскольку мы используем » в качестве сепаратора поля. Предположим, что есть Переменное число » до временной техники. В этом случае нам нужно обратиться к метку времени в качестве второго полевого поля, $ (NF-1) , а не восьмое поле, $ 8 . В этом случае:

awk -F'"' -v OFS='"'  '$8 {cmd="date -d \""$(NF-1)"\" +%FT%T%z"; cmd | getline $(NF-1); close(cmd)} 1' input.json

Добавление пользовательского форматирования в поле Дата

$ awk -F'"' -v OFS='"'  '$8 {cmd="date -d \""$(NF-1)"\" +%FT%T%z"; cmd | getline $(NF-1); close(cmd);$(NF-1)="{$date:" $(NF-1) "}"} 1' input.json
{"_id":"","timestamp":"{$date:2015-04-20T01:30:55-0700}"}
{"_id":"","timestamp":"{$date:2015-04-20T01:32:25-0700}"}
{"_id":"","timestamp":"{$date:2015-04-20T01:35:39-0700}"}
3
27.01.2020, 22:00

jq , узел :

cat /tmp/what \
| jq '.timestamp' \
| while read line ; do \
  node -e "console.log(new Date($line).toISOString())" ;\
  done

Может также использовать одну программу Node.js для обработки всего файла для обеспечения производительности, но это может быть слишком далеко в JS-land. (Пинг, если требуется подробная информация.)

1
27.01.2020, 22:00

Если вы можете гарантировать, что вход отформатирован в точности так, как вы показали, вы можете сделать это полностью в sed.  Это немного грубовато:

sed \
        -e 's/"timestamp":"... Jan/"timestamp":"01/' \
        -e 's/"timestamp":"... Feb/"timestamp":"02/' \
        -e 's/"timestamp":"... Mar/"timestamp":"03/' \
        -e 's/"timestamp":"... Apr/"timestamp":"04/' \
        -e 's/"timestamp":"... May/"timestamp":"05/' \
        -e 's/"timestamp":"... Jun/"timestamp":"06/' \
        -e 's/"timestamp":"... Jul/"timestamp":"07/' \
        -e 's/"timestamp":"... Aug/"timestamp":"08/' \
        -e 's/"timestamp":"... Sep/"timestamp":"09/' \
        -e 's/"timestamp":"... Oct/"timestamp":"10/' \
        -e 's/"timestamp":"... Nov/"timestamp":"11/' \
        -e 's/"timestamp":"... Dec/"timestamp":"12/' \
-e 's/"timestamp":"\(..\) \(..\) \(..:..:..\) \(.....\) \(....\)"/"timestamp":"\5-\1-\2T\3\4"/' \
        input.json > output.json

Он заменяет название месяца на его номер, а затем он вырезает (сейчас) строку с цифрами даты, и складывает кусочки обратно в нужном порядке.  Если вы хотите добавить .000 за миллисекунды, вставьте между \3 и \4.

0
27.01.2020, 22:00

Теги

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