Memo: dátum | idő regexp

Emlékeztetőül magamnak

óó:pp formátumú idő kinyerés:

echo "14:45" | awk '/(((0[0-9])|(1[0-9])|(2[0-3])):[0-5][0-9])/ { print "Matched time: " $0 }'

hh/nn/éééé formátumú dátum kinyerése:

echo "02/09/2010" | awk '/((0[1-9])|(1[0-2]))\/((0[1-9])|([1-2][0-9])|(3[0-1]))\/(([1-9][0-9]))/ { print "Matched date: " $0 }'

Hozzászólások

{1} -ek feleslegesek.

Amit nem lehet megirni assemblyben, azt nem lehet megirni.

Atyaég.
__________________________________
2e845cb4c3a5b5bd6508455b1739a8a2

hát..

inkább "man date"
-formátumnak olyat adsz meg amit akarsz, kényelmes, szép, hibamentes
-bemeneti dátumot is lehet megadni nem csak az aktuálisat

Ömm, értem én, de hogy tudom megoldani date-tel, hogy egy logból kinyerjem azokat a sorokat, amik dátummal kezdődnek (a fenti nem a sor elejére illeszt, ez igaz; illetve vannak sorok, amik nem dátummal kezdődnek és nem érdekelnek)?

--
A gyors gondolat többet ér, mint a gyors mozdulat.

Ezek csak sima matchelések, de pont ilyenekre találták ki a perlt. Természetesen a lentieknek még elég sok variációja lehetséges, ezért is (nem-) szeretjük ezt a nyelvet :)

Időre

Röviden:


echo "12:34" |\
 perl -ne ' print "Matched time: $_" 
 if ( /\d{1,2}:\d{2}/ ) '

Pontosabb:


echo "12:34" |\
 perl -ne ' print "Matched time: $_" 
 if ( /[0-2]?\d:\d{2}/ ) '

Dátumra:

Röviden:


echo "02/09/2010" |\
 perl -ne ' print "Matched date: $_"
 if ( /\d{2}\/\d{2}\/\d{4}/ ) '

Pontosabban:

 
echo "02/09/2010" |\
 perl -ne ' print "Matched date: $_"
 if ( /[0-3]\d\/[0-1]\d\/[1-2]\d{3}/ ) '

Természetesen a mintaillesztést könnyen át lehet fordítani hibajelzésbe, a második példánál maradva:


echo "12:34" |\
 perl -ne ' print "Invalid time: $_" 
 unless ( /[0-2]?\d:\d{2}/ ) '

Persze fontos ismerni a várható értékeket. Szerintem barátibb a használata, mint az awk. Elég jól lehet ezt is pipe-olni, vagy sima shell script-be beilleszteni ilyen dolgokat.

__________________________________
2e845cb4c3a5b5bd6508455b1739a8a2

Ilyen mintaillesztéseket elég jól meg lehet benne írni, aztán bele lehet tolni shell scriptbe is, mondjuk így.


test=$( echo $value | perl -ne ' print 0 if (/valami minta/) ' )
[[ $test != 0 ]] && echo OK || echo NEMOK

Nyilván indokolt esetben, bonyolult mintánál érdemes használni. Meg legyen aki debugolja. Itt linkelek egy hasonló szépséget.

Nem vagyok ezekre túlzottan büszke, de sok olyan helyen beválik, ahol a teljes szkriptet egyszerűbb shellben megírni, viszont néha kell egy-egy bonyolultabb ellenőrzés, vagy olyan részlet amit egyszerűbb perlben megírni. A fenti linken látható részletet megírtam shellben is, de nem adott elég véletlenszerű eredményt. Se több, se kevesebb nem lett a kód mennyisége, viszont valahogy a véletlenszám generálás jobban ment a perlnek, nem mellesleg gyorsabban is.

__________________________________
2e845cb4c3a5b5bd6508455b1739a8a2

Ha mindenképpen ragaszkodsz az awk-hoz:
FS=":" -> $1 = óra, $2 = perc

echo "14:45" | awk -F: '($1>=0)&&($1<24)&&($2>=0)&&($2<60){printf "%s:%s\n",$1,$2}'

Hasonló módon mehet a dátum is. De a dátum érvényességének ellenőrzése nem egy egysoros szkript szintje.

-----
Dropbox tárhely igénylése: https://www.getdropbox.com/referrals/NTI2MzM2MjA5

Nagyon köszönöm a segítséget! :) A dátum érvényességének ellenőrzéséhez a következőt használom (lehet, hogy hülyének tűnök miatta, de nekem nagyon tetszik :) [A user parancssorban adja át a dátumot éééé-hh-nn formában egy ksh "wrapper" szkriptnek; még sokminden mást csinálok, szóval csak kiragadott példa, de a saját kontextusában eddig jól működött]


check_date ()
{
    INDATE=$1

    LEN=$(expr length "$INDATE")
    if [ $LEN -ne 10 ]; then
        usage_notes
        echo "Error> $INDATE is in an incorrect format. Required: YYYY-mm-dd"
        exit 1
    fi

    MM=$(expr substr "$INDATE" 6 2)
    DD=$(expr substr "$INDATE" 9 2)
    YYYY=$(expr substr "$INDATE" 1 4)
    D=`echo $DD|sed s/^0//`

    cal $MM $YYYY|tail +3|grep $D > /dev/null

    if [ ${?} -ne 0 ]; then
        usage_notes
        echo "Error> $INDATE is an invalid date."
        exit 1
    fi
}

--
A gyors gondolat többet ér, mint a gyors mozdulat.

echo "12:34" | awk '/[0-2][0-9]:[0-5][0-9](:[0-5][0-9])?/ { print "Matched time: " $0 }'
echo "02/09/2010" | awk '/[0-3][0-9]\/[0-3][0-9]\/[1-9][0-9][0-9][0-9]/ { print "Matched date: " $0 }'

Sajna az en awk-m nem kezeli a {} kozotti dolgokat, igy az ev egy kicsit csunya lett.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.