Filtrowanie danych wyjściowych komendy „dscl -readall”

0
dscl . -readall /Users 

wypisuje coś takiego (tylko część całego wyniku):

PrimaryGroupID: 20
RealName:
Johnny Smith
RecordName: johnny
RecordType: dsRecTypeStandard:Users
UniqueID: 501
UserShell: /bin/bash

Mam to polecenie:

dscl . -readall /Users UniqueID | awk '/^RecordName:/ {name=$2}; /^UniqueID: / {if ($2 > 500) print name}'

Zasadniczo wyprowadza wszystkie RecordName z UniqueID wyższym niż 500.

Chcę również wydrukować RealName, UserShell, RecordType, PrimaryGroupID i ewentualnie inną kategorię, jeśli UniqueID jest większy niż 500, ale mam pewne trudności ze składnią awk.

Jak miałbym to zrobić?

Niektóre próbki wyjściowe:

<primarygroupid>20</primarygroupid> 
<realname>Johnny Smith</realname>
...
<uniqueid>501</uniqueid> 

Format, do którego mogę szybko uzyskać dostęp w celu odczytu i umieszczenia w zmiennej dla programu.

Jan
źródło
Czy koniecznie musisz użyć awk? OS X oferuje o wiele więcej narzędzi, które można wykorzystać.
slhck,
Używam tego w skrypcie celu-c używając sh -c. jeśli masz jakieś inne sugestie, jestem otwarty na ich wypróbowanie.
John

Odpowiedzi:

0

Niestety nie mam absolutnie żadnego doświadczenia OSXani dsclużyteczności. Mam jednak pewne awkdoświadczenie. Przeczytałem też szybko dscl stronę podręcznika użytkownika, patrząc na readallopcję:

Displays all the records of a given type. The output of readall is formatted in
the same way as read with a "-" on a line as a delimeter between records.

Możesz zmienić sposób awktraktowania rekordów. Spowoduje to wydrukowanie rekordów, w których UniqueID jest większy lub równy 500:

awk -v RS="-" '{ for (i=1; i<=NF; i++) if ($i ~ /UniqueID:/ && $(i+1) >= 500) print $0 }'

Czy masz oczekiwany format wyjściowy?

Steve
źródło
To świetnie, tylko dwa pytania. Czy istnieje więcej informacji dotyczących każdego rekordu, który nie jest zawarty w kodzie, jeśli identyfikator UID> = 500? Wezmę każdą ilość informacji, jaką mogę uzyskać. Po drugie, może to być zbyt wiele, ale czy można to wydrukować w formacie XML? To byłoby idealne. W przeciwnym razie dziękuję za pomoc.
Jan
@Ali: Nie jestem całkowicie pewien, czy rozumiem twoje pierwsze pytanie. Powyższy kod wydrukuje blok, jeśli znajdzie słowo „UniqueID”, a następnie wartość większą lub równą 500. Ten blok jest rekordem i zawiera wszystkie zawarte w nim informacje (ta ilość informacji może ulec zmianie z rekordu do rekordu lub może nie: Nie znam dscldanych wyjściowych). W odniesieniu do drugiego pytania; chociaż awknie jest idealny do czytania xml, można go użyć do napisania. Proszę edytować swoje pytanie zawierać sporą ilość próbek danych i oczekiwanej produkcji.
Steve,