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

运维基础->掌握正则、sed与awk:高效文本处理技巧

一、正则表达式

1.基本正则
正则符号描述
^匹配行首
$匹配行尾
[]集合,匹配集合中的任意单个字符
[^]对集合取反
.匹配任意单个字符
*匹配前一个字符任意次数 [*不允许单独使用]
\{n,m\}匹配前一个字符n到m次
\{n\}匹配前一个字符n次
\{n,\}匹配前一个字符n次及以上
\(\)组合为整体,保留
grep ^user test.txt                #找以user开头的行
grep bash$ test.txt                #找以bash结尾的行
grep ^$ test.txt                   #找空行
grep -v ^$ test.txt                #取反,找非空行
grep "[user]" test.txt             #找u、s、e、r任意一个字符
grep "[^user]" test.txt            #取反,显示u、s、e、r以外的内容
grep "[^0-9a-Z]" test.txt          #找到所有特殊字符
grep "." test.txt                  #匹配任意单个字符
grep "a*" test.txt                 #匹配a字符任意次,0次也算
grep ".*" test.txt                 #匹配任意,包括空行  
grep "a\{1,2\}" test.txt           #匹配a1~2次
grep "a\{2,\}" test.txt            #匹配a2次或以上
grep "a\{2\}" test.txt             #匹配a2次
grep "\(ab\)\{3,5\}" test.txt      #匹配ab 3~5次
2.扩展正则
正则符号描述
+最少匹配一次
最多匹配一次
{n,m}匹配前一个字符n到m次
()组合为整体,保留
|或者
\b单词边界
grep -E a+ test.txt                 #匹配a至少一次
grep -E "(ab){3.5}" test.txt        #匹配ab 3~5次
grep -E "\bmy\b" test.txt           #匹配the单词
grep -E "(ab|cd)" test.txt          #匹配ab或cd
3.egrep过滤工具

格式:egrep 选项 '正则表达式' 文件

常用选项:

-i:忽略字母大小写

-v:条件取反

-c:统计匹配的行数

-q:静默

-n:显示出匹配结果所在的行号

-color:表红显示匹配字符串

4.其他正则符号
正则符号描述
\w匹配数字字符下划线
\s匹配空白
\d匹配数字

匹配ip地址

grep -P "(\d{1,3}\.){3}\d{1,3}" test.txt

二、sed基本用法

sed时流式文本编辑器,以非交互方式逐行处理文本数据流,支持正则表达式匹配和自动化脚本操作,适合于批量修改文件与数据清洗。

1.sed用法

格式1:前置命令 | sed 选项 '条件指令'

格式2:sed 选项 '条件指令' 文件

常用选项:

-n(屏蔽默认输出,默认sed会输出读取文档的全部内容)

-r(支持扩展正则)

-i(修改源文件)

常用动作指令:

p:打印行

d:删除行

s:替换行

sed -n 'p' test.txt                   #输出所有行
sed -n '2p' test.txt                  #输出第2行
sed -n '3,5p' test.txt                #输出3~5行
sed -n '2p;4p' test.txt               #输出第2,第4行
sed -n '1~2p' test.txt                #输出奇数行
sed -n '2~2p' test.txt                #输出偶数行
sed -n '/user/p' test.txt             #输出包含user的行
sed -nr '/^user|bash$/p' test.txt     #输出以user开头或者以bash结尾的行
sed -n '1!p' test.txt                 #输出不是第一行的行
sed -n '$p' test.txt                  #输出最后一行
sed -n '$=' test.txt                  #统计文件行数
sed '2,4d' test.txt                   #删除2~4行
sed '/user/!d' test.txt               #删除不包含user的行
sed '$d' test.txt                     #删除文件最后一行
sed '/^$/d' test.txt                  #删除所有空行
sed 's/1/2/g' test.txt                #将所有行的所有1替换为2
sed '2s/2/1/2' test.txt               #将第2行的第2个2替换为1
sed 's,/bin/bash,/sbin/sh,' test.txt  #自定义替换符,s后跟的就是替换符
2.sed扩展用法

a:行后追加

i:行前插入

c:替换,替换一行内容

sed '1a hello' test.txt         #在第1行后追加一行hello
sed '1i hello' test.txt         #在第1行前插入一行hello
sed '1c hello' test.txt         #替换第1行内容为hello

三、awk基本用法

