袁紹試圖將曹操圍攻于白馬,結果曹操成功地解除了危機。兵敗于白馬的袁紹又親率大軍渡河南進,想一口吞掉曹操。袁紹集團的謀士沮授勸阻說:“現在最好的辦法是駐軍延津,分出一部分兵力進攻官渡,如果全軍貿然南進,萬一失利,就會有全軍覆沒之險。”袁紹剛愎自用,仍然一意孤行,命令文丑為先鋒率部隊向南前行。
曹操得到袁紹南進的消息,帶兵趕到延津南扎營,以逸待勞迎擊袁軍。為了引誘袁軍,曹操命令所有的騎兵卸下馬鞍,放開韁繩,把輜重車輛都雜亂地扔在路上。袁軍看見曹軍的軍用物資扔得滿地都是,爭先恐后地去搶,亂成一團。曹操抓住有利時機,命令將士一起沖殺,趁亂誅殺了袁紹的大將文丑,又俘獲了袁軍不少人馬。
火燒烏巢
袁紹軍隊雖然在白馬、延津兩戰失利,但其在軍事上仍占優勢。
公元200年7月,袁紹集結部隊進攻陽武(屬于現在的原陽),準備再次南下進攻官渡、許都。此時,曹軍的糧草已不多了,袁紹的謀士沮授又建議:“我方兵力雖多,但不及曹軍勇猛,可曹軍的糧食、物資不如我們充分,若速戰對曹軍有利,我們應當用持久戰的辦法消耗對方。”袁紹又一次拒絕聽取謀士的良言,將大部隊扎營于官渡前線,與曹軍針鋒相對。
當年10月,袁紹派大將淳于瓊帶1萬人馬從鄴城(即現在的安陽)不斷將軍糧運到烏巢(即現在的延津東南)囤積起來。謀士沮授建議另派一支部隊駐扎在囤糧守軍外側,成犄角之勢,以防曹軍偷襲,袁紹不聽。袁紹的另一謀士許攸又獻計說:“曹軍集結官渡,后方空虛,可派輕騎偷襲許都,使曹軍首尾不能相顧,進而取勝。”袁紹不屑一顧地說:“不必,我一定要在此擒獲曹操。”許攸覺得袁紹輕敵必然失敗,正在此時,許攸家族有人犯法,被袁軍關押起來。許攸一怒之下,星夜投奔曹操去了。
曹操聽說許攸來投,高興得連鞋子都來不及穿,光著腳跑出去迎接,連連說:“我的大事可以成功了!”許攸見曹操禮賢下士,待自己為上賓,就把袁紹囤積軍糧于烏巢的軍情透露給了曹操,并建議曹操偷襲烏巢軍糧。
曹軍當時軍糧已不多了,曹操正在想出奇制勝之策,許攸的計策正中下懷。10月的一天夜晚,曹操留下曹洪等人防守官渡大營,親率騎兵5000人,打著袁軍旗號,從小路直奔烏巢。途中遭遇袁軍,袁軍見裝束是自己人,就輕易地放走了曹軍。曹操順利地到達目的地,團團圍住糧囤放起火來。黑夜中濃煙四起,火光沖天,袁軍亂作一團。烏巢守將淳于瓊慌忙迎戰,被曹軍殺了。
守在官渡的袁軍聽到烏巢起火,都無心戀戰,大將張郃、高覽帶兵投降了曹操。袁紹和他的兒子袁譚來不及穿戴齊整,帶著剩下的800多騎兵向北逃去。
官渡一戰,經過一年多的對峙,最終以曹操的全面勝利而告終,袁紹主力被消滅。