/ / Bash skript / príkaz na vytlačenie dátumu 5 minút pred / po - bash

Bash skript / príkaz na vytlačenie dátumu 5 minút pred / po - bash

Potrebujem nejako použiť príkaz date v bash alebo iný nástroj na vytlačenie dátumu a času, 5 minút pred a 5 minút po danej hodnote. Napríklad:

vstup:

Thu Dec 19 14:10

výkon:

Thu Dec 19 14:05 Thu Dec 19 14:10 Thu Dec 19 14:15

Vidím, že date príkaz sa dá použiť na vykonanie aktuálneho dátumu / času, môže sa použiť s odovzdanou hodnotou, t. j. nie aktuálnym dátumom / časom?

odpovede:

13 pre odpoveď č. 1

Môžete to dosiahnuť aktuálnym časom zadaním.

$ date --date="5 minutes ago"; date; date --date="5 minutes"
Qui Dez 19 16:09:17 BRST 2013
Qui Dez 19 16:14:17 BRST 2013
Qui Dez 19 16:19:17 BRST 2013

Použiť konkrétny dátum (ex 1978/01/10).

$ date --date="1978-01-10 + 5 minutes"
Ter Jan 10 00:05:00 BRT 1978

6 pre odpoveď č. 2

S GNU date, s argumentom pre. môžete urobiť jednoduchú formu aritmetiky dátumu a času --date option:

$ date --date "now + 5 minutes"

S BSD date (aspoň verzia dodávaná so systémom Mac OS X), -v možnosť umožňuje robiť niečo podobné, ale iba s aktuálnym časom:

$ date -v +5M
$ date -v -5M

V opačnom prípade musíte matematiku vykonať explicitne po prevode času na časovú pečiatku systému UNIX (sekundy od 1. januára 1970):

$ date -r $(( $(date +%s) + 300 ))   # 5 minutes (300 seconds) from now
$ date -r $(( $(date +%s) - 300 ))   # 5 minutes ago

3 pre odpoveď № 3

Ak používate bash pod Linuxom, môžete použiť -d parameter na vykonanie manipulácie s dátumom na existujúce dátum:

  1. Získajte čas EPOCH pre príslušný dátum:

    EPOCH=$(date -d "Thu Dec 19 14:10" "+%s")
    

    To vám dá čas, v sekundách, od EPOCH (zvyčajne 01.01.1970)

  2. Teraz môžete pomocou jednoduchej matematiky odpočítať alebo pridať k času EPOCH 5 minút (v sekundách)

    NEW_EPOCH=$(($EPOCH - 300))
    

    očividne existuje 300 sekúnd za 5 minút

  3. Teraz skonvertujte tento NEW_EPOCH späť na ľudsky čitateľný dátum

    NEW_DATE=$(date -d "1970-01-01 ${NEW_EPOCH} sec")
    

POZNÁMKA: toto funguje iba na unixových systémoch, ktoré podporujú voľbu date -d (t. J. Linux)


0 pre odpoveď č. 4

Ak to chcete urobiť pre aktuálny čas +/- 5 minút a používate program Bash 4.2 alebo novší, môžete tak urobiť bez externých nástrojov:

$ printf -v now "%(%s)T"
$ echo "$now"
1516161094
$ f="%a %b %d %R"
$ printf "%($f)T %($f)T %($f)Tn" "$((now-300))" "$now" "$((now+300))"
Tue Jan 16 22:46 Tue Jan 16 22:51 Tue Jan 16 22:56

Na %(datefmt)T formátovací reťazec printf umožňuje tlačiť reťazce dátum-čas. Ak je argument vynechaný (napríklad tu) alebo je -1, použije sa aktuálny čas.

%s - formátuje čas v sekundách od epochy a - -v now uloží výstup do now namiesto tlače.

f je iba výhodná premenná, takže nemusím trikrát opakovať formátovací reťazec pre výstup.

Od argumentu pre toto použitie printf musí byť v epizóde od epochy, ste zaseknutí s externými nástrojmi na prevod vstupného reťazca ako Thu Dec 19 14:10 do tohto formátu a vy by ste ich nahradili

printf -v now "%(%s)T"

napríklad s ktorýmkoľvek z

now=$(date "+%s" -d "Thu Dec 19 14:10")                   # GNU date
now=$(date -j -f "%a %b %d %T" "Thu Dec 19 14:10" "+%s")  # macOS date