awk是文本处理编程语言,兼具命令行工具和编程语言特性,支持变量、条件判断、循环等结构化操作,擅长处理结构化文本数据,进行日志分析和数据汇总。

1.awk语法

命令格式:

格式1:awk 选项  '[条件]{指令}' 文件

格式2:前置命令 | awk 选项 '[条件]{指令}'

 常用命令选项:

-F:指定分隔符,可以省略,默认为空格

awk常用内置变量:

$0:当前行的完整内容

$1:当前行的第一列数据

$2:当前行的第二列数据

$3:当前行的第三列数据(以此类推)

NR:当前行的行号

NF:当前行的列数

awk '{print NR,$0}' test.txt             #输出所有行的行号,所有列内容
awk '{print NR,NF}' test.txt             #输出所有行的行号,列号
awk '{print $0}' test.txt                #输出所有行所有列
awk '/haha/{print $1}' test.txt          #输出有haha行的第1列
awk -F: '{print $1"文本"$6}' test.txt     #输出第1,6列

收集根分区剩余容量

df -h | awk '/\/$/{print "根分区剩余容量是"$4}' 

收集网卡流量信息

ifconfig eth0 | awk '/RX p/{print "eth0网卡接收的数据量是"$5"字节"}'
ifconfig eth0 | awk '/TX p/{print "eth0网卡发送的数据量是"$5"字节"}'
2.格式化输出信息
awk [选项] 'BEGIN{指令} {指令} END{指令}' 文件BEGIN{ }    # 预处理块:在读取文件内容前执行,仅执行一次
{ }         # 主处理块:逐行处理文件内容时执行,执行次数等于文件行数
END{ }      # 后处理块:在所有文件内容读取完毕后执行,仅执行一次

收集系统中的用户名、uid、家目录信息

awk -F: 'BEGIN{print "用户名 UID 家目录"} {print $1,$3,$6} END{print "系统中有:"NR"个用户"}' /etc/passwd | column -t      #column -t对齐
2.awk处理条件
(1)正则条件

/正则/         ~包含       !~不包含

awk -F: '$1~/user/{print}' test.txt         #输出第1列包含user的行
awk -F: '$5!~/one/{print}' test.txt         #输出第5列不包含one的行
(2)数值/字符串比较条件

==等于      !=不等于      >大于        >=大于等于        <小于       <=小于等于

awk -F: '$1=="user"{print}' test.txt       #输出第1列是uesr的行
awk -F: 'NR>=10{print}' test.txt           #输出行号大于10的行
(3)逻辑测试条件

&&并且                      ||或者

awk -F: 'NR>10&&NR<=20{print}' test.txt       #输出行号大于10小于等于20的行
awk -F: 'NF=2||NF=4{print}' test.txt          #输出列数为2或者4的行
(4)数学运算

+ - * / %

awk 'NR%2==0{print NR,$0}' test.txt        #输出偶数行行号和内容
3.awk数组

定义数组的格式:数组名[下标]=元素值

调用数组的格式:数组名[下标]

awk 'BEGIN{a[1]="one",a[2]="two",a[3]="three";for(i in a){print i,a[i]}}'
awk扩展
awk '{name[$1]++}END{for(i in name){print name[i],i}}' test.txt | sort -nr
#使用sort命令增加排序功能,-n是以数字形式排序,-r是降序
4.安全检测
awk '/Failed password for root/{ip[$11]++}END{for(i in ip){print i,ip[i]}}' /var/log/secure  
#统计安全日志中访问root账户且密码输入错误的ip地址与次数
5.监控脚本
# vim jiankong.sh
#!/bin/bash
while :
do
clear                  #清屏
free -h | awk '/^Mem:/{print "剩余内存容量是"$4}'
df -h | awk '/\/$/{print "根分区剩余容量是"$4}'
awk 'END{print "用户总数是"NR"个"}' /etc/passwd
who | awk 'END{print "登录用户数量是"NR"个"}'
uptime | awk '{print "cpu的5,10,15分钟平均负载是"$(NF-2),$(NF-1),$NF}'
rpm -qa | awk 'END{print "安装的软件包数量是"NR"个"}'
sleep 3
done

四、脚本实战操作

1.系统初始化

