How to Export a Mac's Contacts or Address Book

mac email automation cli

As part of my callerid project I use a simple CSV address book to lookup names from an inbound call. Having to maintain this manually in a spreadsheet is far too painful if I can just export from a master source from time to time and as I keep my addresses synced in my mac and phone using the Contacts app I just need a away to export them to a file. Natively the Contacts app can export as a vCard and I am sure there must be suitable parsers to read one but that would mean changing my super simple CSV address book code. What is interesting is that like a number of Apple applications it uses Sqlite as its backing store. Crack open the file, run some queries and you can retrieve contact data.

$ sqlite3 ~/Library/Application\ Support/AddressBook/Sources/AB13F8E5-5DDB-43B5-A2FB-126E53099691/AddressBook-v22.abcddb
SQLite version 3.24.0 2018-06-04 14:10:15
Enter ".help" for usage hints.
sqlite> .output address.txt  
sqlite> select replace(ZFULLNUMBER,' ','') || '=' || coalesce(ZFIRSTNAME || ',' || ZLASTNAME || ',' || ltrim(rtrim(ZLABEL,'>!$_'),'_$!<'),ZORGANIZATION||',,Main','N/A'||',,Main') from ZABCDPHONENUMBER,ZABCDRECORD where ZABCDRECORD.Z_PK = ZABCDPHONENUMBER.ZOWNER;
sqlite> .q

$ head address.txt
015********=Bar Azita,,Main
01*********=Louise,Smith,Home
079********=Mag*****,Brown,Mobile
015********=De****,******ren,Home
077********=Bill,F*******,Mobile

The path will differ for every case but the AddressBook-v22.abcddb database file will be under there somewhere. Note that the path changed when iCloud syncing was introduced.