Para empezar, su marca de tiempo está en segundos desde el 1 de enero de 1970 00 :00 :00 UTC es mi suposición, si no es así, conviértalo a eso.
Entonces, tienes que restar los segundos para los días que quieras.
stamp=1525192000
day=$((60*60*24))
echo $(($stamp - 30*$day))
Luego obtiene un tiempo de época de Unix, si eso necesita conversión a la fecha y la hora del día, es posible que deba tener en cuenta el horario de verano, y ahí es donde es posible que deba usar la utilidad date
.
Tenga en cuenta que también puede usar date
. Esto le permite trabajar fácilmente con otros elementos de fecha, sin necesidad de cálculo:
Con GNUdate
:
date --date="$(date --iso-8601=s -d @1525192000) -30 days" +%s
Ejemplo:
$ date --date="$(date --iso-8601=s -d @1525192000)"
Tue, May 1, 2018 7:06:01 PM
$ date --date="$(date --iso-8601=s -d @1525192000) -30 days"
Wed, Apr 1, 2018 7:06:01 PM
$ date --date="$(date --iso-8601=s -d @1525192000) -30 days" +%s
1523466380
$ date --date="$(date --iso-8601=s -d @1525192000) -30 days -1 week -3 months" +%s
1514309200
En FreeBSD y macOS (el -j
significa no intentar configurar la fecha del sistema, agradable y seguro)
date -j -f "%a %b %d %T %Z %Y" "$(date -r 1234567890)" -v-30d "+%s"
EDITAR :Gracias, Kusalananda, OpenBSD y NetBSD no son compatibles -v
.
Один -вкладыш:
awk '{ if ( NF > 0 && $1 !~ /^\/\// ) { bl=0; for (i=1;i<=NF;i++) printf "%s ", $i; }; if ( NF == 0 && bl == 1 ) {printf "\n" }; if ( NF == 0 && bl == 0 ) {bl=1; printf "\n\n" } } END { if ( bl == 0 ) { printf "\n" } } ' /tmp/my_file
Пояснение:
if ( NF > 0 && $1 !~ /^\/\// ) { bl=0; for (i=1;i<=NF;i++) printf "%s ", $i; }
если количество полей больше 0 и первое поле не является комментарием, для каждого поля выведите поле и пробел. На самом деле регулярное выражение "^//" (начинается с "//" ), однако "/" необходимо экранировать, поэтому "\/". Также bl=0 устанавливает флаг предыдущей пустой строки, который мы будем использовать для управления концом записи/дескриптором пустой строки позже в операторе.
Затем обработайте пустые строки/конец записей;
Во-первых, проверьте, не является ли это пустой строкой.
if ( NF == 0 && bl == 1 ) {printf "\n" };
Если количество полей равно 0 и установлен флаг предыдущей пустой строки, просто напечатайте одну новую строку.
Затем проверьте, закончилась ли строка данных/текста и нужно ли добавить строку
if ( NF == 0 && bl == 0 ) {bl=1; printf "\n\n" }
Если количество полей равно 0 и флаг предыдущей пустой строки не установлен, установите флаг пустой строки и распечатайте окончания строк.
Наконец-то!!!
END { if ( bl == 0 ) { printf "\n" } }
если мы закончили файл, посмотреть, было ли напечатано окончание строки записи, если нет, то сделать это.
Предполагая, что каждый блок (каждой подпрограммы «проверить ()» )начинается со строки, начинающейся с verify
и заканчивается строкой, начинающейся с }
(и что ни одна строка внутри подпрограммы не начинается с }
), и что пробел — это все пробелы :
printf '%s\n' 'g|^ *//|d' 'g/^verify/.,/^}/j' x | ex -- /tmp/my_file
Отредактируйте файл с помощьюex
(команды -строчной версии vi
/ vim
).
g|^ *//|d
ищет все строки, соответствующие регулярному выражению ^ *//
(т. е. содержать //
с предшествующим нулем или более пробелами, но ничего другого )и удаляет их. g/^verify/.,/^}/j
находит все строки, соответствующие регулярному выражению^verify
(т. е. начинается с verify
). Затем для каждого, найти первую следующую строку, соответствующую регулярному выражению ^}
(т. е. начинается с }
), и j обозначает все строки между verify
и }
, включительно, отбрасывая лишние пробелы до и после новые строки, которые выдавливаются. x
сохраняет и выходит.sed -n '/^verify/ { h; d }; /^ *\/\//d; /./H; /^}/ { g; s/ *\n */ /gp }; /^$/p' /tmp/my_file
-n
— не печатать, кроме как по указанию. /^verify/ { h; d }
— когда вы видите строку, начинающуюся с verify
, скопируйте его в h старое пространство и d удалите пространство шаблона (т. е. перейти к следующей строке ввода без дальнейшей обработки ). /^ *\/\//d
— когда вы видите строку который начинается с нуля или более пробелов и //
, удалите его (т. е. перейти к следующей строке ввода без дальнейшей обработки ). /./H
— для любой не-пустой строки, отличной от указанной выше, добавить его в пространство удержания. /^}/ { g; s/ *\n */ /gp }
— когда вы видите строку, начинающуюся с }
, g вставьте пространство удержания в пространство шаблона. Затем сожмите его до одной строки путем замены каждой встроенной новой строки (вместе с предшествующим и последующим пробелами )с одним пробелом и распечатайте его. /^$/p
— печатать пустые строки. awk '
/^ *\/\// { next; }
/./ { buffer = buffer " " $0; }
/^}/ { sub(/^ */, "", buffer); sub(/ *$/, "", buffer);
gsub(/ * /, " ", buffer); print buffer; buffer = ""; }
/^$/ { print; }
' /tmp/my_file
buffer
. Новые строки неявно отбрасываются. }
, удалите все лишнее пространство из buffer
, распечатайте его и очистите.