该脚本实现以下功能:

  1. 自动识别系统版本(7或8)并执行差异化配置
  2. 永久禁用防火墙和SELinux安全模块
  3. 针对不同系统版本定制命令历史记录策略
  4. 仅对CentOS 8禁用交换分区优化性能
  5. 统一设置SSH会话保持300秒超时
  6. 根据系统版本选择ntp/chrony时间同步服务
  7. 所有配置变更后自动重启相关服务生效

执行方式:通过root用户运行bash server_init.sh即可完成全自动配置。

#!/bin/bash
# 功能:自动化配置CentOS/RHEL 7/8服务器
# 检测系统版本
OS_VERSION=$(grep -oP '(?<= )[0-9]+(?=\.)' /etc/redhat-release)# 1. 关闭防火墙和SELinux
systemctl stop firewalld
systemctl disable firewalld
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
setenforce 0# 2. 命令历史记录配置
if [ $OS_VERSION -eq 7 ]; then# CentOS 7: 关闭历史记录sed -i 's/^HISTSIZE=.*/HISTSIZE=0/' /etc/profileecho 'unset HISTFILE' >> /etc/profile
else# CentOS 8: 设置2000条带时间戳sed -i 's/^HISTSIZE=.*/HISTSIZE=2000/' /etc/profileecho 'export HISTTIMEFORMAT="%F %T "' >> /etc/profile
fi# 3. 仅CentOS 8关闭交换分区
if [ $OS_VERSION -eq 8 ]; thenswapoff -ased -i '/ swap / s/^/#/' /etc/fstab
fi# 4. SSH会话保持300秒
sed -i 's/^#ClientAliveInterval.*/ClientAliveInterval 300/' /etc/ssh/sshd_config
sed -i 's/^#ClientAliveCountMax.*/ClientAliveCountMax 0/' /etc/ssh/sshd_config
systemctl restart sshd# 5. 时间同步配置
if [ $OS_VERSION -eq 7 ]; thenyum install -y ntpsed -i "s/^server.*/server 192.168.88.1 iburst/" /etc/ntp.confsystemctl enable ntpd --now
elsednf install -y chronysed -i "s/^pool.*/server 192.168.88.1 iburst/" /etc/chrony.confsystemctl enable chronyd --now
fiecho "初始化配置完成!系统版本: CentOS $OS_VERSION"
2.批量创建账户
#!/bin/bash# 检查输入文件有效性
if [[ ! -f "user.txt" || ! -r "user.txt" ]]; thenecho "错误:user.txt 文件不存在或不可读" >&2exit 1
fi# 生成随机密码(字母数字组合)
generate_password() {openssl rand -base64 12 | tr -dc 'a-zA-Z0-9' | head -c 10
}# 获取待创建用户行号
line_numbers=$(awk '/^[a-zA-Z0-9]/ && !/已创建/{print NR}' user.txt)
if [[ -z "$line_numbers" ]]; thenecho "没有新用户需要创建"column -t user.txtexit 0
fi# 批量创建用户
for line in $line_numbers; do# 读取用户名username=$(sed -n "${line}p" user.txt | awk '{print $1}')# 生成并记录密码random_pass=$(generate_password)sed -i "${line}s/$/\t${random_pass}/" user.txt# 创建用户账户if ! useradd "$username"; thenecho "错误:用户 $username 创建失败" >&2continuefi# 设置用户密码if ! echo "$random_pass" | passwd --stdin "$username"; thenecho "错误:用户 $username 密码设置失败" >&2userdel -r "$username" 2>/dev/nullcontinuefi# 标记已创建状态sed -i "${line}s/$/\t已创建/" user.txt
done# 输出格式化结果
column -t user.txt
3.数据备份
#!/bin/bash# ========== 配置参数 ==========
sou_path="/var/www/html"          # 源目录路径
tar_path="/opt/backup_data"       # 备份存储目录
log_file="/var/log/backup.log"    # 日志文件路径
ex_file="*.tmp"                   # 排除文件模式
dest_ser_ip="x.x.x.x"       # 远程服务器IP
backup_keep_days=30               # 本地备份保留天数
max_backups=5                     # 触发传输的备份数量阈值
admin_email="admin@example.com"   # 管理员通知邮箱# ========== 初始化检查 ==========
mkdir -p ${tar_path} || { echo "$(date) - 创建备份目录失败" | tee -a ${log_file}; exit 1; }
[ -d ${sou_path} ] || { echo "$(date) - 源目录不存在" | tee -a ${log_file}; exit 1; }# ========== 备份功能 ==========
function perform_backup() {local timestamp=$(date +%Y%m%d-%H%M%S)local backup_name="web_file_${timestamp}.tar.gz"# 执行增量备份(基于最近修改的文件)find ${sou_path} -type f -mtime -1 ! -name "${ex_file}" -print0 | \tar -zcf ${tar_path}/${backup_name} --null -T - 2>>${log_file}if [ $? -eq 0 ]; thenecho "$(date) - 备份成功: ${backup_name}" | tee -a ${log_file}return 0elseecho "$(date) - 备份失败" | tee -a ${log_file}return 1fi
}# ========== 清理旧备份 ==========
function cleanup_backups() {find ${tar_path} -name "web_file_*" -mtime +${backup_keep_days} -delete 2>>${log_file}echo "$(date) - 已清理${backup_keep_days}天前的备份" >> ${log_file}
}# ========== 传输备份 ==========
function transfer_backups() {local file_count=$(ls ${tar_path}/web_file_* 2>/dev/null | wc -l)if [ ${file_count} -ge ${max_backups} ]; thenecho "$(date) - 开始传输${file_count}个备份文件" >> ${log_file}if scp -o ConnectTimeout=30 ${tar_path}/web_file_* root@${dest_ser_ip}:/backup &>>${log_file}; thenrm -f ${tar_path}/web_file_*echo "$(date) - 传输成功并清理本地文件" | tee -a ${log_file}return 0elseecho "$(date) - 传输失败,保留本地备份" | tee -a ${log_file}return 1fifi
}# ========== 邮件通知 ==========
function send_notification() {local status=$1local subject="备份任务通知 - ${status}"local body=$(tail -n 10 ${log_file})echo "${body}" | mail -s "${subject}" ${admin_email} 2>>${log_file}
}# ========== 主流程 ==========
{echo "====== 备份任务开始 $(date) ======"perform_backup && cleanup_backups && transfer_backupsecho "====== 备份任务结束 $(date) ======"
} >> ${log_file} 2>&1# 发送执行结果通知
if [ $? -eq 0 ]; thensend_notification "SUCCESS"
elsesend_notification "FAILED"
fi
http://www.xdnf.cn/news/19757.html

