当前位置: 首页 > news >正文

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/passwd

2,提取系统日志中的时间信息和用户信息

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

筛选文件里 ** 包含 Failed(SSH 密码登录失败)** 的所有日志行,只拿出爆破失败记录。

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 -nr

1、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 -n

IP 按字符排序,相同 IP 行会挨在一起,为uniq -c统计做准备。

4、uniq -c

-c= 计数,统计每个 IP 出现多少次(即该 IP 爆破失败次数)

grep 'Failed' uniq.txt | cut -d " " -f14 | sort -n | uniq -c

6 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 -nr

6 May 6 ... from 192.168.88.1 #该IP一共6次SSH爆破失败(最多)

双向覆盖重定向tee

tee = 一份输入,两份输出普通重定向命令 > 文件:结果只存文件,屏幕看不到;普通直接运行命令:结果只在屏幕,存不下文件;

tee 两头通:一边屏幕打印结果,一边把一模一样内容写到文件里,就像水管三通(进水 1 路,出水 2 路),这也是名字由来

名词原意:T 型三通水管接头水管从一头进水,T 字形分叉分成两路出水 →正好对应 tee 命令:输入一份数据,分叉成「屏幕输出 + 文件写入」两路,工具因此得名。

两个常用参数

  • tee 文件覆盖写入文件(原来文件内容清空再写新的)
  • tee -a 文件追加写入(新内容拼在文件末尾,不删旧内容)

三个场景人话翻译

  1. 实时监控记录:跑脚本 / 系统命令,一边实时看屏幕报错,一边自动存日志,事后查故障不用重新跑命令;
  2. 长时间任务存日志:比如备份数据库耗时几小时,屏幕实时看进度,全部输出存日志,半夜报错第二天翻文件排查;
  3. 管道中间存快照:一串命令A|B|C,想保存 A 的结果再传给 B:A | tee mid.log | B,A 输出存 mid.log,数据继续进 B 处理。
ls -l | tee log.txt
  • ① 终端屏幕照常列出文件夹内容
  • ② 同时把这份列表自动写到 log.txt 文件里

查看并保存系统状态(CPU)

#-n 1:top 只刷新采样 1 次就自动退出 #|管道:把 top 输出传给后面 tee top -n1 | tee cpu.txt

对比不用 tee

top -n1 > cpu.txt:数据只进文件,屏幕啥也不显示,这就是 tee 的优势

比较文件或目录内容的工具diff

它逐行比较文件内容,并输出文件之间的差异,帮助用户识别两个文件在何处不同。diff主要用于文件比较和合并(打补丁),可以生成补丁文件,以便在需要时将一个文件的修改应用到另一个文件上。

diff [选项] 旧文件 新文件

2 c 2=左文件行号 + 修改 (change) + 右文件行号

  1. 第一个 2:左边 file1.txt 的第 2 行指:file1.txt里被改动的是第 2 行,内容port=80
  2. c:change = 修改代表改动类型:内容修改(a = 新增、d = 删除、c = 修改)
  3. 第二个 2:右边 file2.txt 的第 2 行指:file2.txt对应修改后的行也是第 2 行,内容port=8080
diff -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、20260605
  • +2,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.patch

diff -u 1 2 > 1_2.patch

3,patch命令应用补丁到旧文件1

patch 1 < 1_2.patch

逐行合并paste

paste [选项] 文件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

字符替换删除tr

tr 命令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.txt

1、sed

全称:Stream Editor 流式编辑器作用:Linux 三剑客,逐行读取文件、文本替换 / 删除 / 修改,不用打开文件编辑。

2、' 单引号

把中间s/妈妈/女神/g当成完整命令字符串,防止 shell 把 /、特殊符号解析错,固定写法。

3、s → substitute(替换)

s= 替换指令,固定开头,没有 s 就不能做内容替换

标准骨架:s/查找内容/替换内容/标记,三个/是固定三段分隔符。

4、三个斜杠/分隔符(定界符)

三段划分:s/【第一段:要找的旧文字】/【第二段:替换成的新文字】/【第三段:控制标记】

  1. 第一个/:紧跟 s,隔开 s 和查找内容

  2. 中间/:隔开【旧内容】和【新内容】

  3. 末尾/:隔开【新内容】和后面的 g 标记

