Linux 文本处理是系统管理和数据分析的重要技能,掌握这些工具可以大大提高工作效率。
grep(文本搜索):
- 基本用法:grep "pattern" file
- 常用选项:
- -i:忽略大小写
- -v:反向匹配(显示不匹配的行)
- -n:显示行号
- -c:统计匹配行数
- -r:递归搜索目录
- -l:只显示包含匹配的文件名
- -A n:显示匹配行及其后 n 行
- -B n:显示匹配行及其前 n 行
- -C n:显示匹配行及其前后各 n 行
- 正则表达式:grep -E "pattern1|pattern2" file(扩展正则)
- 示例:grep -rn "error" /var/log(递归搜索日志中的错误)
sed(流编辑器):
- 基本用法:sed 'command' file
- 常用命令:
- s/pattern/replacement/:替换(只替换第一个匹配)
- s/pattern/replacement/g:全局替换(替换所有匹配)
- d:删除行
- p:打印行
- n:读取下一行
- 常用选项:
- -i:直接修改文件
- -n:抑制自动输出
- -e:执行多个命令
- 示例:
- sed 's/old/new/g' file(全局替换)
- sed '/pattern/d' file(删除匹配的行)
- sed -i 's/foo/bar/g' file(直接修改文件)
awk(文本处理工具):
- 基本用法:awk 'pattern {action}' file
- 内置变量:
- $0:整行
- $1, $2, ...:第1、2、...个字段
- NF:字段总数
- NR:当前行号
- FNR:当前文件的行号
- FS:字段分隔符(默认空格)
- OFS:输出字段分隔符
- RS:记录分隔符(默认换行符)
- ORS:输出记录分隔符
- 常用函数:
- print:打印
- printf:格式化输出
- length():字符串长度
- substr():子字符串
- split():分割字符串
- gsub():全局替换
- 示例:
- awk '{print $1}' file(打印第一个字段)
- awk -F: '{print $1, $3}' /etc/passwd(以冒号为分隔符)
- awk 'NR==1,NR==10' file(打印第1-10行)
- awk '{sum+=$1} END {print sum}' file(计算第一列总和)
cut(剪切工具):
- 基本用法:cut [options] file
- 常用选项:
- -d:指定分隔符
- -f:指定字段
- -c:指定字符位置
- 示例:
- cut -d: -f1 /etc/passwd(以冒号为分隔符,提取第一个字段)
- cut -c1-10 file(提取每行的前10个字符)
sort(排序工具):
- 基本用法:sort [options] file
- 常用选项:
- -n:按数值排序
- -r:倒序
- -k:指定排序字段
- -t:指定分隔符
- -u:去重
- 示例:
- sort -n -k2 file(按第二列数值排序)
- sort -t: -k3 -n /etc/passwd(按第三列数值排序)
uniq(去重工具):
- 基本用法:uniq [options] file
- 常用选项:
- -c:统计重复次数
- -d:只显示重复的行
- -u:只显示不重复的行
- 示例:
- sort file | uniq -c(排序后统计重复次数)
组合使用:
- 统计日志中错误数量:grep "error" log | wc -l
- 查找访问量最高的 IP:awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
- 提取文件中的邮箱:grep -Eo '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}' file