Как удалить первый двоеточие ':' из отметки времени?

Я новичок в программировании !!

Может ли кто-нибудь помочь убрать : с первой позиции в отметке времени: :29.06.2019 23:03:17

В настоящее время я пытаюсь сделать это, используя Команды awk / cut, как показано ниже:

TDS="$(grep 'Logfile started' process.log |  awk '{print $3,$4}' | cut -d: -f2)"
echo "$TDS"


29.06.2019 23

И вывод не то, что я хотел! Я хочу напечатать его как 29.06.2019 23:03:17.

10
задан 16 July 2019 в 12:42

6 ответов

Для отключения первого символа можно также использовать cut -c:

$ echo ":29.06.2019 23:03:17" | cut -c 2-
29.06.2019 23:03:17
14
ответ дан 23 November 2019 в 04:15

Использовать

cut -d: -f2-

вместо

cut -d: -f2

получить что-либо от второго поля в конец строки:

TDS="$(grep 'Logfile started' process.log |  awk '{print $3,$4}' | cut -d: -f2-)"
echo "$TDS"
11
ответ дан 23 November 2019 в 04:15

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

Для этого легкого удаления поджала я сделал бы следующее:

zehe="Logfile started :29.06.2019 23:03:17"
echo "${zehe#*:}"

это распечатает:

29.06.2019 23:03:17

Когда я был в Вашем положении и начал изучать программирование и удар, я изучил много этого Руководства:

ABS - Усовершенствованное руководство по созданию сценариев Bash

Еще некоторые примеры и интересная информация к Вашей проблеме могут быть найдены здесь, искать 'Удаление Подстроки'.

8
ответ дан 23 November 2019 в 04:15

Вот a sed решение:

$ echo ':29.06.2019 23:03:17' | sed 's/^://'
29.06.2019 23:03:17

Что команда sed 's/^://' делает замена s символ двоеточия : с начала ^ из каждой строки с пустой строкой //.

Вот хитрое awk решение, где мы изменяющий разделителя полей на ^:, описанный выше, и вывод второе поле (каждой строки):

$ echo ':29.06.2019 23:03:17' | awk -F'^:' '{print $2}'
29.06.2019 23:03:17

Задача могла быть выполнена также с grep (объяснение), вероятно, это могло быть быстрым решением для большого объема данных:

$ echo 'Logfile started :29.06.2019 23:03:17' | grep -Po '^Logfile started :\K.*'
29.06.2019 23:03:17

Или обработайте файл непосредственно следующей командой, где ограничение ^ удален:

grep -Po 'Logfile started :\K.*' process.log

Вышеупомянутое могло быть достигнуто также sed и группы получения ()->\1:

sed -nr 's/^.*Logfile started :(.*)$/\1/p' process.log

Где выражение ^.*<something>.*$ будет соответствовать целой строке, которая содержит <something>. Команда s/old/new/ заменит этой строкой содержанием первой группы получения (выражение в скобках могло быть более конкретным). Опция -r включает расширенные регулярные выражения. Опция -n подавит нормальный вывод sed и наконец команда p распечатает соответствия.

8
ответ дан 23 November 2019 в 04:15

Так как Вы уже обрабатываете это в awk, можно также сделать все это непосредственно:

$ echo "foo bar :29.06.2019 23:03:17" |  awk '{sub(/^:/,"",$3); print $3,$4}' 
29.06.2019 23:03:17

sub общий формат команды sub(/REGEX/, REPLACEMENT, TARGET) и заменит все соответствия для регулярного выражения REGEX со строкой REPLACEMENT во входной строке TARGET. Здесь, мы заменяем первое : (^ означает "начало") от 3-го поля ($3) ни с чем.

Конечно, при выполнении этого в awk можно также сделать все в awk и делать все это в единственной операции:

$ echo "Logfile started :29.06.2019 23:03:17" | 
    awk '/Logfile started/{sub(/^:/,"",$3); print $3,$4}' 
29.06.2019 23:03:17

Или, в Вашем случае:

TDS="$(awk '/Logfile started/{sub(/^:/,"",$3); print $3,$4}' process.log)"
echo "$TDS"
6
ответ дан 23 November 2019 в 04:15

Другое решение для удара:

$ echo "Logfile started :29.06.2019 23:03:17" | xargs bash -c 'echo "${2#*:} $3"'
29.06.2019 23:03:17
  • Это использует конвейер вместо промежуточного переменного присвоения.
  • Команда xargs преобразовывает stdin (стандартный вход) к позиционным параметрам для bash команда.
  • Замена echo с tail -n1 /path/to/reportfile.txt.
0
ответ дан 23 November 2019 в 04:15

Другие вопросы по тегам:

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