曹操又继续进攻关羽,关羽投降。昌豨背叛曹操响应刘备,曹操又将其击败。曹操回到官渡,袁绍最终也没有出兵。二月,袁绍派遣郭图、淳于琼、颜良到白马攻打东郡太守刘延,袁绍自己领兵到黎阳,准备渡过黄河。夏季四月,曹操向北救援刘延。荀攸劝说曹操道:“如今我方兵力较少,难以与袁绍抗衡,必须分散他的兵力才行。您先到延津,做出好像要渡河袭击袁绍后方的样子,袁绍一定会向西应战,然后您率领轻装部队迅速袭击白马,趁其不备发动攻击,就可以擒获颜良。”曹操听从了他的建议。袁绍听说曹军要渡河,立刻分兵向西应战。曹操于是率领军队日夜兼程直奔白马,距离白马还有十多里时,颜良才大为吃惊,赶忙前来迎战。曹操派张辽、关羽为先锋出击,击败袁军,斩杀了颜良。于是解除了白马之围,迁徙当地百姓,沿着黄河向西转移。袁绍这时渡过黄河追击。袁绍追击曹操的军队,追到延津以南。曹操部署军队在南面的山坡下安营扎寨,派人登上营垒瞭望袁军,瞭望的人报告说:“大约有五六百骑兵。”过了一会儿,又报告说:“骑兵逐渐增多,步兵多得数不过来。”曹操说:“不用再报告了。”于是下令骑兵解下马鞍,放开马匹。这时,从白马缴获的辎重物资正被运上道路。将领们都认为敌人骑兵众多,不如返回坚守营垒。荀攸说:“这正是用来引诱敌人的办法,怎么能撤走呢!”袁绍的骑兵将领文丑与刘备率领五六千骑兵先后赶到。将领们又说:“可以上马迎战了。”曹操说:“还不行。”又过了一会儿,袁军骑兵越来越多,有的分散开来去抢夺辎重。曹操说:“可以出击了。”于是全体骑兵上马。当时曹操的骑兵不到六百,便挥军出击,大败袁军,斩杀了文丑。颜良、文丑都是袁绍的名将,两次交战,都被斩杀,袁绍的军队大为震动。曹操回师。曹操回军官渡,袁绍进军守卫阳武。关羽逃离曹营回到刘备身边。八月,袁绍将营垒相连逐步向前推进,依靠沙堆扎营,东西绵延数十里。曹操也分别扎营与袁绍军相对抗,交战失利。当时曹操的兵力不足一万,受伤的士兵有十分之二三。袁绍又向前逼近官渡,堆起土山、挖掘地道。曹操也在营内采取相应的办法来应对,堆土山、挖地道。袁绍向曹营射箭,箭如雨下,在营中行走的人都要蒙着盾牌,众人十分恐惧。当时曹操军中粮食短缺,他给荀彧写信,商议想要撤回许昌。荀彧认为袁绍把全部兵力聚集在官渡,想要和曹操一决胜负。曹操以极弱的兵力对抗极强的对手,如果不能制服对方,必然会被对方抓住机会,这是决定天下局势的关键时机。况且袁绍不过是个平庸的首领罢了,他能聚集人才却不能合理任用。凭借您的非凡勇武、英明睿智,再加上以顺讨逆的大义名分,无论向哪里进军,哪有不成功的道理。曹操听从了荀彧的建议。孙策听说曹操与袁绍相持不下,就谋划袭击许昌,还没等行动,就被刺客杀死。汝南投降的贼寇刘辟等人背叛曹操响应袁绍,在许昌周边抢掠。袁绍派刘备去援助刘辟,曹操派曹仁击败了他们。刘备逃走,曹军顺势攻破了刘辟的营寨。袁绍的几千辆运粮车抵达前线,曹操采用荀攸的计策,派遣徐晃、史涣半路截击,大败护送部队,将运粮车全部烧毁。曹操和袁绍相持了好几个月,虽然接连交战斩杀了对方将领,但自己兵力少且粮食耗尽,士兵们疲惫不堪。曹操对运粮的人说:“再过十五天我为你们击败袁绍,就不用再辛苦你们了。”冬季十月,袁绍派遣车辆运送粮食,让淳于琼等五人率领一万多士兵护送。运粮车队在袁绍大营以北四十里的地方宿营。袁绍的谋臣许攸贪财,袁绍不能满足他的贪欲,许攸便前来投奔曹操,并劝说曹操去袭击淳于琼等人。曹操身边的人都怀疑许攸的建议,荀攸、贾诩则鼓励曹操采纳。于是曹操留下曹洪守卫大营,亲自率领步兵和骑兵五千人趁夜前往,刚好天亮时到达。淳于琼等人看见曹操兵力不多,就在营门外摆开阵势。曹操下令迅猛进攻,淳于琼退回营内坚守,曹军便开始攻打营寨。袁绍派遣骑兵救援淳于琼。曹操身边有人说:“敌人的骑兵逐渐逼近了,请分兵抵抗。”曹操大怒道:“等敌人到了背后,再报告!”士兵们都拼死作战,大败淳于琼等人,把他们全部斩杀。袁绍刚听到曹操去攻打淳于琼的消息时,对长子袁谭说:“就算他去攻打淳于琼等人,我去攻占他的大营,他就无处可归了!”于是派张郃、高览去攻打曹洪。张郃等人听说淳于琼被打败,就前来投降。袁绍的军队全面溃败。