Dean Elgar and Rassie van der Dussen put on a century fourth-wicket stand for South Africa but England have taken charge of the second Test after reducing the home side to 215/8 at the close of the second day at Newlands.
South Africa trail by 54 runs on the first innings having bowled England out for 269 and will resume the third day with Vernon Philander (13 not out) and Kagiso Rabada (0 not out) at the crease.
England had the new ball in hand five overs from the end of play and will resume on day three in search of the wickets to quickly end the home side's inning with a handy lead.
There is plenty in the wicket for the bowlers but South Africa were able to frustrate England through the middle part of the day as they seek to build on their 107-run first test win in Pretoria.
England made an excellent start with the ball and reduced South Africa to 40/3.
Seamer Stuart Broad (2/36) had debutant opener Pieter Malan caught by Joe Root at first slip for five, while Zubayr Hamza (5) could only fend a delivery to Ben Stokes at second slip.
James Anderson (3/34) removed South Africa's captain Faf du Plessis (1), also caught by Stokes, before Elgar and Van der Dussen's century stand steadied things for the home side.
Elgar has a reputation as a dogged accumulator of runs and played to type to score 88 from 180 balls, his 14th test half-century to go with 12 hundreds.
He was out to an uncharacteristically loose shot though, trying to smash off- spinner Dominic Bess to mid-off, but only succeeding in picking out England captain Root halfway to the boundary.
The dangerous Quinton de Kock played a typically breezy 20 before he was out in similar fashion, though seamer Sam Curran (2-39) was the bowler and Anderson took the catch.
Van der Dussen's patient stay at the crease saw him reach 68 from 187 balls, before guiding Curran to Stokes at second slip.
Dwaine Pretorious also then steered an Anderson delivery to Stokes, a fourth catch for the all-rounder, before the seamer also claimed the scalp of Keshav Maharaj (4) off what proved the final ball of the day.
England had resumed their first innings on 262/9 at the start of the day but Anderson (4) was caught by Van der Dussen at first slip off Rabada (3/68). Ollie Pope finished the innings not out on 61.
Meanwhile, the tourists are hoping to have fast bowler Jofra Archer available for the third Test that starts in Port Elizabeth on January 16.
A second scan on an elbow injury that kept him out of the Cape Town test revealed only bruising and swelling.