Czy w systemie Solaris UNIX jest jakieś narzędzie (więc żadne narzędzie GNU nie jest dostępne) do odejmowania dat? Wiem, że w Linuksie mamy gawk
możliwość odjęcia jednej daty od drugiej. Ale w Solarisie mamy maksimum nawk
(ulepszone awk
), które nie może wykonać obliczeń daty. Nie mogę też używać perla.
Czy jest jakiś sposób na wykonanie obliczeń daty, takich jak 20100909 - 20001010
?
AKTUALIZACJA: Czy jest w bc
stanie wykonać obliczenia dat?
Odpowiedzi:
Oto skrypt awk, który właśnie napisałem, powinien współpracować z awk POSIX. Musisz wypróbować wersję Solaris; pamiętajcie, że istnieją również dwie wersje Awk na Solarisie, jedna w / bin i jedna w / usr / xpg4 / bin / awk (która, jak sądzę, jest nawk).
Przekaż ciąg daty YYYYmmdd, a zostanie on przekonwertowany na liczbę sekund od Epoki (z odrobiną dawania za to, że jest na granicy dnia). Następnie będziesz mógł odjąć dwa.
źródło
Niestety, żadne z narzędzi wiersza poleceń POSIX nie zapewnia arytmetyki dat.
date -d
idate +%s
są dobrą drogą, jeśli je masz, ale są to rozszerzenia GNU.Istnieje niezręczny hack z
touch
tego rodzaju pracami, aby sprawdzić, czy data to co najmniej n dni w przeszłości:(Pamiętaj, że ten kod może być wyłączony o jeden, jeśli DST uruchomi się lub zatrzyma w tym przedziale, a skrypt uruchomi się przed 1 rano).
Kilka osób zakończyło wdrażanie bibliotek manipulacji datami w powłoce Bourne lub POSIX. Istnieje kilka przykładów i linków w FAQ comp.unix.shell .
Instalowanie narzędzi GNU może być sposobem na najmniejszy ból.
źródło
Spróbowałbym użyć
date
polecenia, które jest częścią POSIX, więc jest prawie wszędzie. AKTUALIZACJA: Niestety wydaje się, że -d nie jest częścią daty POSIX i prawdopodobnie nie ma jej w Solarisie. Zatem prawdopodobnie nie będzie to odpowiadało na pytanie PO.Teraz
d1
id2
są liczbami całkowitymi, które odpowiadają sekund od początku epoki Uniksa. Tak więc, aby uzyskać różnicę między nimi, odejmujemy ($((d1-d2))
bash) i ukryjemy do dowolnych jednostek, które chcemy. Dni są najłatwiejsze:Jak wykonać konwersję prawdopodobnie będzie inaczej, jeśli nie masz bash. Najbardziej przenośnym sposobem może być użycie
expr
( strona man posix expr ).źródło
Dla przypomnienia , dateutils to moja próba dostarczenia zestawu przenośnych narzędzi, które obejmują arytmetykę dat. Twój przykład sprowadza się do
-i
Określa format wejściowy.źródło
Perl prawdopodobnie zostanie zainstalowany i łatwo jest pobrać moduły z CPAN , zainstalować je w katalogu domowym i odwołać się do nich w programie. W takim przypadku moduł Date :: Calc ma
Delta_Days
podprogram, który pomoże.źródło
Data publikacji GNU w systemie Solaris:
Mówię to jeszcze raz:
Zbyt wielu SysAdminów Solaris z dumą nie instaluje oficjalnych pakietów firmy Sun (obecnie Oracle), które sprawiają, że system Solaris jest „kompatybilny z GNU” podczas konfigurowania nowego hosta. Bije mnie dlaczego.
Data GNU jest doskonała i powinna być domyślnie dostępna na każdym hoście systemu Solaris, IMHO.
W systemie Solaris 10
Zainstaluj pakiet SFWcoreu z dysku CD Solaris Companion. Po instalacji znajdziesz datę GNU w
/opt/sfw/bin/date
W systemie Solaris 11
Być może już go masz, ponieważ uważam, że jest to część standardowej instalacji. Jest on jednak wywoływany
gdate
w celu odróżnienia go od wersji daty Sun.Zrób to, jeśli nie jest zainstalowany:
źródło
/usr/bin/gdate
i drugie,/usr/gnu/bin/date
więc możesz użyć go według nazwy lub ustawienia $ PATH.Jeśli masz Python:
Oznacziłeś swoje pytanie „gawk”, ale mówisz „bez narzędzi GNU”. Gawk ma arytmetykę daty.
źródło
pyton:
źródło
1. Zdefiniuj datę 1 i
%j
datę 2 w formacie dnia roku (001..366)2. Oblicz różnicę za pomocą
expr
3. Tak więc odpowiedź wynosi 32 dni
... lub rozwiązanie One-liner
lub
lub
źródło
Z datą BSD dla macOS:
źródło
Możesz użyć biblioteki awk Velor, aby zwrócić różnicę w kilka sekund:
Lub dni:
źródło