awk skript

Vladimir Naprstek vladimir.naprstek na rwe-ecs.cz
Pátek Prosinec 2 11:49:03 CET 2005


Dobry den,
mam problem s jednim awk skriptem. Potrebuji z ldif souboru vyzobat jen
urcite radky a zaroven prevest base64 kodovani na neco pouzitelneho.
Skript (viz nize) se ale chova divne. pokud si udelam vypis prekodovane
promenne primo na konci procedury base64decode, tak mi vrati spravnou
hodnotu. Pokud ale stejnou hodnotu vypisu tak, jak je ve skriptu
uvedeno, tak se mi na konec retezce pridaji znaky ^@ (nekdy jeden, nekdy
dva). a nejak nemohu prijit na to, kde se mi ty znaky ve vypise vzaly.
Je videt, co delam spatne?

PS tu funkci na prekodovani z base64 jesm nepsal ale nasel na inetu.

A ten skript je tady:
BEGIN {
        FS = ":"
        OFS = ""
}

cn = ""
sn = ""

/^dn/ { print $0 }
/^givenName/ {
        cn = rip($NF)
        if ( match($0, ":: ") ) {
                cn = base64decode(cn)
        }
        print cn
}
/^sn/ {
        sn = rip($NF)
        if ( match($0, ":: ") ) {
                sn = base64decode(sn)
        }
        print sn
}

function rip (record) {
        return substr(record, 2, length(record) - 1)
}

function base64decode(encoded) {
        BASE64 =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
        result = ""
        while (length(encoded) > 0) {
                # Specify byte values
                base1 = substr(encoded, 1, 1)
                base2 = substr(encoded, 2, 1)
                base3 = substr(encoded, 3, 1)
                base4 = substr(encoded, 4, 1)
                # Now find numerical position in BASE64 string
                byte1 = index(BASE64, base1) - 1
                if (byte1 < 0) byte1 = 0
                byte2 = index(BASE64, base2) - 1
                if (byte2 < 0) byte2 = 0
                byte3 = index(BASE64, base3) - 1
                if (byte3 < 0) byte3 = 0
                byte4 = index(BASE64, base4) - 1
                if (byte4 < 0) byte4 = 0
                # Reconstruct ASCII string
                result = result sprintf( "%c", lshift(and(byte1, 63), 2)
+ rshift(and(byte2, 48), 4) )
                result = result sprintf( "%c", lshift(and(byte2, 15), 4)
+ rshift(and(byte3, 60), 2) )
                result = result sprintf( "%c", lshift(and(byte3, 3), 6)
+ byte4 )
                # Decrease incoming string with 4
                encoded = substr(encoded, 5)
        }
        return result
}



-- 
Vladimír Náprstek



Další informace o konferenci Linux