Я новичок в программировании !!
Может ли кто-нибудь помочь убрать :
с первой позиции в отметке времени: :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
.
Для отключения первого символа можно также использовать cut -c
:
$ echo ":29.06.2019 23:03:17" | cut -c 2-
29.06.2019 23:03:17
Использовать
cut -d: -f2-
вместо
cut -d: -f2
получить что-либо от второго поля в конец строки:
TDS="$(grep 'Logfile started' process.log | awk '{print $3,$4}' | cut -d: -f2-)"
echo "$TDS"
awk
классный инструмент, и можно решить очень сложные задачи с ним. Но для Вашего вопроса я придерживался бы основных возможностей удара.
Для этого легкого удаления поджала я сделал бы следующее:
zehe="Logfile started :29.06.2019 23:03:17"
echo "${zehe#*:}"
это распечатает:
29.06.2019 23:03:17
Когда я был в Вашем положении и начал изучать программирование и удар, я изучил много этого Руководства:
ABS - Усовершенствованное руководство по созданию сценариев Bash
Еще некоторые примеры и интересная информация к Вашей проблеме могут быть найдены здесь, искать 'Удаление Подстроки'.
Вот 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
распечатает соответствия.
Так как Вы уже обрабатываете это в 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"
Другое решение для удара:
$ 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
.