/Cw3

Z Brain-wiki

TI:WTBD/Ćwiczenia 3

Tu sporo czasu nam zeszło na przypomnieniu, na czym polega obróbka linii poleceń przez powłokę, rozwijanie wzorców nazw plików itd.

Po czym przeszliśmy do przykładu związanego z analizą danych w postaci tekstu delimitowanego (rekordy z separatorem pól):

#! /usr/bin/python
# coding: utf-8
# luser.py
import nis
from sys import stdout, stderr, argv

def main(args):
    passwd_map = nis.cat('passwd')
    found = list()
    for who in args:
        if who in passwd_map: # dokładne dopasowania loginu wypisujemy najpierw
            found.append(passwd_map[who].split(':'))
            del passwd_map[who] # po to aby każdego pasującego wypisać raz
    for who in args:
        who = who.lower()
        for rec in passwd_map.values():
            rec = rec.split(':')
            if (who in rec[0] # pasuje do loginu
                    or who in rec[4].lower() # pasuje do gecos
            ):
                found.append(rec)
                del passwd_map[rec[0]]
    for rec in found:
        output(rec)
    if not found:
        stdout.write(u'*** Nie znaleziono pasujących rekordów.\n'.encode('utf-8'))

def output(rec):
    stdout.write(
        (u"%-10s%-35s%8s\n" % (rec[0], rec[4][:34], rec[5].split('/')[2]))
        .encode('utf-8')
    )
    # stdout.flush() # hmm..
    
if __name__ == '__main__':
    try:
        nis.get_default_domain()
    except nis.error:
            stderr.write(
                u'Ten system nie korzysta z NIS, albo domena niedostępna.\n'
                .encode('utf-8')
            )
            exit(2)
    prog, args = argv[0], argv[1:]
    if not args:
        stderr.write(
            'Użycie: {0} str1 [ str2 .. ]\n'
            .format(__file__)
        )
        exit(1)
    main(args)