次年二月,袁紹派遣郭圖、淳於瓊、顏良在白馬攻打東郡太守劉延,袁紹領兵到了黎陽,準備渡過黃河。夏季四月,曹操往北救援劉延,荀攸勸說曹操道:“如今我們兵力少不能抵擋,分散敵人的兵力才可以取勝。您到了延津,裝作準備渡過黃河向他們的後方進軍,袁紹必定往西迎戰您,然後派輕裝部隊襲擊白馬,趁他們沒有防備,就可以捉住顏良了。”曹操聽從了荀攸的計策。袁紹聽說曹軍渡過黃河,立即分出兵力往西迎戰曹軍。曹操就率領軍隊急行,直奔白馬,離白馬尚有十多裏.顏良大驚,前來迎戰。曹操派張遼、關羽做先鋒,先打敗了敵人,斬了顏良,終於解除了白馬之圍,遷徙白馬的百姓,循著黃河朝西走。袁紹在這時渡過黃河追擊曹操的部隊。追到延津的南麵,曹操指揮軍隊在西麵山坡下紮營,派人登上營壘望敵軍,報告說:“大約有五六百騎兵。”過了一會兒,又報告:“騎兵逐漸增多,步兵多得數不過來。”曹操說:“不用再報告了。”就下令讓騎兵禦下馬鞍放開馬匹。這時,白馬駐軍的輜(zī)重已經上路。各將領認為敵軍的騎兵多,不如回去守衛軍營。荀攸道:“這是用來引誘敵人上鉤的,為什麼要離開這兒呢?”袁紹的騎兵將領文醜和劉備帶領五六千騎兵先後來到。各將領又說:“可以上馬了。”曹操說:“可以了。”於是大家都上馬,當時騎兵不足六百人,就揮軍出擊,大敗敵軍,斬了文醜。顏良、文醜都是袁紹的有名將領,兩次交戰,都被擒殺,袁紹的軍隊大為震動,曹操回軍官渡。袁紹進軍保衛陽武。關羽逃回劉備那兒。

八月,袁紹連接營壘逐漸向前推進,靠著沙丘駐紮,從東到西連綿數十裏。曹操也分紮營壘跟敵方對抗,交戰不利。當時曹操兵力不足一萬人,傷員占十分二三。袁紹軍隊前進到官渡,堆土山挖地道。曹操也在營內堆土山挖地道,跟敵軍對抗。袁紹軍射箭入曹軍營中,箭下如雨,走動的都要用盾牌遮擋,大家非常害怕。這時曹操糧食少,給荀彧寫信,商議打算撤回許都。荀彧回信說:“袁紹全部人馬聚集在官渡,準備跟您決一勝負。您以最弱小的兵力對抗最強大的敵軍,如果不能製服他,必定被敵軍所追逐,這是天下的重大轉機啊。況且袁紹隻是一個一般的豪雄罷了,能夠聚集人才卻不能使用人才。憑借您的神武英明並且加上以天子之命討伐叛亂的正當名義,有什麼事而不能做成功呢?”曹公聽從了荀彧的意見。

袁紹數千輛運送穀物的車子到達,曹操采用荀攸的計策,派徐晃、史渙去截擊,大敗袁軍,全部燒毀了袁紹的運糧車。曹操跟袁紹相持了幾個月,雖然每次交戰都斬殺敵將,但是兵少糧盡,士兵疲乏。曹操對運糧的人說道:“再過十五天替你們打敗袁紹,不再讓你們勞苦了。”冬季十月,袁紹派車運糧,令淳於瓊等五個人帶領一萬多士兵護送車隊,露宿在袁紹軍營北麵四十裏的地方。袁紹的謀臣許攸貪婪無度,袁紹不能滿足他,就前來投奔曹操,借機勸說曹操攻打淳於瓊等人。曹操身邊的人懷疑他。荀攸、賈詡勸說曹操采納。曹操於是留下曹洪防守,自己帶領五千步兵和騎兵乘夜前往,恰在天亮時到達。淳於瓊等人望見曹操兵少,出去到營門外布陣。曹操急速攻擊淳於瓊,淳於瓊退守營房,於是就攻打淳於瓊的營房。袁紹派騎兵援救淳於瓊。曹操身邊的人有的說:“敵人的騎兵逐漸接近,請求分兵抵抗他們。”曹操發怒說:“敵人到背後才報告!”士兵都拚死作戰,大敗淳於瓊等人,把他們全斬了。袁紹剛聽到曹操攻打淳於瓊時,對大兒子袁譚說道:“趁他攻打淳於瓊等人,我去攻占他的軍營,他就沒有地方落腳了!”於是派張郃(hé)、高覽攻打曹洪。張郃等人聽到淳於瓊敗亡,就前來投降。袁紹軍隊大潰敗,袁紹和袁譚扔下軍隊逃跑,渡過了黃河。曹軍追趕上他們,全部繳獲了他們的輜重、圖表文書和珍寶,俘虜了他們的部眾。曹操繳獲袁紹的信件中,有許都和曹軍中的人和袁紹來往信件,曹操把它們全部燒掉了。冀州各郡很多城邑都自動投降了。

六年夏季四月,曹操在黃河邊檢閱軍隊,攻擊袁紹在倉亭的軍隊,把它打敗。袁紹回來,又收攏被打散的士兵,平定了各反叛的郡縣。九月,曹操回到許都。

袁紹自從軍隊被打敗之後,發病吐血,在夏季五月死去。小兒子袁尚接替他的官職,袁譚自稱車騎將軍,駐紮在黎陽。秋季九月,曹操征討他們,連續交戰,袁譚、袁尚屢次戰敗退卻,堅守黎陽。

遠證烏桓

三郡烏桓趁天下的動亂,攻下幽州,掠取漢民合計十餘萬戶。袁紹把他們的首領都立為單於,把族人的女孩子作為自己的女兒,嫁給他們做妻子。遼西單於蹋頓尤為強大,被袁紹所看重,所以袁尚兄弟投奔他,頻繁入塞造成災難,曹操準備征討他們。

十二年春季二月,曹操從淳於返回鄴城。丁酉日,下令道:“我發動義軍鏟平暴亂,到現在有十九年了,所征討的必定戰勝,難道是我個人的功勞嗎?這是有才能的士大夫們的力量啊。天下雖然尚未完全安定,我應當和有才能的士大夫們一起平定它。可是獨自享有那些功勞,我怎麼能夠心安理得心安理得:自認為事倩做得合乎情理,心中坦然無憾。呢?要趕緊評定功績、實行封賞。”於是廣泛地封賞二十多位功臣,都封為列侯,其餘的人各按功勞大小受封,並且免除死難者的子孫的徭役,封賞或輕或重各有差別。