Kohli (54) was dismissed after scoring his 16th half- century while Rahane (9), playing his first game of the series, did not last long after getting a life off a no-ball.
At the break, Cheteshwar Pujara (27 not out, 4 fours) was still playing an anchoring innings having faced 145 balls, while Parthiv Patel (0) was unbeaten at the other end.
Kohli (on 32) got a second life then as AB de Villiers dropped him at third slip off Morne Morkel (1-35) in the 33rd over. The batsman had chased a wide delivery, only to edge it.
He continued to play in an attacking manner, making his luck count, as their 50-partnership came off 134 balls. He had an engaging contest with Kagiso Rabada (1-31) in this interim.
Finally though, Kohlis luck ran out as he was caught at third slip again, de Villiers holding on this time off Lungi Ngidi (1-7) in the 43rd over.
India crossed 100 in the 46th over. Three overs later, Rahane was given a life when he was caught behind off Vernon Philander (1-22) but it was deemed a no ball.
Rahane couldnt make this opportunity count, as he was given out lbw in the 52nd over off Morkel. The batsman reviewed and the ball appeared to be going down leg side, only clipping the stumps minimally, but the decision stayed on umpires call.
This was after India opted to bat first on a green-top wicket and reached 45 for two at lunch.
The visitors lost their openers early. KL 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 for two as Murali Vijay (8) was also caught behind off Rabada in the ninth over. The opener played away from his body, outside the off-stump, without any real footwork and this was a fourth time in five innings on this tour that he was dismissed in such fashion.
Philander had almost trapped Pujara (on 0) lbw in the sixth over, only for DRS to stay with umpire Goulds 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 Ngidi 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 Wednesday crowd at the Bull Ring.
Earlier, India picked an all-seam attack on a cloudy morning in Johannesburg. 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.
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.
Disclaimer: No Business Standard Journalist was involved in creation of this content
