|Onions takes the prize wicket of Kallis [AFP]
South African fast bowlers Morne Morkel and Dale Steyn took three wickets each as England were made to work hard for runs on the second day of the third Test at Newlands.
England were 241 for seven at the close, 50 behind South Africa's first innings total of 291.
Thanks mainly to Morkel, who took three for 57, and Steyn’s three for 64, England were unable to take control despite ripping through the South African lower batting order early in the day.
Seven wickets fell during a dramatic morning's play, with South Africa losing their last four wickets for 12 runs in 17 balls at the start of the day and England slumping to 64 for three at lunch.
Another wicket fell soon after the interval when Paul Collingwood was leg before wicket to Morne Morkel for 19.
Bell two short
Alastair Cook weighed in with 65 and put on 60 for the fifth wicket with Ian Bell, who fell two short of his fifty.
South Africa first innings (o/n 279-6)
G Smith c Prior b Anderson 30
A Prince c Prior b Anderson 0
H Amla lbw b Onions 14
J Kallis c Prior b Onions 108
AB de Villiers c Strauss b Swann 36
JP Duminy c Prior b Swann 0
M Boucher lbw b Broad 51
D Steyn c Trott b Anderson 26
M Morkel c Swann b Anderson 0
P Harris not out 10
F de Wet lbw b Anderson 0
Total (all out; 86.1 overs) 291
FoW 1-1 2-46 3-51 4-127 5-127 6-216 7-280 8-280 9-281 10-291
England first innings
A Strauss c Boucher b Morkel 2
A Cook c Prince b Morkel 65
J Trott b Steyn 20
K Pietersen c & b Steyn 0
P Collingwood lbw b Morkel 19
I Bell c Duminy b Kallis 48
M Prior not out 52
S Broad b Steyn 25
G Swann not out 5
Total (for 7, 82 overs) 241
FoW 1-2, 2-36, 3-36, 4-73, 5-133, 6-174, 7-225
There were further useful partnerships of 41 between Bell and Matt Prior, who ended 50 not out, and 51 between Prior and Stuart Broad.
But every time it seemed England were getting on top one of the South African bowlers would strike to make the game even again.
Cook followed up his century when England won the second Test in Durban by an innings and 98 runs with another careful innings, leaving many deliveries and waiting for the right ball to hit.
He took 112 balls to post his fifty, hitting five fours, and faced 136 balls before scooping a catch to midwicket off Morkel.
Bell, another century-maker in Durban, never got on top of the bowling and faced 121 balls before slapping a short ball from Jacques Kallis to point.
Prior overcame a shaky start, playing and missing several times, but went on to reach his half-century in the final over of the day.
England fast bowler James Anderson took three wickets for one run at the start of play as South Africa's remaining batsmen succumbed rapidly.
Kallis resumed at the crease with Steyn, with England hoping to limit the damage of Kallis' 108 the day before, which had propelled the Proteas to 279-6 after being on 127-5 at one stage.
But Kallis was soon on his way after being caught behind by Matt Prior off Graham Onions before James Anderson mopped up the remaining victims to clinch five wickets for 63 runs.
Steyn was caught at slip by Trott, Morkel's edge was grasped by Graeme Swann and Friedel de Wet fell lbw to end an innings that would have been disastrous were it not for Kallis' heroics.
South Africa struck back almost immediately when Morkel had England captain Andrew Strauss caught behind for two, driving at the last ball of the first over of the England innings.
Cook and Jonathan Trott took the total to 36 before Steyn, who came on as first change, took two wickets in three balls.
Trott was bowled off an inside edge for 20.
Kevin Pietersen was greeted by a bouncer, which he ducked under, but then pushed a full, swinging delivery back to a delighted bowler as the Cape Town crowd roared with joy at their countryman's early demise.
The series stands at 1-0, with the first match drawn and England winning the second match in Durban against the world's top-ranked side.