CHICAGO -- Reed Johnson saw only one pitch in the game, and that was all he needed to have a big impact with a little hit.
Pinch hitting in the seventh inning, Johnson drove in the go-ahead with a bunt single and the Chicago Cubs got past St. Louis 3-2 on Saturday, ending the Cardinals' four-game winning streak.
Johnson caught the Cardinals by surprise when he squared up on the first pitch with runners on first and third and two outs. Johnson's bunt fell perfectly between reliever Brian Fuentes and third baseman Matt Carpenter, allowing pinch-runner Tony Campana to score.
"That's a part of my game," Johnson said. "If there is an RBI out there (and if) they're going to give me that bunt at third, I'm going to take advantage of that every time."
The Cubs snapped a five-game skid against St. Louis and have won nine of their past 11 at Wrigley Field. One day after the Cardinals homered in each of the first five innings in a 9-6 win over the Cubs, Chicago evened the series on a hit that traveled about 40 feet.
"That was all on his own," Cubs manager Dale Sveum said. "Reed is one of them baseball players that has those things in his toolbox.
"He's just an ultimate baseball player that you love having around," he said.
James Russell (3-0) earned the win in relief.
Carlos Marmol pitched the ninth for his 13th save in 15 chances. He struck out Skip Schumaker and got John Jay on a groundout with pinch-runner Tyler Greene on second to end the type of game the Cubs struggled to win earlier this season.
"The back of that bullpen has been pretty good," Sveum said. "It wasn't all that good at the beginning."
Bryan LaHair drew a leadoff walk in the seventh from rookie Joe Kelly (1-4). Campana entered the game and stole his 26th base in 29 tries, then went to third on Geovany Soto's single. Two outs later, Johnson bunted for a hit.
"Campana, that's a huge stolen base against the best throwing catcher in baseball after they were really keeping him close, " Sveum said. "That's a big-time stolen base in a big situation."
Kelly gave up a two-run triple to Alfonso Soriano in the first, but limited Chicago to three runs over a career-high 6 1/3 innings. He retired 14 straight batters at one point and struck out a career-best six. Kelly hasn't allowed more than three runs in any of his nine outings this season.
"I went out there and gave up two early and in that environment it's not too easy to come back from," Kelly said. "I was confident in my skills and my stuff and felt good, make quality pitches down in the zone and let our team have a chance to come back."
Both starters struggled early, then settled down -- combining to strike out seven straight batters at one point.
Cubs starter Jeff Samardzija's first seven pitches eluded the strike zone and he walked the bases full on 16 pitches. He limited St. Louis to one run in the inning on an RBI grounder by Carlos Beltran.
"Back in the day, it probably would have been a different day for me," Samardzija said. "I'm starting to learn how to pitch in those situations, and how to get out of them with minimal damage."
The Cubs are still 17 games under .500 for the season, but improved to 17-10 since June 25.
"I really like how we're playing baseball right now," Samardzija said. "It's fun to come to the park. Everybody is excited and happy."
Cardinals 3B David Freese was held out of the starting lineup for the second straight day after leaving Thursday's win over the Dodgers because of cramping in his right calf. He was available for pinch-hitting duty on Saturday and manager Mike Matheny expects him to return to the lineup for Sunday's series finale. ... Cubs RHP Matt Garza reported no problems after throwing off flat ground on Saturday. He is slated to throw a bullpen session on Monday and if that goes well, he is in line to make his next start in the latter part of next week. Garza left his last outing on July 21 because of cramping. An MRI showed a small trace of fluid buildup in his right triceps. ... Sveum was ejected after the seventh inning by 1B umpire Mike Winters for arguing that Starlin Castro had beaten out an infield hit with the bases loaded.