Seamer Vishwa Fernando took 4-62 as Sri Lanka dismissed South Africa for 235 on day one of the first Test, at Kingsmead.
Fernando and Kasun Rajitha (3-68) shared seven wickets as the hosts - Quinton de Kock (80) aside - struggled on a helpful pitch for bowlers.
At stumps the tourists were 49-1 in reply, 186 runs behind, with captain Dimuth Karunaratne (28no) and Oshada Fernando (17no) at the crease.
Opener Lahiru Thirimanne was the wicket to fall, caught by wicketkeeper De Kock for a duck off seamer Dale Steyn.
"We need to get off to a good start tomorrow and try and find a way to strike early," De Kock reflected. "Sri Lanka have shown some good intent within their batsmen and will look to score quickly. We will have to figure out how we go about getting wickets."
Sri Lanka had earlier won the toss and, after choosing to bowl, reduced South Africa to 17-3 before Faf du Plessis (35) and Temba Bavuma (47) put on 72 for the fourth wicket.
Fernando (4-62) impressed with the new ball, removing openers Dean Elgar (0) and Aiden Markram (11) early.
Bavuma looked well-set until a straight drive from De Kock deflected off the boot of bowler Fernando and onto the stumps with the batsman out of his crease at the non-striker's end.
Keshav Maharaj (29) put on 47 with De Kock but was caught by Niroshan Dikwella off Fernando just before tea.
Watch highlights of day one on Sky Sports Cricket from 8pm then join us for live coverage of day two of the first Test live on Sky Sports Cricket from 7.55am on Thursday.