袁绍得知孙权与曹操交好的消息,勃然大怒,不顾田丰的劝阻,调集七十万大军,经由官渡向许都杀来。到武阳之后,袁军安营扎寨,营寨绵延九十里。曹操闻讯,率七万兵马赶来迎敌,两军在官渡相遇。

两军相峙一个多月,曹军粮草用尽,曹操便派人回许都催粮,不料信使被袁绍的谋士许攸抓获。许攸建议袁绍趁许都空虚、曹军缺粮之机,分兵袭击许都,袁绍不肯。正在此时,审配派人向袁绍汇报,说许攸曾经接受贿赂、私收税赋。袁绍大怒,骂许攸道:“你还有脸给我出主意?你是曹操的故友,必然是接受了他的贿赂,来诱骗我中计吧!我先记下你的死罪,得胜之后再和你算账!”许攸回到营中,羞愤不已,打算拔剑自刎,被随从劝住,思前想后,决定连夜投奔曹操。

当时,曹操已经休息了,听说许攸来访,欣喜万分,连鞋都来不及穿,就光着脚跑出来迎接。许攸说道:“我在袁绍帐下不得重用,只好连夜赶来投奔故友。”曹操笑着说道:“有你相助,我定能打败袁绍!”许攸问道:“曹公还有多少军粮?”曹操回答道:“足可以应付一年。”许攸笑着说道:“怕是未必吧!”曹操改口道:“还够用半年。”许攸听了,起身就告辞,曹操急忙挽留,许攸说道:“我诚心来投靠你,你却欺骗我!”曹操说道:“实不相瞒,军中还有三个月的粮草。”许攸又笑着说道:“世间传言曹孟德狡诈无比,果然如此。”曹操哈哈大笑,说道:“兵不厌诈。”然后,曹操压低声音,说道:“其实只有一个月的粮草了。”许攸脸色一沉,说道:“别骗我了,已经没有粮草了!”曹操大惊,问道:“你怎么知道?”许攸便把抓获信使的事告诉了曹操。曹操握着许攸的手,说道:“请故友教我,我该如何是好。”许攸说道:“我有一条妙计,三天之内,定能使袁军不战自乱。袁军的粮草辎重都在乌巢,倘若烧毁乌巢的粮草辎重,袁军自然大乱。”曹操大喜,依计而行。

第二天,曹操命曹洪、荀攸、贾诩、许攸等人留守军营,又令曹仁、夏侯惇、夏侯渊、李典等人埋伏在两侧,以防袁绍趁机劫营,自己与张辽、徐晃、许褚、于禁等率兵前往乌巢,焚烧袁军的粮草。当天夜里,星光璀璨,沮授见太白星逆行,侵犯牛斗之分[32],急忙求见袁绍,劝袁绍派重兵巡防乌巢。袁绍不听,斥退沮授。

曹操率兵直奔乌巢,途中遇到袁军盘问,便诈称袁将蒋奇奉命前往乌巢护粮,一路顺利,没有遇到阻碍。四更天时,到了乌巢,曹操命将士们点起火把,冲入袁军营寨。当时,乌巢守将淳于琼喝醉了酒,听见战鼓声,正要派人查看,就被曹军擒获了。曹操烧毁乌巢的粮草辎重,又割掉淳于琼的耳朵、鼻子和手指,放回袁绍营中。

袁绍见乌巢方向火光冲天,知道乌巢被曹操袭击,急忙召集文武幕僚商议。张郃主张救援乌巢,郭图主张趁机袭击曹操营寨,两人争执不休,袁绍没有主意,便令张郃、高览率兵袭击曹营,蒋奇率兵救援乌巢。蒋奇在半路上遇到诈称乌巢败兵的曹军,不加提防,被张辽一刀斩杀。袁绍以为乌巢已经被蒋奇夺回,不再派兵救援乌巢。张郃、高览袭击曹营,被曹仁等伏兵打败,郭图得知张郃、高览战败的消息,担心袁绍怪罪,抢先诬告张郃、高览,说他们早就打算投降曹操,袁绍大怒,令人前去问罪。郭图又秘密派人告诉张郃、高览,说袁绍要杀他们。张郃、高览走投无路,只好投降曹操。