小知识:/可以换成# @ |,比如s#妈妈#女神#g效果一模一样,路径含斜杠时常用 #避免冲突。

5、妈妈:第一段【匹配查找内容】

sed 去每行文本里搜寻字符串「妈妈」(支持中文、英文、正则)。

6、女神:第二段【替换写入内容】

搜到「妈妈」之后,把内容改成「女神」。

7、g → global(全局)

关键:整行全部替换

  • 不加 g:只替换每行第一个「妈妈」,同一行后面剩下的不换

  • 加 g:一行里所有出现的妈妈,全部换成女神(全局整行替换)

8、tr_test.txt:最后参数 = 目标文件名

sed 读取这个文件的内容作为处理对象。

sed -i 's/妈妈/女神/g' tr_test.txt

-i=in-place,直接把替换结果写入原文件,不再只打印屏幕。直接修改源文件,原地保存

http://www.jsqmd.com/news/958937/

相关文章:

  • HSTracker:macOS平台终极炉石传说卡组跟踪与数据驱动决策系统
  • 2026年四川高价镀膜机回收品牌TOP5客观排行:成都本地高价积压物资回收公司/成都本地高价镀膜机回收公司/成都镀膜机回收/选择指南 - 优质品牌商家
  • 保姆级教程:用CHARMM-GUI和Amber Lipid17力场搞定含膜蛋白体系的构建与处理
  • 跳过环境配置,在快马平台快速原型一个股票数据可视化分析应用
  • 别再混淆了!STM32F103的‘页’和F407的‘扇区’Flash操作到底有啥区别?
  • Python进程池ProcessPoolExecutor从入门到精通:你的第一个高并发数据处理脚本
  • 告别手动点点点:用Python脚本批量跑Maxwell仿真,效率提升10倍
  • SI5341寄存器配置避坑指南:如何用ClockBuilder Pro生成配置表并导入Verilog代码
  • 免费AI超分辨率终极指南:3分钟让模糊视频和图片变高清
  • KVM虚拟机迁移到VMware ESXi实战:从qemu-img转换到解决dracut启动报错的完整避坑指南
  • 利用快马平台AI快速生成嘉立创6层板温控系统原型代码
  • DeeperBrain:基于神经动力学的EEG基础模型解析
  • 用Arduino+AD9833信号源,5分钟搞定简易电路特性测试仪的故障检测模块
  • 新手福音:通过快马平台零代码基础体验AI文本情感分析项目
  • 2026年6月优秀的PPR管厂商怎么选择,PPR管怎么选择 - 品牌推荐师
  • 拆解一颗芯片的诞生:手把手图解MOSFET制造中的8大核心工艺
  • AI视频生成新纪元已至(Sora 2雕塑动画化技术白皮书首发)
  • 如何5分钟搞定中文文献管理:Zotero茉莉花插件的终极指南
  • OBS Virtual Cam 完全指南:从基础安装到高级应用
  • 告别轮询!用STM32CubeMX的DMA空闲中断高效接收OpenMV数据(附完整代码)
  • 从POC到生产上线仅需48小时:国有大行私有化AI工具配置模板(含Kubernetes Operator+联邦学习证书链预置方案)
  • 【Qt入门系列】一文掌握 Qt 常用显示类控件:QLCDNumber、QProgressBar 与 QCalendarWidget
  • 2026年天津全屋定制哪家好?5家靠谱品牌专业推荐 - 本地品牌推荐
  • CubeIDE隐藏玩法:解锁开源DAP-Link调试能力,像用ST-LINK一样丝滑(基于OpenOCD 0.11.0)
  • 别再只读数据手册了!手把手教你用Arduino玩转LIS2DW12加速度传感器的6种工作模式
  • AI 客服智能体搭建与知识库
  • 避坑指南:STM32F407做FFT逆变换时,数据对齐和内存管理的那些事儿(基于CMSIS-DSP库)
  • 新手也能搞定的51单片机PID温控仿真:从Proteus画图到代码烧录全流程
  • 实战应用:利用快马AI为团队批量部署mobaxterm中文环境
  • 别再瞎猜了!用Python手把手教你做马尔可夫性检验(附完整代码与卡方表查询避坑指南)