此时的袁绍已经吞并了公孙瓒一部,拥有四个州的地盘,兵众达到了十余万人,便想要进军攻击许昌。曹操部下将领都认为袁绍兵力强大,最好不要与之抗衡。曹操说:“我知道袁绍的为人,志向很远大但是缺少智谋,外表看起来很严厉但是胆量却很小,猜忌心重,嫉贤妒能而缺少威信,兵虽然多而不能清楚分划组织加以指挥;部将都很骄傲、自以为是,政令不能统一;土地再广大,粮食再丰富,也不过送给我们的礼物!”秋八月,曹操进军黎阳,派臧霸等领兵进入青州,击破齐、北海、东安,留下于禁驻兵河上。九月,曹操回到许昌,分散兵力驻守官渡(今河南省中牟县东北地傍官渡水得名)。冬十一月,张绣带领部众前来投降,曹操封张绣为列侯。十二月,曹军驻守官渡。
袁术自从在陈战败之后,就意识到了自己的困窘处境。袁谭从青州派人迎接袁术。袁术的军队想要从下邳的北方通过,曹操派遣刘备、朱灵二人拦截袁术。正值此时,袁术病死。程昱、郭嘉听说曹操派遣刘备去拦截袁术,对曹操说:“万不可以放刘备走!”曹操自己也后悔了,想去派人追赶,但是已经来不及了。刘备在没有得到机会东走以前,曾经与董承等合谋除去曹操。刘备到了下邳,杀了徐州刺史车胄,驻兵沛县。曹操派遣刘岱、王忠二人攻击刘备,却没有能够战胜刘备。
庐江太守刘勋带领部众前来投降,曹操封他为列侯。
建安五年(200年),春正月,董承等人刺杀曹操的密谋泄露,所有参与者都被曹操杀了。曹操想要亲自东征刘备,手下部将都说:“与主公争夺天下的人,是袁绍。现在袁绍正要从南面来,但是主公却弃袁绍不顾,而东征刘备。如果袁绍乘我营中空虚,从背后进攻,那我们应该如何应付呢?”曹操说:“刘备是人中豪杰,此时如果不打败他,日后他肯定是一大隐患;袁绍虽有大志向,但做事迟钝,一定会按兵不动。”郭嘉也劝曹操先攻刘备,于是曹操向东出兵,进击刘备。曹操大败刘备,刘备逃走投奔袁绍,曹操俘虏了刘备的妻子。刘备部将关羽驻兵下邳,曹操又进攻下邳。关羽兵败,投降。昌豨背叛曹操跟随刘备,曹操又打败了昌豨。曹操回官渡,正如曹操所料,袁绍果然没有出兵。曹操的智谋在于,能够深刻分析敌军主帅的性格特点,进而猜测出对手的下一步的行动。从现代心理学的角度看,这样的分析是很有道理的。
二月,袁绍派遣部将郭图、淳于琼、颜良,在白马进攻东郡太守刘延。袁绍亲自领兵到黎阳,打算渡过黄河。夏四月,曹操亲自领兵北上去救援刘延。荀攸劝曹操说:“如今我方的兵力少,不能与袁绍抗衡,只有分散敌军的势力,我们才可以与之一战。主公可以先到延津,伪装成要渡过黄河,用兵进攻袁绍背后的样子。袁绍见到这种情况,一定会带兵向西,来应对这种局势。这样我军就可以用轻装部队突袭白马,乘其不备,必能一举生擒颜良。”曹操听从了荀攸的计谋,按照计划行事。袁绍听说曹兵将要渡河,当即分兵向西应战。曹操于是引兵快速向白马行进。直到曹军到达距离白马十余里地方的时候,颜良才听到探报,大为震惊,急忙领兵前来迎战。曹操派遣张辽、关羽为先锋,打败了颜良一部,关羽斩了颜良。解了白马之围后,曹操迁徙当地的百姓,沿着黄河而向西前进。袁绍渡过黄河追击曹军,到达延津南部。曹操停止行军,在南阪的下方安营扎寨,派人登上高处监视袁军的行踪。探报说:“大约有五六百骑兵过来了。”过一段时间,又报:“骑兵已经很多了,步兵更是不计其数。”曹操说:“不要再报了!”当即曹操部下将领认为敌方的骑兵数量众多,我方不如弃掉辎重,退保营垒。荀攸说:“这些辎重,正是我们引诱敌人就范的钓饵,怎么能舍弃掉呢?”此时袁绍的骑将文丑与刘备分别率领五六千骑兵前后杀来。曹操部将向曹操报信,说:“现在可以上马迎战了。”曹操说:“还不可以。”过了些时候,来犯的敌骑渐渐增多了,其中有些敌兵分别奔向辎重粮草。曹操下令说:“可以上马了!”于是众将上马迎战,曹操纵兵迎敌,大败敌兵,斩了文丑。颜良和文丑原本都是袁绍的名将,于是曹军再向前攻击,把来将都给生擒了,袁绍的军队受到重创,大为震恐。曹操回兵官渡。袁绍进驻河南尹境内的阳武(今河南阳武县古博浪亭),与据守官渡的曹军南北对峙。关羽不辞而别,归附刘备去了。
八月,袁绍连营稍向前进,依靠沙堆作为驻兵之处,东西连营数十里。曹操也分地作营垒,与袁军相对。两军对战,对曹军不利。当时曹兵不满万人,且受伤者又有十分之二三。袁绍兵临官渡,堆起土山,命令士兵依高向曹操营中射箭,箭如雨下。曹军士兵不得不手持盾牌抵挡乱箭,才能在营中走动,曹军士兵对此都感到恐惧。袁绍还命令士兵挖掘了若干条直通曹营的地道,偷袭曹营。曹军则针锋相对,在营内开掘壕沟,截断袁军地道。此时曹营中粮草已告急,曹操写信给荀彧,商量是否应退军许昌。荀彧回信认为:“袁绍征发他的全部军队,集聚在官渡,就要想和主公你一决胜负。主公用居于弱势的军队,抵挡强悍之兵,如果不能制伏袁绍,就必定反被袁绍所制伏。目前情形,是天下大势转变的重大机运,是成败胜负的重要关键。袁绍,不过平常人中的英雄而已,能聚敛人才却不能知人善用。主公你英明神武,做什么事都能马到成功,为何不坚持到底呢?”曹操听从了荀彧的建议,放弃了退兵的念头。曹操权谋的最主要体现就是他善于用人,善于听从谋士的正确建议。
孙策听说曹操与袁绍相持不下,于是想乘机袭击许昌。但是还没来得及行动,就被刺客杀了。
原汝南黄巾军头目刘辟等人(他们在建安元年二月就投降了曹操),眼见曹军情势危急,就背叛了曹操,转投了袁绍,在许昌附近骚扰抢掠。袁绍派刘备领兵协助刘辟。曹操派曹仁领兵迎击刘辟,刘辟兵败,刘备则逃走了,刘辟所聚集的兵力也就被消灭了。
袁绍押运运载粮食的车数千辆,前往官渡的袁营。曹操使用荀攸的计谋,派遣徐晃、史涣在路上拦击车队。徐晃、史涣大败袁军,将粮车全部烧毁。曹操与袁绍在官渡相拒了两月,虽然每次小规模的战斗都能获胜,并能斩获袁绍的部将,但是曹军兵少而且军粮不足,士兵们已经相当疲劳了。曹操对运粮者说:“再过十五天,我一定击败袁绍给你看,不会再劳累你们运输军粮了。”冬十月,袁绍又派遣车辆运送粮食,并派淳于琼等五人领兵一万余人,护送粮车。淳于琼等驻守在距袁绍营北四十里的乌巢。袁绍的谋臣许攸来投奔曹操,曹操听说许攸前来,连鞋都来不及穿,便从营帐中跑出来迎接许攸,这就是“赤脚迎许攸”的典故。许攸的到来确实对曹操的帮助很大,因为他非常了解袁绍军队的具体情况。曹操这一出“赤脚大戏”收到了应有的效果,许攸劝曹操出兵攻击淳于琼等,占领乌巢。曹操的部将都很怀疑许攸,只有荀攸和贾诩力劝曹操出击。曹操于是便留下曹洪守营,自己率领骑兵和步兵一共五千人,连夜行军袭击淳于琼,天亮之前就到了淳于琼的营地。淳于琼见曹操的兵马并不充裕,便在营门外面布阵出兵迎击。曹操命令士兵快速进攻,淳于琼退守营地,曹兵又是一阵猛攻。袁绍得到了消息,急忙派骑兵去救援淳于琼。曹操的手下有人说:“敌人援兵慢慢接近了,请分散兵力进行抵抗。”曹操怒道:“等袁军到我背后再来报告我!”于是士兵们都拼命作战,大败淳于琼,杀了淳于琼和他的部将。袁绍在刚听到曹操攻击淳于琼的情报时,曾对他的长子袁谭说:“曹操攻淳于琼的时候,我们正好攻取他的大营,他就没有可归之处了。”于是便派张郃、高览领兵进攻曹洪。张郃等人行至中途,听说淳于琼已经被打败了,便归降了曹操。袁军于是遭遇大溃败,袁绍和袁谭放弃了军队,渡过黄河逃走了。曹操没有能够追上袁绍,却获得了袁军的全部辎重粮草、图书珍宝,俘虏了数万袁军。曹操在缴获的袁绍书信中,发现有许昌和自己军中的人暗中和袁绍接洽投降事宜的信件,有人建议曹操严加追查,将那些三心二意的家伙收而杀之,但曹操却说:“当袁绍大兵压境之时,连他本人都觉得前途渺茫,更何况他人呢!”于是,下令将所有通敌信件付之一炬,不予追究。冀州的各个郡,多以城邑投降。
桓帝的时候,曾在楚、宋之分的方位发现黄星。辽东人殷馗通识天文,说以后五十年间会有英雄兴起于梁、沛之间,其锋芒锐不可当。由那时算起,到当时已经五十年,曹操打败袁绍以后,便天下无敌了。
曹操在官渡之战中展现了他杰出的军事谋略以及对整个战争的全局之观。当然,知人善任也是他取得胜利的法宝,在这一方面,袁绍就差了很多。在杰出的用人谋略和军事谋略方面,曹操远胜于袁绍,难怪曹操会取得最终的胜利。