Well, I've been using Linux as my primary OS for close to 20 years (and I used to do Solaris and IRIX before that), so I'm a bit of an old hand, and I write and maintain Linux software for a living. Feel free to send me a PM if you like and I'll do what I can to help.
As for wildcards, all you need to do is remember that they're patterns. The ? is the basic wildcard, and it operates just like a wildcard in poker: it will match any character in the filename, e.g.:
will list files that start with any character, and end with xyz. So axyz will match, as will bxyz, but not vwxyz (as that would now have two characters followed by xyz).
The other wildcard is *, and it will match zero or more arbitrary characters. So if you have:
That will match all filenames that have zero or more characters between abc and xyz. So it will match abcdxyz abcdefxyz, even abcxyz, but not aabcxyz or abcdxyza.
There are also character class wildcards, which basically list characters that are permitted to match. For example:
will list all files that end in .c or .h. You could even do ranges:
which will list all files that end in a dot and any lower-case letter, e.g. abc.a, 1234.z, but not xyz or 1234.5.
If you're old enough to have ever used MS-DOS (or tried to use the cmd shell on Windows), it uses pretty much the same wildcards, although Unix/Linux shell wildcards are much more general. The character class wildcards are not supported on Windows and the * wildcard is much more general on Linux than on DOS/Windows, but using the command line on Windows may give you a general sense of things.
Grep is used to find patterns of strings within files. You basically give it a string pattern and a bunch of files to look through, and it will list the lines inside the file where the pattern was found. The simplest pattern is just a plain string, so grep abc myfile will find all the lines in myfile that contain the string abc.
Hope this helps.