What's the clear difference between macro and keyword in Shader ?

It’s seems they both need being “defined”.
I’m getting confused with these two.
Is the keyword a kind of special macro?
Or are they totally irrelevant?

In the shader code they are the same thing. The only difference is that keywords are “created” using a #pragma directive, for example multi_compile or shader_feature. Those tell the shader compiler to compile multiple versions of the shader, making them all available to the runtime.
For example, if you have #pragma multi_compile _FEATURE_ON _FEATURE_OFF and then in your code you use eg. #ifdef _FEATURE ON, the shader will be compiled once with _FEATURE_ON defined and once with _FEATURE_OFF defined instead. Then, the material selects the shader variant using the keywords from the material