I'm not totally sure why csvgrep csvsort csvcut csvjoin are needed as replacements for grep sort, cut or join?

The syntax doesn't seem noticeably clearer?

And - without testing - I presume csvkit in Python is a bit slower than the GNU coreutils in C?

Grep understands text files, not CSV syntax. They're not equivalent. For example, the following CSV document has two lines, but grep treats them as three:

  1,2,5,"Hello"\n  3,4,5,"How are\n  you doing?"
That's correct, and as you illustrate it's the possibility to have newlines and commas inside quoted fields that complicates things for grep/awk/cut/etc.

So instead of making a more complex version of tools like grep, we can make the data simple for these tools to understand. That's what https://github.com/dbro/csvquote does. It can be run in a pipeline before the grep stage, and allow grep/cut/awk/... to work with unambiguous field and record delimiters. Then it can restore the newlines and commas inside the quoted fields at the end of the pipeline.