相关文章:

  • WeCross跨链-异构链跨链-(三)WeCross安装和跨链接入
  • 无人机散热模块技术要点分析
  • 什么是 etcd?
  • 当3D高斯泼溅遇见视频孪生:城市治理的“科幻“时代来了
  • R-4B: 通过双模退火与强化学习激励多模态大语言模型的通用自主思考能力
  • 一键 i18n 国际化神库!适配 Vue、React!
  • ElasticSearch倒排索引原理
  • 02、连接服务器的几种方式
  • 人工智能机器学习入门——线性回归
  • 高光谱成像在文物考古和字画检测中的应用
  • 普通人如何用 AI 提效?5 个低门槛工具 + 3 类场景案例,让 AI 成为日常助手
  • VMWare上搭建分布式Hadoop集群
  • 不只会修图!谷歌发布官方指南,教你用 Nano Banana 玩转文生图
  • pip的缓存
  • 【STL】C++ 开发者必学字符类详解析:std::string
  • [论文阅读] 人工智能 + 软件工程 | ReCode:解决LLM代码修复“贵又慢”!细粒度检索+真实基准让修复准确率飙升
  • 【序列晋升】27 Spring Cloud Sleuth给分布式系统装上透视镜
  • 彩笔运维勇闯机器学习--逻辑回归
  • JavaScript手录进阶01-跨域问题
  • Diamond基础3:在线逻辑分析仪Reveal的使用
  • 用AI做旅游攻略,真能比人肉整理靠谱?
  • iOS 上架 uni-app 流程全解析,从打包到发布的完整实践
  • LabVIEW软件全面解析:图形化编程的工业级应用指南
  • RL 大模型逆袭!搞定真实软件工程任务,成功率从 20% 飙到 39%,无需教师模型蒸馏
  • 如何将华为手机数据转移到OPPO手机
  • 2004-2023年各省生活垃圾无害化处理率数据(无缺失)
  • 07、上传jar包到 Linux 并启动项目
  • 9月3日星期三今日早报简报微语报早读
  • 深入解析Java Spliterator(Stream延迟、并行计算核心)
  • TensorFlow的Yes/No 关键词识别模型训练