Nano Hash - криптовалюты, майнинг, программирование

Заменить подстроку в выводе команды bash возвращаемым значением другой команды (например, превратить отметку времени в дату)

У меня есть команда, которая выводит временную метку Unix, за которой следует некоторый текст:

> mycommand
1484169138 happened XYZ
1484169139 happened XZY
...

Я хочу превратить временные метки в удобочитаемые строки, но, похоже, не могу понять, как это сделать.

Я пробовал различные инструменты (например, sed и awk). Следующий ответ на stackoverflow кажется довольно близким; но я на FreeBSD, у которой, похоже, нет расширения GNU для использования e:

$ mycommand |sed -E 's#([0-9]{10})#date -r \1#e'
sed: 1: "s#([0-9]{10})#date -r \1#e": bad flag in substitute command: 'e'
19.01.2017

  • Кроме того, вы, кажется, используете date -r XX, но -r, похоже, не делает то, что вы ищете. Какую именно команду date вы хотите запустить? 19.01.2017

Ответы:


1

Вы можете переформатировать даты, используя команду date в цикле while в вашей оболочке POSIX (которая, я должен отметить, вероятно, не является вашей оболочкой по умолчанию в FreeBSD).

$ while read d t; do printf "[%s] %s\n" "$(date -r "$d" '+%F %T')" "$t"; done < x.txt
[2017-01-11 16:12:18] happened XYZ
[2017-01-11 16:12:19] happened XZY

Цикл while также может быть концом трубы:

$ mycommand | while read d t; do ...; done
19.01.2017
  • Вы уверены, что можно установить для IFS значение null? Я сделал быстрый тест, и мне пришлось установить пробел для чтения, чтобы отделить первое поле от остальной части строки в двух переменных. 19.01.2017
  • Обратите внимание, что это, по-видимому, основано на поведении чтения, о котором я не знал раньше (и выведенном путем тестирования), что если полей больше, чем переменных, последняя переменная будет загружена со всей оставшейся частью читаемой строки. из. 19.01.2017
  • @fedorqui, я отменил твою правку. IFS= разрывает разделение строки, так что все переходит в $d, и, поскольку мы не знаем, генерирует ли mycommand OP многострочный вывод с обратной косой чертой, мы не знаем, подходит ли -r. Пожалуйста, подтвердите намерение и проверьте влияние, прежде чем вносить существенные изменения, подобные этому. 19.01.2017
  • Разве это не должно быть date -d@, а не date -r? Я получаю эту ошибку: date: 1484169138: No such file or directory [] happened XYZ date: 1484169139: No such file or directory [] happened XZY 19.01.2017
  • гхоти: хорошо, извините, если мое редактирование вызвало неудобства. Однако это странно, особенно с примером файла, который вы показываете. Напоминаю, что я использовал метод, описанный в Как прочитать строку файла (потока данных, переменной) -построчно (и/или по полю)?, который считается каноническим. 20.01.2017
  • Редактировать: мне пришлось включить свой компьютер, потому что я продолжал думать об этом, стирая пожелания: D Да, вы правы, IFS= полностью его ломает, и подход, которому я следовал, заключается в том, чтобы прочитать всю строку в переменную. Извиняюсь! 20.01.2017
  • @codeforester - ваше редактирование моего ответа нарушает его функциональность в FreeBSD, в которой нет параметра -d для команды date. Пожалуйста, рассмотрите теги и остальную часть содержимого, прежде чем вносить подобные изменения - вы внесли существенное изменение в код в моем ответе, который превратил его в неправильный ответ. 20.01.2017
  • (хорошо, если быть педантичным, FreeBSD date действительно имеет параметр -d, но он делает что-то совершенно другая.) 20.01.2017
  • Прости @ghoti. Точка отмечена. 20.01.2017

  • 2

    BSD sed не поддерживает специфичную для GNU-sed опцию /e, которая позволяет использовать команду оболочки для предоставления строки замены в вызове функции s, как вы обнаружили.

    Однако awk может предоставлять аналогичную функциональность:

    $ awk '{ ("date -r " $1) | getline $1 } 1' <<'EOF'
    1484169138 happened XYZ
    1484169139 happened XZY
    EOF
    Wed Jan 11 16:12:18 EST 2017 happened XYZ
    Wed Jan 11 16:12:19 EST 2017 happened XZY
    
    • ("date -r " $1) создает команду оболочки из 1-го поля, содержащего время эпохи Unix в секундах, например, date -r 1484169138, что в системе с локалью en-US в восточном часовом поясе дает Wed Jan 11 16:12:18 EST 2017 (обратите внимание, что GNU date's -r вообще имеет другую семантику).

    • ... | getline $1 выполняет команду оболочки (через sh -c) и фиксирует вывод команды на стандартный вывод в переменной $1; т. е. заменяет первое поле выводом команды.

    • 1 — это обычное сокращение для простой печати имеющейся (модифицированной) записи.

    20.01.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..