当前位置:首页 > 技术 > 正文内容

Shell脚本实用技巧:正则表达式与文本处理

访客 技术 2026年6月25日 1

AWK命令基础应用

AWK是一种强大的文本处理工具,特别适合处理结构化数据。以下是一些基本用法:

# 使用逗号作为分隔符,输出第一列和第二列
awk -F',' '{print $1, $2}' data.txt

# 输出所有行
awk '{print $0}' data.txt

# 根据条件筛选行
awk '$3 > 100 {print $1, $2}' data.txt

正则表达式:grep与sed

grep和sed是Linux中处理文本的强大工具,结合正则表达式可以实现复杂的文本匹配和替换操作。

sed命令详解

sed(Stream Editor)是一个流编辑器,可以对文本进行增、删、改、查操作。

基本语法

sed [选项] [动作] [文件]

常用选项

  • -n:安静模式,仅显示处理过的行
  • -e:执行多条命令
  • -f:从文件中读取脚本
  • -i:直接编辑文件(注意备份)

常用动作

  • a\:在当前行下面插入文本
  • i\:在当前行上面插入文本
  • c\:替换选定行为新文本
  • d:删除选定行
  • s:替换指定字符
  • p:打印行(通常与-n一起使用)
  • g:行内全局替换

sed元字符

元字符 说明 示例
^ 匹配行首 /^test/ 匹配所有以test开头的行
$ 匹配行尾 /test$/ 匹配所有以test结尾的行
. 匹配任意字符(除换行符) /t.st/ 匹配t后接任意字符,最后是st
* 匹配0个或多个字符 /*test/ 匹配0个或多个空格后紧跟test的行
[] 匹配指定范围内的字符 /[tx]est/ 匹配test和xest

文本操作示例

插入文本

# 在第2行后插入文本
sed '2a\新插入的文本' filename.txt

# 在匹配"keyword"的行前插入文本
sed '/^keyword/i\插入的文本' filename.txt

删除行

# 删除第3行
sed '3d' filename.txt

# 删除第2至5行
sed '2,5d' filename.txt

# 删除所有包含"keyword"的行
sed '/keyword/d' filename.txt

# 删除空白行
sed '/^$/d' filename.txt

替换文本

# 全局替换"old"为"new"
sed 's/old/new/g' filename.txt

# 替换每行第2处匹配的"old"为"new"
sed 's/old/new/2g' filename.txt

# 仅打印发生替换的行
sed -n 's/old/new/p' filename.txt

高级匹配技巧

# 使用&引用匹配的文本
echo "hello world" | sed 's/\w\+/(&)/g'
# 输出: (hello) (world)

# 使用子串匹配标记
echo "ID=12345" | sed 's/ID=\([0-9]\+\)/编号:\1/'
# 输出: 编号:12345

文件内容管理

创建或替换文件内容

# 创建新文件或替换整个文件内容
cat << EOF > /etc/motd
#####################################
#  系统名称: 服务器管理系统
#  管理员A: admin@example.com
#  管理员B: backup@example.com
#  系统用途: 生产环境Web服务
#####################################
EOF

追加内容到文件

# 追加多行内容到文件末尾
cat << EOF >> /etc/motd
系统维护时间: 每周六凌晨2:00-4:00
紧急联系人: 13800138000
EOF

在文件特定位置插入内容

# 在文件末尾添加内容
sed -i '$a新增的配置行' /etc/config.conf

# 在第N行插入内容
sed -i '5i\插入的配置项' /etc/config.conf

# 替换匹配的行内容
sed -i '/旧配置/c\新配置内容' /etc/config.conf

组合使用grep、sed和awk

查找并替换特定内容

# 查找包含特定模式的行并替换
grep -n "pattern" file.txt | while read line; do
    line_num=$(echo $line | cut -d: -f1)
    sed -i "${line_num}s/pattern/replacement/g" file.txt
done

提取并处理特定字段

# 提取特定列的值
column_value=$(grep "pattern" file.txt | awk '{print $4}')

# 使用分隔符提取子字段
sub_field=$(echo $column_value | cut -d"=" -f2)

# 根据条件处理数据
grep "condition" data.txt | awk -F: '{if ($3 > 100) print $1, $2}'

处理系统配置文件

# 查找并修改配置值
config_value=$(grep "CONFIG_ITEM" /etc/system.conf | cut -d"=" -f2)
if [ -n "$config_value" ]; then
    line_num=$(grep -n "CONFIG_ITEM" /etc/system.conf | cut -d: -f1)
    sed -i "${line_num}s/.*/CONFIG_ITEM=new_value/" /etc/system.conf
fi

AWK高级应用

处理/etc/passwd文件

# 查找具有root权限的账号(GID为0)
awk -F: '{if ($4 == 0) print NR, $0}' /etc/passwd

# 跳过首行,显示用户ID和行号
awk -F: 'NR > 1 {print NR, $3}' /etc/passwd

# 统计每个shell的使用情况
awk -F: '{shell[$7]++} END {for (sh in shell) print sh, shell[sh]}' /etc/passwd

数据格式转换

# CSV数据处理
awk -F, '{print "用户名: " $1 ", 年龄: " $2 ", 城市: " $3}' users.csv

# 计算数值列的总和
awk -F, '{sum += $3} END {print "总和: " sum}' data.csv

# 按列排序
awk -F, '{print $2, $1}' names.csv | sort

系统管理实用技巧

文件备份与时间戳

# 添加时间戳备份文件
mv /etc/config.conf /etc/config.conf.backup.$(date +%Y%m%d_%H%M%S)

# 批量备份多个文件
for file in /etc/*.conf; do
    mv "$file" "$file.backup.$(date +%Y%m%d)"
done

日志处理

# 提取特定时间段的日志
sed -n '/2023-06-01 10:00/,/2023-06-01 11:00/p' system.log

# 统计错误日志数量
grep "ERROR" application.log | wc -l

# 查找访问量最高的IP
awk '{ip[$1]++} END {for (addr in ip) print ip[addr], addr}' access.log | sort -nr | head -10

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。