Input polling via the Input singleton is not supposed to be mixed with input event handlers. It just generates confusion. Use either one or the other for a specific event.
Your code behaves exactly as it should. Your _input() handler now captures all input events in the frame without any discrimination over their type. So no surprise you get 3 to 12 calls there, including the one you're actually interested in. And then at each such event you check if your action is pressed which is always true in the frame you pressed it, hence grab() gets called multiple times in the frame.
So it's either:
func _input(event):
if event.is_action_pressed("grab"):
grab()
Or:
func _process(delta):
if Input.is_action_just_pressed("grab"):
grab()
The difference is described at the beginning of Input Examples section in Godot documentation