汉献帝建安五年(公元200年)二月,袁绍任命沮授为监军,统领10万大军,从邺城(今河南省安阳市北)出发,进攻许昌。袁绍则亲率十余万冀州精兵到黄河北岸的黎阳(今河南省浚县东北),建立自己的指挥部。他派大将郭图和颜良进攻和黎阳隔岸相对的白马(今河南省滑县东)。袁绍企图引诱曹操离开官渡(今河南中牟县东北),然后一举消灭曹军。沮授向袁绍建议,颜将军虽然勇猛,但骄傲自大,缺少智谋,不适合单独统兵作战。可袁绍固执己见,下令迅速渡河,打下白马。
留守白马的刘延听说袁军来进攻,急忙派人向曹操报告。而此刻,在许昌正展开一场是否抗袁的大辩论。名士孔融被袁绍的表面强大所迷惑,他认为:“袁绍辖地广阔,拥兵数十万,文有田丰、许攸这样的谋上出谋,武有颜良、文丑这样的勇将打仗,还有审配、逄纪这样的忠臣效劳。与袁绍对抗,很难取胜。”许多人听了,都情绪低落,只有一个人挺身而出与孔融抗争,此人就是曹操的主要谋士荀彧。他说:“袁军虽兵多,但法不严。而且田丰刚愎自用,无法与袁绍长期合作;许攸贪心太重,不能顾全大局;审配专断,缺乏谋略;逄纪心胸狭小,又骄傲自大。这些谋士到一起怎么能相容呢?至于颜良、文丑这类武将,皆有勇无谋,擒拿他们,对曹公来说,乃小事一桩。”荀彧这一番话,驳倒了孔融,也激励了将士,增强了胜利的信心。曹操根据大家的建议,决定不和袁绍硬打硬拼,而采取声东击西、避实就虚的打法。曹操亲率大军西进延津(今河南省延津北),以诱惑袁军主力西移,从而麻痹在白马的颜良。果不出曹操所料,袁绍立即命令黎阳的守军赶在曹军渡河之前到达延津渡口,准备同曹军决战。曹军见袁绍中计,就悄悄率领轻骑,急奔白马。而此刻围攻白马的颜良正一心想困死白马城内的军民,他做梦也没想到曹军会在一夜之间赶回东边,同自己决战,所以毫无迎战准备。在仓促应战中,颜良被一匹火红快马上的将军劈下马。袁军失去主将,顿时乱了阵脚。刘延也从城里杀出,同曹操的兵马两面夹击,一举击溃了颜良、郭图的队伍。而那位杀颜良的将军,正是要报答曹操厚恩的关羽。
袁绍得知白马战败,又失掉爱将,十分气恼,紧急命令:全军渡河,西追曹操。沮授急忙劝阻袁绍:“将军,目前大军应该屯在河北岸,只派一路军队攻打河南岸的官渡。如果攻打下了官渡,我们就有了立足之地,然后大军方可过河。否则贸然渡河,万一有了意外,就可能全军覆灭!”袁绍根本就听不进劝阻,决意渡河。
袁军渡过黄河,抵达延津后,袁绍派大将文丑追击曹操。因为文丑和颜良是好朋友,为了立功和替颜良报仇,他快马追击。
一路上,到处都是曹军丢下的车辆物资,山坡上有许多无主的战马,袁军毫不怀疑这是曹军仓促逃命时丢弃的。于是文丑的部下便争先恐后地跳下马,一窝蜂地去抢夺战利品。其实,他们中了曹操的计谋。此刻,曹操正在山头观望呢!一见文丑的队伍乱了阵,一声令下,曹兵就从四面八方围冲过来,见了袁军就杀。文丑也同颜良一样,还没明白是哪儿来的神兵大将,脑袋就被劈了下来,袁军全部溃散了。
白马、延津与曹操的两次交手,袁军连连失利,但从总的力量来看,袁军仍占优势。袁绍坚决主张渡河同曹操的主力决战,因为他自恃兵多,不顾沮授的再三劝阻,亲率大军渡过黄河,进驻阳武,又涉过蒗荡渠,直逼官渡。官渡离许昌不到200里,是南北交通的咽喉。如果失掉官渡,那么许昌就失去了屏障。因此,曹操尽全力固守官渡,与袁绍相持不下。日子久了,袁绍感到军粮供应困难,就想方设法尽早结束僵持局面。他命令士兵沿曹营阵地堆起土山,筑起瞭望楼,让弓箭手居高临下,寻找机会向曹营射箭。曹军死伤不少。不过,曹军很快就有了对策,他们制造了可以抛发石块的发石车,只要扳摇车上的机关,就可以把大石块远远抛出。发石车抛石时响声如雷,俗称“霹雳车”。袁军的望楼被打得倒坍歪斜,士兵也头破血流、鬼哭狼嚎。袁绍又想起了挖地道灭公孙瓒的战术,就命令士兵偷挖地道,直通曹营。曹操就在军营前抢挖了一条很深的沟,蓄满水,只要袁绍的地道一挖到壕沟,水就灌入地道,这又破坏了袁绍的计谋。
尽管曹操打败了袁绍的多次进攻,但时间一久,粮草供应越来越困难,简直使曹操陷入一筹莫展的境地。曹操自知比起袁绍,他兵少粮缺,将士们东征西讨,南攻北伐也太疲劳了,恐怕支撑不了多久,便有意撤军回许都。他写信给荀彧,荀彧回信,借用了当初刘邦、项羽在荥阳、成皋相持的经验,说明现在袁、曹两军,谁先退谁的气势就会受挫。荀彧还表示尽力筹措军粮,支援官渡。曹操从荀彧那里得到了信心,他一边坚守官渡阵地,一边派骑兵四处侦探,寻找出奇制胜的时机。
不久,徐晃的部将打听到袁绍的大将韩猛从冀州运来军粮数千车,支援袁绍驻兵,即将到达。曹操就派徐晃率骑兵突袭,韩猛毫无戒备,战败而逃,几千车粮食全部被烧光。
时间一晃,袁、曹两军官渡之战已僵持半年之久。曹操急于速战速决,他绞尽脑汁筹划计谋。突有卫兵来报,从袁军那边跑来一个名叫许攸的官员,说有急事求见。许攸是曹操过去的朋友,曹操像对老朋友一样接待了他。许攸是因为在袁绍那里受了委屈,来投奔曹操的。原来,在袁绍轰走沮授后,许攸向他献计说:“曹军兵少,主力又在官渡与我军相持半年之久了,想必都城许昌一定空虚。请将军派一支轻骑兵,赶往许都,一定会毫不费力地得到许昌。”可袁绍却拍着桌案上的文书,瞪着眼睛,对许攸说:“邮城来报告说你的家属犯了法,已被审配逮捕入狱。你连家属都管不好,怎么还敢在我面前出主意呢?”许攸又气又羞,无意留在袁营,连夜投奔曹操。曹操听完,笑着说:“你来到我这儿,大事已经成功了!”许攸向他一一介绍乌巢的粮情和兵情,而且建议曹操派兵去袭击乌巢。他说:“袁绍派在乌巢看守粮仓的淳于琼是个骄傲自大、喜欢饮酒、警惕性特差的人。只要烧了乌巢的粮草,不出三天,袁军就会不战而乱,您就会结束官渡的相持局面,大获全胜了!”于是曹操就召集谋士们商量袭击乌巢的方案。
经过周密策划后,一天夜里,曹操派曹洪等将军守营,以防袁军前来偷袭。自己和张辽、于禁、徐晃等,精选5000名步骑兵,打上袁军的旗号,悄悄离开了官渡,向乌巢进发。途中碰上袁军哨兵,张辽骗他们说:“我们是蒋奇的人马,是袁将军派来加强乌巢守备的。”而且不等袁军哨军靠近,张辽就走近一步,压低了声音,装出神秘的样子,说:“袁将军听说曹操要来偷袭乌巢,就派我们赶来增援。”袁军哨兵一见旗上斗大的“袁”字,而且因乌巢就在袁军大营之后,怎么也不会有敌人来,便不再怀疑,放他们过去了。黎明以前,曹军抵达了乌巢。而此刻夜夜饮酒的淳于琼睡得正香,袁军还来不及穿衣,曹军就冲了进来。霎时间,粮囤到处起火,浓烟滚滚,直冲云霄,淳于琼也被曹操大将乐进一刀给收拾了,不久战斗就结束了。
乌巢这边火光冲天,不远处的袁营看得真切。大将张郃劝袁绍立即援助淳于琼,同时切断曹军退路,而袁绍在关键时刻一错再错,听信谗言,置乌巢于不顾,让张郃、高览二将前去袭击曹军大营。张郃苦苦劝说:“曹操很会用兵。他既然派精兵去偷袭乌巢,那么官渡的守备也一定不会放松,还是先去援助淳于琼吧!”袁绍仍执迷不悟,张郃、高览只好勉强带兵出发。袁军进攻官渡,遭到曹洪守军的坚决抵抗,背后又受到从乌巢回师官渡的曹军的猛烈攻击。张郃腹背受敌,抵挡不住,加之不满袁绍的虚伪奸诈,就和高览一起投降了曹操。
乌巢粮草被烧,张、高二将投降,袁军果然不战自乱,曹军乘胜全军出击,袁绍还没来得及穿上盔甲,只穿着便服,扎着头巾,带着800名骑兵仓皇逃过了黄河。这些残兵败将们再也无法恢复原来的势力,从此便没有声息了。
这次官渡之战,曹操用极少的兵力战胜了拥兵数十万的袁绍,以弱小的力量战胜了强大的势力。曹军势力大增,乘胜追击,继续向袁绍占领的地区进军,不久就统一了北方,为以后出现三国鼎立的局面奠定了基础。