Fast bowler Rabada finished with six for 55 as Sri Lanka crumbled to 224 all out, giving South Africa a winning 2-0 lead in the three-match series. It took South Africa less than two hours to claim the remaining six wickets after the tourists resumed on 130 for four.
Overnight batsmen Angelo Mathews and Dinesh Chandimal played out the first five overs of the day without undue alarm before Rabada struck with the first ball of the sixth over when Chandimal (30) flicked him straight to Stephen Cook at square leg, the only fielder in a largely unmanned area of the field.
New batsman Upul Tharanga showed aggressive intent and hit Rabada for three fours, one off an edge, before flashing at a wide delivery from the first ball of the fast bowler?s next over to be caught behind by Quinton de Kock.
Sri Lankan captain Mathews fell to the last ball of the over, edging a lifting delivery to De Kock after making top score of 49 off 82 balls.
Rabada struck once more when he had Suranga Lakmal caught behind. It was the fifth time in his 13-Test career that he had taken five or more wickets in an innings. He had match figures of 10 for 92, his second ten-wicket haul.
There was a flurry of strokes from Rangana Herath and Lahiru Kumara, who put on 33 for the ninth wicket before Keshav Maharaj and Vernon Philander wrapped up South Africa’s win
South Africa, who won the first Test by 206 runs at Port Elizabeth, took an unassailable 2-0 lead to secure the series win with one match remaining.