About two years ago my neighbor asked me a question – “How do you manage contacts on your devices?” – and that was my ‘a-ha’ moment in that topic – I do not. I do not at all. He had a problem of having an iPhone with iTunes and Android phone and wanted to manage contacts between them in one single sensible place. Finally he settled on some closed source freeware software which run on Windows. But that was not the answer – that was just the beginning – how to manage contacts the UNIX open source way?

I have tried to search for some open source software that is capable of doing that efficiently and without too much effort and PITA … and I failed miserably.

So as usual I came with my set of scripts that will do the job and after several years of using this ‘system’ I am quite satisfied with the results and PITA reduced to minimum.

Export from Phone

The VCF file (also called VCARD) exported from a mobile Android based phone looks like below.

% cat export.vcf BEGIN:VCARD VERSION:2.1 N:pierre;herbert;hugues;; FN:herbert pierre hugues TEL;PREF:555123456 NOTE:executive EMAIL:pierre@gmail.com END:VCARD BEGIN:VCARD VERSION:2.1 N:(local);butcher;; FN:butcher (local) TEL;PREF:555123457 TEL;HOME:225553457 TEL;HOME:451232421 NOTE:cheap END:VCARD BEGIN:VCARD VERSION:2.1 N:(f1);martin;brundle;; FN:martin brundle (f1) TEL;PREF:555987654 TEL;HOME:451232421 X-QQ;HOME:gg:32847916 NOTE:fast END:VCARD

I have used colors to distinguish different contacts.

The most annoying field seems to be 'N' which tries to be smarter then needed – trying really hard to first put surname, then name, and then other names. The 'FN' field is a lot more useful here. The remaining fields as 'TEL' or 'EMAIL' does not try to outsmart us and work as desired. The VCARD of course starts with 'BEGIN:VCARD' and ends with 'END:VCARD' , that is obvious. In 2015 when I initially wrote those scripts the Instant Messaging was still used by me. Now several years fast forward I use it very rarely, but its still in use. I keep this Instant Messaging number/account information in the VCARD 'X-QQ' field in which I use protocol:number notation and use it for all different Instant Messaging solutions. The 'gg:' is for example for the Polish solution called Gadu-Gadu.

I do not find this VCARD format readable, nor grepable/searchable, thus I convert it into the plain text file which looks like follows and is grep(1) and awk(1) friendly (columns separated by spaces).

NAME PHONE IM MAIL NOTES ==== ===== == ==== =====

Here is how the above VCARD information looks after converting it with my script to the plain text columns.

% contacts-convert-vcf-from.sh -t export.vcf | column -t > contacts % cat contacts NAME PHONE IM MAIL NOTES ====================================== =================================================== ================ ====================================================== ===== butcher-(local) 555123457;225553457;451232421 - - cheap herbert-pierre-hugues 555123456 - pierre@gmail.com executive martin-brundle-(f1) 555987654;451232421 gg:32847916 - fast

The length of ‘=====’ underscores is defined/hardcoded in the scripts itself. Why hardcode this? For comparison purposes – more on that later. The entries are also sorted by name. I could embed/rework the script to contain also the column -t command but I did not saw the need to – but its of course possible.

Now – lets suppose you want to generate new VCARD with some of your contacts, then you could use grep(1) to filter out the unneeded entries, like that.

% grep -v butcher contacts > contacts.NOBUTCHER % contacts-convert-vcf-to.sh contacts.NOBUTCHER > import.vcf % cat import.vcf BEGIN:VCARD VERSION:2.1 FN:herbert pierre hugues TEL;PREF:555123456 EMAIL:pierre@gmail.com NOTE:executive END:VCARD BEGIN:VCARD VERSION:2.1 FN:martin brundle (f1) TEL;PREF:555987654 TEL:451232421 X-QQ:gg:32847916 NOTE:fast END:VCARD

Its obvious but the generated VCARD does not contain the 'butcher (local)' contact. You can now send this import.vcf file to your phone using email and then import these contacts as you would from any other VCARD shared with you.

Scripts

I use three scripts to convert/export/import/check that data in VCARD form.

The contacts-convert-vcf-from.sh script as the name suggests converts VCARD data (VCF file) into the plain text information. but I also implemented the CSV method which may be useful for some people – to put that data into the spreadsheet.

% contacts-convert-vcf-from.sh usage: contacts-convert-vcf-from.sh TYPE FILE TYPE: -c | --csv -p | --plain -t | --text

Here is example CSV output from the script.

% contacts-convert-vcf-from.sh -c export.vcf NAME,PHONE,IM,MAIL,NOTES butcher-(local),555123457;225553457;451232421,-,-,cheap herbert-pierre-hugues,555123456,-,pierre@gmail.com,executive martin-brundle-(f1),555987654;451232421,gg:32847916,-,fast

The contacts-convert-vcf-to.sh script converts the plain text data into the VCARD format.

% contacts-convert-vcf-to.sh usage: contacts-convert-vcf-to.sh FILE

The last contacts-check.sh script is used to find duplicated phone information within the plain text file. Many time I have found duplicated contacts with different names but with the same phone number.

% contacts-check.sh contacts | column -t butcher-(local) 555123457;225553457;451232421 - - cheap martin-brundle-(f1) 555987654;451232421 gg:32847916 - fast

All of the three are available in my GitHub scripts page – https://github.com/vermaden/scripts/ – available here.

You can of course download them using command line like that.

% wget https://raw.githubusercontent.com/vermaden/scripts/master/contacts-check.sh % wget https://raw.githubusercontent.com/vermaden/scripts/master/contacts-convert-vcf-from.sh % wget https://raw.githubusercontent.com/vermaden/scripts/master/contacts-convert-vcf-to.sh % chmod +x contacts-*

Updating Contacts

Its easy to maintain several contacts – no matter in which format – but when you grow to have about a 1000 of contacts (and I do) then you need to deal with it intelligently.

Not to mention that you can add a new contact on your phone (more often) but You can also update your local plain text contacts file.

This is where UNIX comes handy. You may use diff(1) to compare these ‘updates’ with following command.

% diff -u contacts contacts.NEW | egrep '^\-|^\+' --- contacts 2019-12-13 15:29:23.541256000 +0100 +++ contacts.NEW 2019-12-13 15:29:36.087084000 +0100 -john-doe-the-third - - jogh.doe@gmail.com - +jan-kowalski 555192384 gg:11844916 - slow

This way you know that there are two new contacts, one '-' from the local contacts file and one '+' from the plain text version generated from phone exported VCF file called contacts.NEW here.

You can also use vim(1) with its diff mode enabled by starting with -d flag as shown below.

% vim -d contacts contacts.NEW

Here is how it looks like.

… and we now get back to the amount of '====' used in the columns in the plain text file. If you keep the same amount of these each time, then diff is possible. If I would not put them there the column -t command would generate larger NAME column for example because of longer contact name – and because of additional space in the remaining contacts both diff(1) and vim(1) tools will show that all contacts are new.

This is how I manage the contacts the UNIX way, if you have more fun way of dealing with the contacts then please let me know 🙂

EOF