Shell文本处理与重定向 Shell文本处理与重定向十七、文本处理工具17.1 cut 剪切cut命令用于截取文件中指定的列或字符。参数-f指定要提取的列号field-d指定字段分隔符delimiter-c截取指定位置的字符character-b截取指定位置的字节byte示例# 假设有文件 data.txt 内容如下# name age city# John 25 NewYork# Alice 30 London# 提取第一列cut-d -f1data.txt# name# John# Alice# 提取第一列和第三列cut-d -f1,3data.txt# name city# John NewYork# Alice London# 提取第一列到第三列cut-d -f1-3 data.txt# 提取前5个字符cut-c1-5 data.txt# 提取第5-7个字符cut-c5-7 data.txt实用案例提取 CSV 文件中的特定列# 提取 CSV 文件的第2列和第4列cut-d,-f2,4users.csv17.2 sed 流编辑器sed是一个流编辑器用于对文本进行查找、替换、插入、删除等操作。它一次处理一行内容。参数-e指定多个编辑命令-n静默模式只显示匹配的行-i直接修改文件内容in-place常用命令a在指定行后追加内容d删除指定行s替换内容p打印指定行示例# 在第3行后追加内容sed3a New Linefile.txt# 删除第1行sed1dfile.txt# 删除包含 pattern 的行sed/pattern/dfile.txt# 删除第1-3行sed1,3dfile.txt# 替换第一个匹配seds/old/new/file.txt# 替换所有匹配全局替换seds/old/new/gfile.txt# 只打印第5行sed-n5pfile.txt# 打印第1-5行sed-n1,5pfile.txt# 多个命令组合sed-e1d-es/old/new/gfile.txt# 直接修改文件谨慎使用sed-is/old/new/gfile.txt特殊模式# 删除空行sed/^$/dfile.txt# 从第3行开始到第一个空行结束sed3,/^$/!dfile.txt# 删除选中之外的内容只保留选中内容sed3,/^$/!dfile.txt|sed/^$/d17.3 awk 文本分析awk是一个强大的文本分析工具以行为单位处理数据支持条件判断和计算。参数-F指定字段分隔符-v定义变量基本用法# 打印指定列awk{print $1, $3}data.txt# 指定分隔符awk-F,{print $1, $2}users.csv# 打印行号和内容awk{print NR, $0}file.txt# 条件筛选awk$2 30data.txt# 第二列大于30的行# 条件判断awk{if($2 30) print $1, is old; else print $1, is young}data.txt# 计算求和awk{sum $2} END {print Total:, sum}data.txt# 求平均值awk{sum $2; count} END {print Average:, sum/count}data.txtBEGIN 和 END 块# BEGIN 在处理数据前执行awkBEGIN {print Name\tAge} {print $1\t$2}data.txt# END 在处理数据后执行awk{sum $2} END {print Total Age:, sum}data.txt# 同时使用 BEGIN 和 ENDawkBEGIN {print Processing...} {print $0} END {print Done}data.txt示例处理员工数据# 假设 employees.txt 内容# Alice,28,5000# Bob,35,7000# Charlie,42,9000# 提取工资大于6000的员工awk-F,$3 6000employees.txt# 计算平均工资awk-F,{sum $3; count} END {print Average:, sum/count}employees.txt17.4 grep 过滤grep是一个强大的文本搜索工具用于查找匹配的字符串。参数-v反向匹配排除-c统计匹配行数-n显示行号-i忽略大小写-E支持扩展正则表达式-r递归搜索目录基本用法# 查找包含 pattern 的行greppatternfile.txt# 忽略大小写grep-ipatternfile.txt# 显示行号grep-npatternfile.txt# 统计匹配行数grep-cpatternfile.txt# 反向匹配排除grep-vpatternfile.txt# 递归搜索目录grep-rpattern/path/to/directory# 显示匹配内容及其上下文前后各2行grep-C2patternfile.txt正则表达式# 查找以 start 开头的行grep^startfile.txt# 查找以 end 结尾的行grepend$file.txt# 查找包含数字的行grep[0-9]file.txt# 查找以字母开头的行grep^[a-zA-Z]file.txt# 多条件匹配使用扩展正则grep-Epattern1|pattern2file.txt# 查找包含 error 或 warning 的行grep-Eerror|warninglog.txt实用案例# 查看特定进程ps-ef|grepsshd# 排除 grep 自身ps-ef|grepsshd|grep-vgrep# 在多个文件中搜索grepTODO*.sh# 统计代码文件中的注释行数grep-c^//*.java十八、输入输出重定向18.1 输出重定向输出重定向用于将命令的输出保存到文件或设备。符号说明符号说明覆盖输出创建或覆盖文件追加输出添加到文件末尾2错误输出重定向标准输出和错误输出合并重定向示例# 将命令输出写入文件覆盖ls-lfile_list.txt# 将命令输出追加到文件echoNew entrylog.txt# 将错误输出写入文件lsnonexistent_file2error.log# 将标准输出和错误输出都写入文件commandoutput.log# 将标准输出和错误输出分开保存commandoutput.log2error.log# 将错误输出重定向到标准输出command21# 丢弃输出黑洞command/dev/nullcommand/dev/null18.2 输入重定向输入重定向用于从文件读取输入。符号说明符号说明从文件读取输入Here-document内联输入示例# 从文件读取输入wc-lfile.txt# Here-document创建文件内容catnewfile.txtEOF This is line 1 This is line 2 This is line 3 EOF# Here-stringgreppatternThis is a test string18.3 重定向组合使用# 将多个命令的输出合并到一个文件ls-loutput.txtecho---output.txtdateoutput.txt# 管道和重定向组合ls-l|grep.txttxt_files.txt# 错误输出和标准输出分别处理commandsuccess.log2error.log# 将错误输出追加到日志command2error.log十九、管道管道用于将一个命令的输出作为另一个命令的输入。符号|基本用法# 连接两个命令command1|command2# 连接多个命令command1|command2|command3示例# 列出文件并统计数量ls-l|wc-l# 查找包含特定内容的文件ls-l|grep.txt# 过滤并排序ls-l|grep.txt|sort# 统计日志中错误出现的次数catlog.txt|grep-cERROR# 查找最大的文件ls-la|sort-k5-r|head-n5# 统计文件类型分布ls-l|awk{print $1}|cut-c1|sort|uniq-c实用案例# 查看磁盘使用情况并按大小排序df-h|sort-k5-h# 查找占用内存最多的进程psaux|sort-k4-r|head-n10# 统计访问日志中最频繁的 IPcataccess.log|awk{print $1}|sort|uniq-c|sort-r|head-n10# 从压缩文件中搜索内容zcat logs.gz|grepERROR# 格式化输出ls-l|awk{printf %-20s %5s\n, $9, $5}二十、综合示例20.1 日志分析脚本#!/bin/bash# 分析日志文件LOG_FILE/var/log/syslogecho 日志分析报告 echo# 统计错误数量echo1. 错误数量:grep-cERROR$LOG_FILE# 显示最近的10条错误echoecho2. 最近10条错误:grepERROR$LOG_FILE|tail-n10# 统计各等级日志数量echoecho3. 日志等级分布:grep-E(ERROR|WARNING|INFO)$LOG_FILE|awk{print $5}|sort|uniq-c# 查找最频繁出现的错误echoecho4. 最频繁的错误:grepERROR$LOG_FILE|awk{print $6}|sort|uniq-c|sort-r|head-n520.2 文件备份脚本#!/bin/bash# 备份指定目录SOURCE_DIR/home/user/documentsBACKUP_DIR/backupTIMESTAMP$(date%Y%m%d_%H%M%S)BACKUP_FILEbackup_$TIMESTAMP.tar.gzecho开始备份...# 创建备份目录mkdir-p$BACKUP_DIR# 执行备份tar-zcvf$BACKUP_DIR/$BACKUP_FILE$SOURCE_DIRif[$?-eq0];thenecho备份成功:$BACKUP_FILEecho备份大小:$(du-h$BACKUP_DIR/$BACKUP_FILE|awk{print $1})elseecho备份失败!exit1fi# 保留最近7天的备份echo清理旧备份...find$BACKUP_DIR-namebackup_*.tar.gz-mtime7-deleteecho完成!20.3 批量文件重命名#!/bin/bash# 将所有 .txt 文件重命名为 .bakforfilein*.txt;domv$file${file%.txt}.bakdone# 添加前缀forfilein*.jpg;domv$filephoto_$filedone# 数字编号count1forfilein*.png;domv$fileimage_$(printf%03d$count).pngcount$[$count1]done20.4 系统监控脚本#!/bin/bashecho 系统状态报告 echo# CPU 使用情况echoCPU 使用:top-bn1|grepCpu(s)|seds/.*, *\([0-9.]*\)%* id.*/\1/|awk{print 空闲: 100 - $1 %}# 内存使用情况echoecho内存使用:free-h|grepMem|awk{print 总计: $2 , 已用: $3 , 空闲: $4}# 磁盘使用情况echoecho磁盘使用:df-h/|grep/|awk{print 总计: $2 , 已用: $3 , 可用: $4 , 使用率: $5}# 运行时间echoecho系统运行时间:uptime|awk{print 已运行: $3 $4}# 活跃用户echoecho活跃用户:who|wc-l