rpm: How to list packages installed/upgraded today

If you’re using rpm-based Linux distro you may find this tip useful: if you want to list all packages installed or upgraded today (and by “today” I mean the current “today”, i.e. not hardcoded 2013/12/14, but the present time), just copy & paste the following snippet to the console window (this is ONE line!):

rpm -qa --qf '%{NAME} %{INSTALLTIME}\n' | perl -nale '($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime($F[1]);($Nsec,$Nmin,$Nhour,$Nmday,$Nmon,$Nyear,$Nwday,$Nyday,$Nisdst)=localtime(time);print $F[0] if ($year==$Nyear && $mon==$Nmon && $mday==$Nmday)'

Here is how it works: we list all packages in a format “packagename installtime”. “installtime” is in a common Unix/Linux format: it is a number of seconds after a date called “epoch”. To convert it to something more readable/useful we can use perl and its function localtime, which converts it to an array of numbers of various meaning (like elements of the date: year, month, day, etc.). localtime(time) returns, on the other hand, the same data, but for the present time. So we just compare these two sets of values and if they match – we print the package name. Easy, isn’t it? 😉

Jak usunąć ogonki z polskich znaków używając perla

Edycja (2013-08-11): dodałem info o Windows.

Edycja (2013-09-28): dodałem info o konwersji pliku w UTF8 na Windows.

Zakładam, że używamy Linuksa na terminalu obsługującym UTF8. Testowane na perlu 5.18.0.

Nasz plik (polskie znaki w UTF8):

$ cat tmp.txt
ęóąśłźżćń ĘÓĄŚŁŹŻĆŃ
ĘÓĄŚŁŹŻĆŃ ęóąśłźżćń
W Strzebrzeszynie chrząszcz brzmi w trzcinie i Strzebrzeszyn z tego słynie.
Zażółć gęślą jaźń.

Jednolinijkowiec w perlu:

$ cat tmp.txt | perl -Mutf8 -MEncode -wple '$_=decode("utf8",$_);tr/ęóąśłźżćńĘÓĄŚŁŹŻĆŃ/eoaslzzcnEOASLZZCN/'
eoaslzzcn EOASLZZCN
EOASLZZCN eoaslzzcn
W Strzebrzeszynie chrzaszcz brzmi w trzcinie i Strzebrzeszyn z tego slynie.
Zazolc gesla jazn.

W Windows (XP PL; Activestate Perl 5.8.9) wystarczy (plik tmp.txt kodowany w lokalnym standardzie CP1250):

type tmp.txt | perl -wple "tr/ęóąśłźżćńĘÓĄŚŁŹŻĆŃ/eoaslzzcnEOASLZZCN/"

Okazuje się, że polskie znaki w wierszu poleceń Windows są w którymś miejscu niejawnie konwertowane do CP1250 (mimo że normalnie na konsoli obowiązuje CP852).

Konwersja pliku zapisanego w UTF8 (Notatnik umożliwia zapis w tym kodowaniu; dodaje wtedy też BOM na początku, więc trzeba go usunąć) wymaga nieco więcej zachodu…:

type tmp.txt | perl -MEncode=decode -wple "BEGIN { $pl='ęóąśłżźćńĘÓĄŚŁŻŹĆŃ';$pl=decode('CP1250', $pl); $bom = join'',map(chr,(0xef,0xbb,0xbf))} s/^$bom//; $_=decode('UTF8', $_); eval 'tr/' . $pl . '/eoaslzzcnEOASLZZCN/'"

eval pod koniec jest niezbędne, bo operator “tr” nie obsługuje normalnie zmiennych w listach do zamiany.
Testowane z ActiveState perlem 5.10.1 na Windows 7 Starter PL SP1 oraz ActiveState perlem 5.12.4 na Windows XP PL SP3.