Here you are. The result of the following command is a list of comma separated values. First column: path to the .desktop entry, second column: path to the icon, third column: the executable.
find /usr/share/applications/ -name '*.desktop' -exec perl -ne 'BEGIN { $pname = $ARGV[0] ; } ; /(Icon|Exec)=(.*)/ and $ret{$1} = $2 ; END { printf "%s,%s,%s\n", $pname, $ret{Icon}, $ret{Exec} ; }' {} \;
Explanation: find prepares a list of files that end with .desktop and are found in /usr/share/applications or a subdirectory thereof, and calls (-exec ... {} \;) a perl oneliner to parse the information.
Perl is started with the -n option which creates an implicit loop iterating over each line of the given file, and an -e option which specifies to run the argument provided.
The perl program contains BEGIN and END blocks to be run before and after each of the .desktop files is parsed (the perl oneliner is called separately each time for each of the files that find has located). BEGIN block records the filename (which is given as the first argument to the oneliner, the {} pragma of find), and the END blocks summarizes the information in a comma separated manner.