袁绍不仅损失了乌巢的粮草辎重,还失去了许攸、张郃、高览、蒋奇、淳于琼等将领,心烦意乱,全军上下也是人心惶惶。曹操接受许攸的建议,令张郃、高览等率三路大军夜袭袁军,大获全胜。荀攸又献计,扬言要攻打邺郡、黎阳,切断袁军归路。袁绍惶恐万分,不辨真假,便分兵十万,令长子袁谭统率,救援邺郡、黎阳。曹操得到袁绍分兵的消息,立即分兵八路,大举进攻袁军。袁军无心恋战,四散逃窜,袁绍连衣甲都来不及穿,便在幼子袁尚的保护下逃跑了。张辽、徐晃等人紧追不舍,袁绍丢了金银细软,只率八百骑兵逃过黄河。由于被袁绍囚禁,沮授没能及时逃脱,被曹军抓获,后来企图逃回河北,才被曹操杀死,成为忠义之士的典范。

逃到黎阳以后,袁绍收集败兵,重整军容,然后返回冀州。半夜时分,在荒郊野岭露营,袁绍听到军士私下议论,抱怨他不听田丰的忠告,导致兵败,袁绍也后悔不已,心想:“回到冀州还有什么脸面再见田丰!”第二天,逢纪赶来,称田丰得知袁绍兵败的消息拍手大笑,袁绍恼羞成怒,立即派人赶往冀州处决田丰。临时前,田丰叹道:“我不能挑选贤明的主公,是我的过错,死有余辜!”

回到冀州以后,袁绍的妻子刘氏劝他及早确定继承人。袁绍有三个儿子,长子袁谭,次子袁煕,幼子袁尚。幼子袁尚是刘氏所生,也最受袁绍器重。袁绍便召集郭图、审配、逢纪、辛评四人商议,郭图、辛评拥护袁谭,审配、逢纪拥护袁尚,因此争论再起。郭图说道:“袁谭是长子,又握有兵权,如果立袁尚为继承人,必然引发内乱,后患无穷。”袁绍拿不定主意,犹豫不决。

得知袁绍战败以后,驻防青州的袁谭、驻防幽州的袁煕和驻防并州的外甥高干率十五万大军到冀州助战。袁绍大喜,率兵到仓亭,继续与曹军交战。曹操得到消息,也前进到仓亭。两军交战,袁尚射死徐晃部将史涣,两军混战一场,不分胜负。曹操接受程昱的计策,分兵十路埋伏在左右两侧,又令许褚引诱袁军到黄河边。曹军将士见无路可退,奋力死战,袁军抵挡不住,急忙回撤,遭到曹军十路伏兵的掩杀,大败。这一次,袁绍再遭惨败,袁煕、高干重伤,只得退回冀州。

曹操正准备攻打冀州,忽然得到消息,刘备自汝南率兵袭击许都。曹操大惊,留下曹洪防御袁绍,自己率大军赶往汝南迎战刘备。曹操与刘备交战,刘备获胜,曹操坚守不出。几天之后,刘备得到消息,龚都运粮到半路被曹军包围,便派张飞前去救援,不料张飞也被曹军包围。刘备正在烦恼之时,又得到消息,夏侯惇率兵包围了汝南,又派关羽救援汝南,也被曹军包围。刘备惊慌不已,只得趁着夜色撤兵,半路遭到曹军截杀,在赵云的保护下逃出重围。刘备收拢败兵,接受孙乾建议,到荆州投奔刘表。

曹操本想追击刘备,又担心袁绍趁机袭取许都,只得接受程昱的建议,暂时退兵。第二年春天,曹操再次攻打河北,以图彻底铲除袁绍。袁绍得到曹操再次出兵的消息,令袁尚、袁谭、袁煕、高干兵分四路迎战。袁尚自不量力,不等袁谭等赶到,抢先出战,被张辽打败,退回冀州。袁绍听到袁尚战败的消息,吐血不止,昏死过去。刘氏、审配、逢纪等人赶来,到袁绍床前商议后事,拥立袁尚为继承人。

