shell编程小工具 截取工具cut-c按单个字符位置截取字符计数从 1 开始-c按字符抠字数第几个字母echo abc123 | cut -c 3 # 取第3个字符 → c echo abc123 | cut -c 1-3 # 取1~3位 → abc#-c2-从第 2 个字符开始截取到本行末尾 cut -c2- cut.txt-d自定义字段分隔符搭配-f一起使用用来把一行文本切成多列常用分隔:,空格-语法cut -d分隔符号 -f列号-d -f按分隔符切块抠第几块按列取内容-f指定要提取第几列必须配合-d分隔符-f1 第 1 列、-f2 第 2 列、-f1,3 取 1 和 3 列、-f1-3 取 1~3 列# 每行格式root:x:0:0:root:/root:/bin/bash 以:分成7列 cut -d: -f1 /etc/passwd # 效果只输出所有用户名第1列内容实例1提取出当前服务器上所有用户的用户名进行权限管理审查但只需提取/etc/passwd文件中的用户名信息而不需要其他字段cut -d: -f1 /etc/passwd2提取系统日志中的时间信息和用户信息cut -d -f1,3,4,5 /var/log/messages排序工具sort-u uniq去除重复行 -r reverse降序排列默认是升序 -o : 将排序结果输出到文件中,类似重定向符号 -n 以数字排序默认是按字符排序 -------------------------------------------------- -t 分隔符 -k 第N列 -R 随机排序每次运行的结果均不同 一般是用来做 随机抽样调查sort -n -t: -k3 1.txt 按照用户的uid进行升序排列 sort -nr -t: -k3 1.txt 按照用户的uid进行降序排列 sort -n 2.txt 按照数字排序 sort -nu 2.txt 按照数字排序并去重 sort -nr 2.txt 按照数字进行降序排列 sort -nru 2.txt 按照数字进行降序排列并去重 sort -n 2.txt -o 3.txt 按照数字排序并将结果重定向到文件 sort -R 2.txt 随机排序 sort -u 2.txt 去除重复行去除连续的重复行uniq常见选项 -i: 忽略大小写 -c: 在每一行的前面显示该行在文件中出现的次数 统计这一行出现频率频次 数据统计 -d: 只显示重复行 举例说明 uniq 2.txt uniq -d 2.txt uniq -dc 2.txt案例在 CentOS Stream 9 的服务器上运维团队检测到多次失败的登录尝试怀疑存在潜在的恶意入侵。为了提高服务器的安全性运维团队需要快速找到频繁失败登录的IP地址以便采取进一步的安全措施如阻止IP、加强认证机制等1.grep Failed uniq.txt筛选文件里 ** 包含 FailedSSH 密码登录失败** 的所有日志行只拿出爆破失败记录。2.sort -n对筛选后的日志按数字排序把同一个 IP 的日志行排到挨在一起uniq -c只能统计相邻重复行必须先排序。3.uniq -c-c count计数统计相邻重复行出现次数格式次数 日志内容也就是统计同一个 IP 爆破失败多少次。4.sort -nr-n数字排序 -r倒序从大到小按失败次数降序排列爆破最多的 IP 排在最上面。grep Failed uniq.txt | sort -n |uniq -c | sort -nr1、grep Failed uniq.txt筛选日志只保留 **SSH 登录失败Failed 密码爆破** 的日志行。2、cut -d -f14-d 以空格做分隔符拆分每行日志-f14提取第 14 列内容也就是攻击源 IP 地址日志样例拆分May 6 10:58 ... from 192.168.88.1from后面的 IP 正好在第 14 字段。3、sort -nIP 按字符排序相同 IP 行会挨在一起为uniq -c统计做准备。4、uniq -c-c 计数统计每个 IP 出现多少次即该 IP 爆破失败次数grep Failed uniq.txt | cut -d -f14 | sort -n | uniq -c6 192.168.88.1#这个IP尝试爆破6次grep Failed uniq.txt筛选文件只保留 SSH 密码登录失败的日志行。sort -n整行日志按字符排序相同 IP 的日志行聚拢到一起为uniq -c统计做前置准备。uniq -c-c统计重复行数格式次数 完整日志内容统计同一条失败日志出现多少次。sort -nr-n数字排序 -r倒序按爆破失败次数从大→小排序攻击最频繁的日志置顶。grep Failed uniq.txt | sort -n | uniq -c | sort -nr6 May 6 ... from 192.168.88.1 #该IP一共6次SSH爆破失败最多双向覆盖重定向teetee 一份输入两份输出普通重定向命令 文件结果只存文件屏幕看不到普通直接运行命令结果只在屏幕存不下文件tee 两头通一边屏幕打印结果一边把一模一样内容写到文件里就像水管三通进水 1 路出水 2 路这也是名字由来名词原意T 型三通水管接头水管从一头进水T 字形分叉分成两路出水 →正好对应 tee 命令输入一份数据分叉成「屏幕输出 文件写入」两路工具因此得名。两个常用参数tee 文件覆盖写入文件原来文件内容清空再写新的tee -a 文件追加写入新内容拼在文件末尾不删旧内容三个场景人话翻译实时监控记录跑脚本 / 系统命令一边实时看屏幕报错一边自动存日志事后查故障不用重新跑命令长时间任务存日志比如备份数据库耗时几小时屏幕实时看进度全部输出存日志半夜报错第二天翻文件排查管道中间存快照一串命令A|B|C想保存 A 的结果再传给 BA | tee mid.log | BA 输出存 mid.log数据继续进 B 处理。ls -l | tee log.txt① 终端屏幕照常列出文件夹内容② 同时把这份列表自动写到 log.txt 文件里查看并保存系统状态CPU#-n 1top 只刷新采样 1 次就自动退出 #|管道把 top 输出传给后面 tee top -n1 | tee cpu.txt对比不用 teetop -n1 cpu.txt数据只进文件屏幕啥也不显示这就是 tee 的优势比较文件或目录内容的工具diff它逐行比较文件内容并输出文件之间的差异帮助用户识别两个文件在何处不同。diff主要用于文件比较和合并(打补丁)可以生成补丁文件以便在需要时将一个文件的修改应用到另一个文件上。diff [选项] 旧文件 新文件2 c 2左文件行号 修改 (change) 右文件行号第一个 2左边 file1.txt 的第 2 行指file1.txt里被改动的是第 2 行内容port80cchange 修改代表改动类型内容修改a 新增、d 删除、c 修改第二个 2右边 file2.txt 的第 2 行指file2.txt对应修改后的行也是第 2 行内容port8080diff -r dir1 dir2 #选项-r选项代表递归操作(diff -u) 打补丁patch我们现在有旧文件1和新文件2需要给旧文件1打补丁1找出新旧文件的差异diff -u 1 2输出的含义-u全称unified format统一补丁格式① 前两行--- 1减号 旧文件第一个文件文件 1后面是文件 1 的修改时间 2加号 新文件第二个文件文件 2后面是文件 2 的修改时间② -2,3 2,7 -2,3文件 1从第 2 行开始一共 3 行内容20040510、20041018、202606052,7文件 2从第 2 行开始一共 7 行内容含义从第 2 行位置开始文件 1 是 3 行文件 2 扩充到 7 行③ 内容行符号无符号行两个文件完全一模一样的内容20040510/20041018/20260605 开头行新文件 2 比原文件 1 多出来的 4 行内容55555555、99999999、88888888、12345678本案例文件 2 在原有 3 行基础上末尾新增 4 行数据2差异生成一个补丁补丁命名为1_2.patchdiff -u 1 2 1_2.patch3patch命令应用补丁到旧文件1patch 1 1_2.patch逐行合并pastepaste [选项] 文件1 文件2-d delimiter /dɪˈlɪmɪtə(r)/ 分隔符、定界符-s serial /ˈsɪəriəl/ 串行、连成一行#-d 分隔符 paste -d, paste2.txt paste1.txt #-s paste -s paste2.txt paste1.txt字符替换删除trtr 命令translate字符翻译 / 替换工具只处理单个字符不能替换字符串只能接收标准输入管道 | 或 文件# 两种输入写法 echo 内容 | tr xxx tr xxx test.txt常用正则表达式注意:使用的时候 添加上[a-z]字符串含义a-z匹配所有小写字母A-Z匹配所有大写字母0-9匹配所有数字0-9a-zA-Z匹配所有数字与大小写字母#把字符串由小写全部变成大写 echo zhangYUHENG | tr [a-z] [A-Z]#把字符串中的数字全部删掉 echo zhangyuheng123 |tr -d [0-9]#把字符串里的小写字母全部删掉 echo zhangyuheng123 |tr -d [a-z]#把字符串里的空格压缩成一个 echo hello world |tr -s 文件中替换❌ tr不能做中文词语替换中文在 Linux 是多字节编码utf-8 一个汉字占 3 字节tr是单个字符一对一映射替换想要替换中文词的话sed s/妈妈/女神/g tr_test.txt1、sed全称Stream Editor 流式编辑器作用Linux 三剑客逐行读取文件、文本替换 / 删除 / 修改不用打开文件编辑。2、 单引号把中间s/妈妈/女神/g当成完整命令字符串防止 shell 把 /、特殊符号解析错固定写法。3、s → substitute替换s 替换指令固定开头没有 s 就不能做内容替换。标准骨架s/查找内容/替换内容/标记三个/是固定三段分隔符。4、三个斜杠/分隔符定界符三段划分s/【第一段要找的旧文字】/【第二段替换成的新文字】/【第三段控制标记】第一个/紧跟 s隔开 s 和查找内容中间/隔开【旧内容】和【新内容】末尾/隔开【新内容】和后面的 g 标记小知识/可以换成# |比如s#妈妈#女神#g效果一模一样路径含斜杠时常用 #避免冲突。5、妈妈第一段【匹配查找内容】sed 去每行文本里搜寻字符串「妈妈」支持中文、英文、正则。6、女神第二段【替换写入内容】搜到「妈妈」之后把内容改成「女神」。7、g → global全局关键整行全部替换不加 g只替换每行第一个「妈妈」同一行后面剩下的不换加 g一行里所有出现的妈妈全部换成女神全局整行替换8、tr_test.txt最后参数 目标文件名sed 读取这个文件的内容作为处理对象。sed -i s/妈妈/女神/g tr_test.txt-iin-place直接把替换结果写入原文件不再只打印屏幕。直接修改源文件原地保存