The teams combined to walk 14 batters -- seven apiece -- with three wild pitches and two hit batters thrown into the mix. There were six pitchers used on each side, with the Cubs' bullpen throwing four scoreless innings in relief of starter Chris Volstad (3-10).
"I'm glad the guys are getting the opportunity to show they're Major League hitters, but at some point, they have to be accountable for their at-bats and try to grind them out," Astros interim manager Tony DeFrancesco said.
The Astros were 1-for-12 with runners in scoring position. The only clutch hit came in the fourth, when Justin Maxwell led off the inning with a triple to center and scored on Jason Castro's single. Houston stranded 11 runners on base.
"We had opportunities in the first and the fifth, and I battled both times and [Volstad] got the better end of the deal there," Maxwell said. "We had [Volstad] on the ropes all night, but we just weren't able to push anything across at the time."
The Astros had two runners on after one out in the first and put runners at first and third with no outs in the fifth and couldn't score. They wound up loading the bases with two outs in the fifth, but Volstad got Matt Dominguez to ground out for his final batter.
"That's what you're looking for -- to get out of that mess," Cubs manager Dale Sveum said. "That was a battle that he won. That's what you want to see. He ended up getting out of that and battling his butt off and making the pitch when he had to make it. That's exactly what you're looking for."
Keuchel, searching for his first win since tossing a complete game in his second Major League start on June 23, allowed six hits and one run in his four innings of work. But he was often behind in the count and worked his pitch count high enough that DeFrancesco pinch-hit for him in the fourth with runners at first and second and two outs.
"If you watch Dallas in those innings there, it was a battle," DeFrancesco said. "He got deep into the count. He had 80 pitches in four innings, and I thought that was the time. We had a chance to break the game open, and [Brandon] Laird gets in there and chased a couple of breaking balls, and that was the inning."
Keuchel emerged from the bullpen after his pregame warmup feeling better than he has in a couple of weeks.
"This is the first time I felt good in about three starts, and I was happy with that," he said. "The two-seam [fastball] wasn't finishing. Maybe I was over-amped, because I feel good. I got rid of the sinus infection. The body felt terrible the last two weeks, but today I felt good."
The game was tied at 1 in the sixth inning when Astros reliever Fernando Rodriguez (1-10) bounced a wild pitch through the legs of Castro, allowing Dave Sappelt to score with the go-ahead run.
The Cubs loaded the bases with no outs in the seventh, and reliever Hector Ambriz got a 5-2-3 double play. But Sappelt followed with a double high off the wall in left field to score a pair of runs and put the Cubs ahead, 4-1, narrowly missing a home run.
"We got the double play and it was executed perfect, and the next guy got the big hit," DeFrancesco said. "We were close to keeping that game close."
Maxwell (2-for-4) and Fernando Martinez (2-for-4) led the way for the Astros, but the bottom four hitters in the order didn't provide any hits. Castro went 1-for-3 with a walk and an RBI. He has a hit in nine of his 11 starts and is hitting .293 since May 21.
"It's a battle out there," DeFrancesco said. "I think our guys are learning. Some days we look like we get quality at-bats, some days it seems like we chase out of the zone. Every day we try to teach them about strike-zone selectivity and getting deep into counts, and even to the last out, we tried to get the tying run to the plate and we came up short."