袁谭听说袁绍病死的消息,本要讨伐袁尚,被郭图劝住,转而前往黎阳与曹操交战,结果大败,向袁尚求救。袁尚希望借曹操之手除掉袁谭,因此拒不救援。袁谭无奈,打算投降曹操。袁尚得到消息,担心袁谭与曹操联合攻打他,便亲自率兵前来救援。几天之后,袁煕、高干率兵赶到,与曹军在黎阳相峙。第二年春季,四人被曹操分兵打败,袁谭、袁尚退守冀州,袁煕、高干在城外驻扎,互为救应。郭嘉认为,袁氏三兄弟一定会自相残杀,因此建议曹操撤兵,任由他们自相残杀,然后坐收渔利。曹操便留下贾诩守卫黎阳、曹洪守卫官渡,自己撤兵了。

曹操撤兵以后,袁煕、高干返回幽州、并州,袁谭滞留冀州,图谋夺取大权。袁谭请袁尚赴宴,企图在酒宴上杀死袁尚。袁尚识破了袁谭的诡计,率兵攻打袁谭,身先士卒,奋勇冲杀,袁谭大败,退到平原,袁尚包围了平原。郭图劝袁谭假意投降曹操,引诱曹操攻打袁尚,以趁机渔利。曹操也接受了荀攸的建议,决定先消灭袁尚,再消灭袁谭。

袁尚得知曹操再次出兵的消息,急忙退回邺郡,袁谭则投降了曹操。袁尚听取审配的意见,再次攻打平原,计划迅速打垮袁谭。曹操趁机派曹洪、张辽、许褚攻打邺郡、邯郸等地,然后在冀州城下会合。袁尚见冀州被围,急忙回军救援,被曹军打败,丢弃衣甲辎重,逃到了中山。许攸建议水淹冀州,曹操便引了漳河的水灌进冀州城。审配之侄暗中投降曹操,放曹军入城。曹操攻克了冀州,审配被俘虏,拒不投降,面向袁氏所在的北方引颈就刃。

袁谭得知袁尚逃往中山的消息,亲自率兵追击,袁尚无心恋战,逃到幽州投奔袁煕。袁谭收拢袁尚的败兵,意欲夺取冀州,曹操大怒,率兵进逼平原。袁谭连忙向刘表求救,刘表婉言拒绝。袁谭无可奈何,只好放弃平原,逃到南皮坚守。曹操亲自率兵包围南皮,袁谭再次向曹操投降,曹操怪他反复无信,不准投降。袁谭只得以百姓为掩护,亲自杀出城与曹操决战,结果大败,被曹洪杀死。郭图见势不妙,急忙撤退回城,被乐进一箭射死。

消灭袁谭之后,曹操令袁氏降将吕旷、吕翔、张南、焦触、马延、张恺等人分兵三路进攻幽州,又令李典、乐进等攻打并州。袁尚、袁煕料敌不过,放弃幽州,逃到辽西,投靠乌桓[33]去了。幽州刺史出城投降,曹操进入幽州。之后,曹操听取郭嘉的意见,进入沙漠荒原,追击袁尚、袁煕。袁尚、袁煕纠集乌桓首领蹋顿的骑兵,在白狼山与曹军交战,再次大败,逃往辽东。

等曹操回到易州时,郭嘉已经病逝了。诸将请求继续追击袁尚、袁煕,曹操却下令停止追击。原来,郭嘉临终前给曹操留下一封信,郭嘉在信中说,辽东太守公孙康对袁氏心怀戒备,如果派兵追击二袁,公孙康必然联合二袁以自保;如果不追击二袁,公孙康必然除掉二袁。事实果然如此,公孙康见曹操屯兵易州,没有攻打辽东的意图,便诱杀了二袁,将头颅送到易州。

至此,曹操消灭了袁绍的势力,统一了北方。回到许都以后,曹操接受荀彧的建议,一面养精蓄锐,一面训练水军,准备南下攻打刘表、孙权。