Centurion - Vernon Philander and Kagiso Rabada took a wicket apiece as England's top-order batsmen were put under pressure on the second day of the first Test at SuperSport Park on Friday.
England were 60/2 at lunch in reply to South Africa's 284 all out.
England's openers fell cheaply, both caught behind by Quinton de Kock off balls which bounced steeply.
Rory Burns fell to Philander after making nine, which included two edged boundaries off Rabada. He had been given out caught behind off Rabada's first ball of the innings but a review showed his bat had made contact with his pad but not the ball.
Dom Sibley was dismissed by Rabada for four.
Philander bowled an immaculate opening spell and did not concede a run in five overs.
Joe Denly faced most of Philander's bowling and had still not scored when he edged the 25th ball of his innings low to first slip where Rassie van der Dussen put down the chance, perhaps put off by De Kock diving in front of him. Denly scored his first run in the same over, off the 28th ball he faced. He was unbeaten on 17 at lunch.
Rabada was particularly hostile and hit England captain Joe Root on the helmet, ducking into a bouncer, when the England captain was on six. Root had scored 23 not out at the interval.
Anrich Nortje bowled with impressive pace when he replaced Rabada, with his first ball timed at 147kmh and another delivery at 149kmh.
England needed only 11 balls at the start of play to take the last South African wicket after the hosts resumed on 277 for nine. Philander scored all seven runs added before he was caught behind off Stuart Broad for 35. Both Broad and Sam Curran had figures of four for 58.