A wicket at the stroke of after another rain delay meant West Indies fell back and eventually lost out on run rate.
Champions Trophy: South Africa in semis after tied game with West Indies
After rain had reduced the game to 31 overs a side in Cardiff, a fine 73 off 63 balls from Colin Ingram and scores of 38 from David Miller and 37 from captain AB de Villiers helped the Proteas post 230 for six.
Some power hitting from Marlon Samuels (48) and Kieron Pollard (28) had put West Indies on course to pull off the run chase, having recovered from being 87 for three at one point.
But, when Pollard was dismissed from the last ball before rain stopped play with 29 deliveries remaining, the Windies went from being ahead of the required score to level on 190 for six.
Both sides get a point for the tie, but it is the Proteas who go through due to a better net run-rate.
With an imposing target to chase, Chris Gayle was soon on the offensive emphatically swatting Dale Steyn's first ball of this tournament to the boundary, before repeating the dose to Lonwabo Tsotsobe.
But wickets began to fall as the run-rate started to climb. Johnson Charles (16) threw everything at a Steyn delivery and succeeded only in sending a steepling catch to wicketkeeper De Villiers.
Chris Morris got the wicket of Gayle (36), some away movement getting the opener to edge to Francois du Plessis in the point region.
Devon Smith then went lbw after a quickfire 30 from the last ball before the players briefly left the field.
Darren Bravo did not last long as he was run out for just 12 soon after the resumption.
But Samuels, at fault for the dismissal of Bravo, suddenly warmed to the task and produced a stunning scoring run of 31 from nine deliveries to suddenly bring West Indies into contention, and put them on track with the Duckworth-Lewis requirements.
Samuels was bowled by Steyn, but Pollard and Dwayne Bravo carried on his good work as the tension escalated, until the game reached its dramatic denouement with West Indies four runs ahead of the par Duckworth-Lewis score.
Pollard lofted the first ball of Ryan McLaren's over to Steyn, with the fall of wicket putting them level.
Seconds later, after new batsman Darren Sammy had made his way to the middle, the rain intensified and the players were taken off and the game declared as a tie.
Earlier, Ingram's excellent knock laid the foundations for a competitive South Africa score.
He went to his half-century off 46 deliveries and soon advanced into the 70s with boundaries coming quickly, while De Villiers - in at three after the dismissal of Hashim Amla for 23 - plundered a hooked six and driven four off the fast but erratic Tino Best.
Ingram eventually went after trying one shot too many, skying Pollard to Darren Bravo to make the score 124 for two off 17.3 overs, and JP Duminy (two) soon followed him back to the pavilion.
De Villiers kept the score rattling along only to became the fourth man out with the score on 153, Darren Bravo again taking a leaping one-handed catch, this time off Ravi Rampaul's bowling.
That left Miller (38) and Du Plessis to build on the foundations and they duly did so with some lusty hitting in their 68-run partnership which proved just enough for the Proteas.