Wayne Parnell took two wickets in his first three balls on his Test return as South Africa dominated Australia on day two of the second Test in Port Elizabeth.
The hosts, resuming on 214-5, made 423 thanks to centuries from AB de Villiers (116) and JP Duminy (123).
Parnell and Vernon Philander then took two wickets apiece to reduce Australia to 112-4 – trailing by 311.
Opener David Warner will resume on 65 not out.
He saw Australia, who lead the three-match series 1-0 after winning the first Test at Centurion by 281 runs, through to the close alongside nightwatchman Nathan Lyon.
After De Villiers had reached his 19th Test century and Duminy his third, South Africa’s seamers took charge.
Philander trapped Rogers leg before and left-arm paceman Parnell – making his first Test appearance since January 2010 – had Alex Doolan and Shaun Marsh caught behind by De Villiers.
Skipper Michael Clarke was taken at short cover off Philander, and Australia’s position would have been worse had De Villiers not dropped opener Warner on 43.