曹操早就想要去迎接天子,有些将领认为这样做没有什么好处,但是荀彧、程昱二人却劝曹操迎天子。迎接天子也是曹操善于权术的表现,虽然此时汉家天子已经有名无实了,但是天子的旗号还是很有号召力的,最起码这样能让很多做法都变得名正言顺,而不会被人横加指责。曹操正是看到了这样的好处,所以下定决心去迎接汉献帝。曹操派遣扬武中郎将曹洪带兵西上,去迎接走投无路的汉献帝。卫将军董承和袁术的部将苌奴二人,带兵在险要之地拦阻曹洪。曹洪的军队受挫,没能继续前进。
汝南、颍川两地的黄巾军首领何仪、刘辟、黄邵、何曼等人,各有部众数万人,先是响应袁术,后又依附于孙坚。二月,曹操领兵讨伐,大破黄巾军,斩了刘辟、黄邵等,何仪和他的兵众也都投降了。天子拜曹操为建德将军。夏六月,曹操又升迁为镇东将军,封为费亭侯。秋七月,杨奉、韩暹,随汉献帝回到了洛阳。杨奉在梁县驻兵。八月,曹操受到董承的秘密邀请,回到了已经阔别七年的洛阳,拱卫京都,而将负责保卫京师的韩暹赶出了洛阳。献帝赐曹操节钺,录尚书事。洛阳经董卓之乱和李催、郭汜之乱,已经变得残破不堪了,董昭等人劝曹操迁都许昌。九月,曹操护着献帝的车驾出辕向东行。献帝以曹操为大将军,封武平侯。自从献帝西迁长安,朝廷一切礼仪制度已非常混乱,至此,朝廷的宗庙社稷制度,才算又恢复起来。
这次献帝的东行,杨奉想在梁地拦截车驾,但没能赶上时机。冬十月,曹操率兵征讨杨奉,杨奉不敌曹操,向南投奔了袁术。曹操于是攻占了梁屯。献帝封袁绍为太尉。袁绍不能接受自己屈于曹操之下,不肯接受该官职。曹操在汉献帝面前执意辞掉大将军一职,把大将军的名号让给袁绍。献帝拜曹操为司空,车骑将军。这一年,曹操采用枣祗、韩浩等人的建议,开始实行屯田。
吕布袭击刘备,取得下邳。刘备来投奔曹操。程昱劝曹操说:“刘备是个有雄心的人,又很得民众拥戴,一定不会甘心居于人下,不如趁早把他除掉。”曹操说:“目前正是收服人心的时候,杀一个人而失掉天下的人心,是非常不值得的!”
张济从关中走到南阳。张济死后,由从子张绣率领他的士众。建安二年(197年),春正月,曹操领兵到达宛城。张绣投降。后来张绣又后悔了,再次反叛曹操。曹操与张绣战斗,曹操兵败,被乱箭射中。曹操的长子曹昂、侄子曹安民,都在这一场战斗中遇害。曹操不得不带兵退回到舞阴(今河南沁阳西北)。张绣亲自统率他的骑兵尾随而至,这次曹操打败了张绣,并乘胜反击,攻占了南阳、章陵等地。张绣逃到穰县后,很快和荆州牧刘表结为攻守同盟。曹操对部将说:“我收降张绣等人,错在没有取得他们的人质和抵押物,所以才会出现现在的这种状况。请各位相信我,从今以后,我不会再失败了。”于是带兵回到许昌。曹操的智谋也是在一次次失败的教训中慢慢积累而成的。
袁术要想在淮南称帝,派使者通告吕布,想得到吕布的支持。吕布却不买账,收押袁术的使者,并将袁术的书信和使者送到了许昌。袁术十分恼火,派兵攻打吕布,却被吕布打败了。秋九月,袁术入侵陈州。曹操率兵东征袁术。袁术知道是曹操亲自领兵,便弃军逃跑,只留下部将桥蕤、李丰、梁纲、乐就等坚守阵地。曹操一到,就打败桥蕤等,斩杀了四将。袁术逃走,渡过淮水。曹操班师回到许昌。
曹操从舞阴回许昌后,南阳、章陵各县又背叛了曹操而归附了张绣。曹操派遣曹洪去平定这两县,没有能够取胜,于是驻兵于叶县,多次遭到张绣、刘表的侵扰。冬十一月,曹操亲自南征,到达宛城。刘表的部将邓济,占据湖阳。曹操发动进攻,生擒了邓济。又进攻舞阴,获得了胜利。
建安三年(198年),春正月,曹操领兵回许昌,开始设置军师祭酒这一职位。三月,曹操领兵包围张绣所据守的穰县(今河南邓县境)。夏五月,刘表派军队救援张绣。刘表的增援部队在安众(今河南镇平县东南)据险守要,切断曹军的后路。形势对曹操相当的不利,曹操便打算率军撤退。张绣领兵前来追击,曹军因为有刘军拦截,不能前进,连营而缓进,慢慢向前。曹操给荀彧书信,叙述了当时的情况:“贼来追我,我虽每日只能行数里,但据我的计算,到了安众,一定可以击破张绣。”曹操的军队到达安众,张绣和刘表两军联合,坚守险要,曹军前后受敌。曹操夜里在险要之处下方凿出了一条地道,将辎重粮食全部运过,并设置奇兵。天将明,张绣、刘表军以为曹军已经过了安众,十分焦急,便率全军来追。曹操于是突出奇兵,步骑两军,夹攻敌人,敌兵大败。秋七月,曹操终于回到许昌。荀彧问:“前次推测,一定能打败张绣,有什么道理吗?”曹操回答说:“张绣的部众阻挡我撤还的军队,而与我决一死战,我就知道这次肯定是要胜利了。”曹操是很明白“置之死地而后生”这一兵法常识的。
吕布因为袁术的请求,派部将高顺进攻刘备。曹操便派遣夏侯惇领兵去救刘备,但是夏侯惇出师不利。刘备被高顺击败。九月,曹操东征吕布。冬十月,曹军攻破彭城,掳获了彭城相侯谐。曹操进军下邳,吕布亲自率骑兵迎击。曹军大败吕布军,掳获吕布的勇将成廉。曹军一直追到城下。吕布恐惧,想要投降,在陈宫等人的一再劝说才放弃这一念头,于是向袁术求救。陈宫还劝吕布出城迎战。吕布出战又被打败,不得不回兵固守下邳。曹兵屡次进攻,都无法攻克。此时的曹兵连连作战,士兵们都很疲劳,曹操便想要撤军。曹操使用荀攸和郭嘉的计谋,决开了泗水和沂水,灌下邳城。曹军围困了下邳一个多月,吕布的部将宋宪、魏续等绑着陈宫出城投降。曹操生擒了吕布、陈宫,后来都被曹操处死。太山臧霸、孙观、吴敦、尹礼、昌豨,手下各有一些军队。吕布打败刘备后,臧霸等人都服从吕布。吕布失败后,曹操俘虏了臧霸等人,但是对待臧霸等人却很宽厚:割青州、徐州,委派臧霸等人据守;分琅玡、东海、北海为城阳、利城、昌虑三郡。
曹操担任兖州牧的时候,东平人毕谌为别驾。张邈叛乱时,曾经劫持毕谌的母亲、弟弟和妻子;曹操解除了毕谌的职务,叫毕谌去张邈那里,曹操说:“你的老母亲在那里。你可以去。”毕谌当时叩首表示无二心。曹操对毕谌大加赞赏,毕谌感动得痛哭流涕。但毕谌辞职之后,竟然归附了张邈。后来吕布事败,毕谌被曹操生擒,大家都为毕谌捏了一把汗。但曹操说:“一个能孝敬他的双亲的人,岂不是一定也忠于君主吗?这正是我所需要的人。”曹操依旧以毕谌为相。这是曹操能够不计前嫌,任用人才的表现,当然这也是他笼络人心的一种手段。
建安四年(199年),春二月,曹操回到了昌邑。张杨的部将杨丑,杀了张杨,眭固又杀了杨丑,带着张杨的人马归附了袁绍,驻兵在射犬(今泌阳县东北)。夏四月,曹操进军到达黄河岸边,派史涣、曹仁领兵渡过黄河进攻眭固。眭固派张杨的旧长史薛洪、河内太守缪尚留守射犬,自己领兵北上向袁绍求救。眭固在途中与史涣、曹仁在犬城相遇,双方交战。史涣、曹仁大败眭固,眭固被斩。曹操渡过黄河,出兵包围射犬。薛洪、缪尚二人率部众投降。曹操封二人为列侯,回军敖仓。曹操任命魏种为河内太守,负责河北全部的政事。在早些时候,曹操曾推举魏种为孝廉。兖州叛乱时,曹操说:“只有魏种不会背弃我。”后来听说魏种逃走了,曹操发怒说:“魏种不可能向南方的越地逃亡,也不能向北方的胡地逃亡,他一定逃不出我的手掌心,等我抓到他,一定不会饶了他!”等到攻下射犬之后,曹军生擒了魏种。此时,曹操却说:“魏种的才能是可以为我所用的。”说罢,解开捆绑魏种的绳子,任命为他河内太守。曹操这种大度用人的气量不是所有人都具备的。