Вы можете использоватьperl
:
echo $(( $(printf "%(%s)T") - 5 * 60 )) | perl -lne 'print scalar localtime $_'
Или в чистом перле:
perl -le 'print scalar localtime(time()-5*60)'
Для форматирования используйтеstrftime()
:
perl -MPOSIX=strftime -le 'print strftime("%d %h %Y %H:%M:%S", localtime(time()-5*60))'
Использование любого awk в любой оболочке на каждом компьютере Unix:
$ awk '$1=="field:"{s=ORS $0; next} {print $0 s; s=""}' file
- metric: 'example.metric.1'
attributes:
- attr: 'example1'
field: 'example 1'
- attr: 'example2'
field: 'example 2'
- attr: 'example3'
field: 'example 3'
- attr: 'example4'
field: 'example 4'
- metric: 'example.metric.2'
attributes:
- attr: 'example5'
field: 'example 5'
- attr: 'example6'
field: 'example 6'
- attr: 'example7'
field: 'example 7'
- metric: 'example.metric.3'
Если у вас может не быть пробела после field:
в некоторых строках или у вас просто есть сильное желание использовать регулярное выражение по какой-либо причине, измените $1=="field:"
на $1~/^field:/
или /^[[:space:]]*field:/
, в зависимости от того, что вы предпочитаете.
Использованиеawk
:
awk '{if ($1 == "field:") {a=$0;x=0}
else if (/- attr:/) {$0 = $0 ORS a; x=1} else {x=1}}x' input
В этой команде, если field:
найдено, текущая входная запись($0
)сохраняется в переменной a
, а x устанавливается равным нулю. И если attr:
найдено, то $0
является изменением d к старому $0
, за которым следуетORS
(новая строка ), за которой следует переменная a
.
Сsed
:
sed -n '/^ *field: /{h;n;G};p' data
Если мы находим ключевое слово field
, то:
hold space
(h
)pattern space
(n
)pattern space
наhold space
(G
)(Equals для замены строки)печатать каждую строку, с которой вы сталкиваетесь:p
Мы можем использовать конструкции POSIX sed, чтобы инвертировать указанные строки.
sed '/attr:/!x;$G' file