Opting to bat first on a green-top wicket, India lost both openers -- KL Rahul (0) and Murali Vijay (8) to be tottering at 13-2 in 8.4 overs.
Virat Kohli and Cheteshwar Pujara then added 32 runs for the unbeaten third wicket.
At the break, Kohli was batting on 24 not out off 58 balls while Pujara was unbeaten on 5 runs, playing a grinding knock off 66 balls.
Morne Morkel (0-8) and Vernon Philander (1-1) opened proceedings for the Proteas.
More From This Section
India though lost their openers early. Rahul (0) faced a near-unplayable spell from Philander and should have gone first ball, but somehow managed to survive.
Six balls later though, he got an inside-edge off the same bowler and was caught behind.
India were reduced to 13/2 as Vijay (8) was also caught behind off Kagiso Rabada (1-15) in the 9th over.
Pujara and Kohli then came together and resisted the South African bowling through a testing passage of play. They stayed together for 110 balls, despite being beaten and getting three lives between them.
Philander had almost trapped Pujara lbw in the 6th over, only for DRS to stay with umpire Ian Gould's call of not-out as the ball seemed only to clip the bails.
Kohli had a life too, dropped by Philander at mid-on as he miscued a pull off Lungi Ngidi (0-3) in the 21st over.
Pujara finally got his first run off the 54th delivery he faced, in the 22nd over, to loud cheers from the sparse crowd at the Bull Ring.
Only on the previous delivery though, South Africa opted not to review even as replays showed Ngidi had trapped him lbw with 'three reds' on DRS.
More importantly, the duo thwarted the Proteas for the remainder of the session and went to lunch without any further loss.
Bhuvneshwar Kumar came in for R Ashwin as India took the field without a full-time spinner for the first time since 2012, when MS Dhoni had opted for a four-pronged pace attack against Australia at Perth.
Ajinkya Rahane also came in for Rohit Sharma. This was the 35th Test wherein Kohli has fielded a different playing eleven in consecutive matches.
South Africa made just the one change, with seam all- rounder Adile Pheklukwayo coming in ahead of left-arm spinner Keshav Maharaj.
South Africa have already won the three-match series with a 2-0 lead after winning the first Test in Cape Town by 72 runs and the second Test in Centurion by 135 runs.