邺城的兵马在腊月过半的时候开始向南移动。最先出发的是前锋骑兵,由颜良率领,约两万人,沿着官道向黄河渡口推进。骑兵队列在晨光中拉开一道很长的线,马蹄扬起的尘土在冬日的干冷空气中凝成一片灰白色的薄雾,沿着道路的方向缓缓移动。随后是中军步兵,由袁绍亲自统领,约八万人,携带粮草辎重,沿着同一条官道分批南下。后队由文丑统领,约五万人,负责押运后续粮草和接应。
袁绍骑在一匹深棕色的战马上,走在队伍中段。他穿着一身厚实的铁甲,外面罩了一件玄色披风,腰间挂着一柄镶着玉饰的长剑。他的马走得不快,但步伐很稳,像是在丈量这条已经走过很多次的路。沿途的县城看到那支队伍时没有拦截,有的打开城门在门洞两侧列队,有的干脆闭门不出,只在城墙上远远望着那支移动的长线。
曹操在许昌收到袁绍前锋已经渡过黄河、正在向南推进的消息时,正在府衙正堂里与曹仁和程昱议事。他把军报看了一遍,递给曹仁:“颜良带了两万骑兵,走的是官道。袁绍的中军在后,大约还有三天的路程。”曹仁看完军报,递给程昱:“颜良的骑兵快,他会比中军提前到达许昌。末将建议在许昌以北设伏,先打他一个措手不及。”曹操说颜良这个人勇猛但急躁,他不会等中军会合,他会直接冲到许昌城下。曹操站起来走到地图前面:“许昌以北二十里处有一道缓坡,坡下是洼地,骑兵从坡上冲下来的时候速度会减慢。在那里设伏,用弓弩手封住洼地出口,颜良就会被困住。”曹仁说末将去安排。
许昌城内的军营在当天下午就开始调动。曹仁带着一万步兵和三千弓弩手出了北门,沿着官道向北推进,在距离许昌大约二十里处的那处缓坡两侧布阵。弓弩手被安排在坡顶的灌木丛后面,步兵在洼地出口处列阵,用拒马和鹿角堵住了出口。曹仁在坡顶蹲下来,用手按了按地面的土质,确认那些被冻硬的泥土足够承受弓弩手的重量,然后站起来沿着防线走了一遍。
吕布在徐州收到袁绍大军南下的消息之后,让张辽从寿春带骑兵向北移动,在豫州北部与兖州交界处待命。他没有让张辽直接进入许昌战场,而是让他停在距离许昌大约百里处,像一道被拉开的弓弦,等到合适的时机再松手。张辽带着骑兵沿着淮河北岸向北推进,在豫州北部的一处旧驿站附近扎了营,每天派出斥候沿着官道向许昌方向巡逻,确认袁绍的部队推进到了哪一段。
颜良的前锋在第三天清晨到达了许昌以北那处缓坡。他没有停下脚步,让骑兵继续向前推进,沿着坡道向南进入洼地。曹仁在坡顶的灌木丛后面看着那支骑兵队列进入洼地,等走在最后面的骑兵也进入了伏击圈之后,才放下手中的令旗。弓弩手从坡顶两侧同时放箭,箭矢落入洼地,将颜良的骑兵困在其中。颜良在前方听到侧翼的箭矢破空声,勒住马回头看了一下,发现后路已经被封住了。他没有慌乱,试图带着骑兵从洼地侧面冲出去,但两侧的坡壁上布满了拒马和鹿角,马匹无法攀爬。曹仁的步兵从洼地出口处压上来,与被困的骑兵展开了肉搏。颜良在乱军中来回冲杀了几次,试图找到突破口,但每一次都被曹仁的步兵顶了回去。他在阵中嘶声喊了几句,声音被喊杀声淹没。
战斗持续了将近一个时辰。颜良的骑兵在洼地中被截成几段,有人下马试图攀爬坡壁,被坡顶的弓弩手射退。颜良本人带着几十个亲兵从洼地东侧的一处矮坡冲了上去,在坡顶与曹仁的步兵短兵相接。他挥刀砍翻了几个拦路的士兵,带着剩下的亲兵沿坡道向东撤去。曹仁没有下令追击,让弓弩手补了一轮箭矢,然后收兵清点战场。颜良的两万骑兵,折了将近一半,剩下的沿官道向东溃散。
消息传到袁绍的中军时,他正在黄河渡口以南的一处驿站里歇脚。信使从前方赶回来,把颜良中伏的消息报了一遍。袁绍听完之后没有发怒,把手中的茶碗放在案几上,沉默了一会儿:“颜良折了将近一半的骑兵。曹仁设伏的位置选在洼地,说明曹操已经提前知道了我的进军路线。”他站起来走到地图前面,手指沿着官道从许昌向北移动,在洼地的位置停了一下,然后收回来:“让文丑把后队的粮草押运加快,不要落在后面。让中军放慢速度,等文丑跟上来再继续向南。”他没有下令撤回颜良的残部,也没有增派前锋部队,像是要把那处已经被撕开的缺口暂时留在原地,等后续的兵力自己填上去。
吕布在徐州收到颜良中伏的消息时,正在县衙书房里看一份关于豫州南部屯田进度的报告。郭奕在门口把伏击的经过说了一遍,又补了一句:“袁绍的中军还在继续南下,没有停。”吕布放下报告,在案前坐了一会儿:“曹操设伏打赢了第一仗,但袁绍的主力还在。颜良只是前锋,折了前锋不会伤到袁绍的中军。”他站起来走到地图前面,目光落在许昌以北的区域上:“让张辽的骑兵再往北推一段,不要靠得太近,让袁绍知道他的侧面有我们的骑兵在动。”郭奕领命出去了。吕布在案前重新坐下来,他没有合上地图,手指停留在豫州北部与兖州交界的位置上,像是在等那道尚未出手的弧线自己找到它该切入的时机。