目录
命令小工具
- 1.1 cut - 按列或字符截取
- 1.2 sort - 排序
- 1.3 uniq - 去除连续重复行
- 1.4 tr - 字符替换/删除/压缩
- 1.5 常见组合面试题
- 1.6 总结口诀
sed流编辑器
- 2.1 sed是什么
- 2.2 sed的原理
- 2.3 sed命令常见用法
- 2.4 生产扩展案例
shell-awk命令详解
- 3.1 概述
- 3.2 工作原理
- 3.3 工作流程
- 3.4 基本语法
- 3.5 实战案例
- 3.6 总结
1. 命令小工具
1.1 cut - 按列或字符截取
cut
用于从文本中抽取需要的字段,适合处理结构化文本。
常用选项:
-b
:按字节截取-c
:按字符截取(推荐处理中文)-d
:指定分隔符(默认TAB)-f
:指定字段(需配合-d
)
示例:
# 截取/etc/passwd的用户名和UID
cut -d':' -f1,3 /etc/passwd
# 截取每行第2个字符
cut -c2 name.txt
注意:cut擅长处理单个字符为间隔的文本,处理复杂格式时建议使用awk。
1.2 sort - 排序
sort
默认按行首字符升序排列。
常用选项:
-t
:指定分隔符-k
:指定排序字段-n
:按数值排序-r
:降序-u
:去重-o
:输出到文件
示例:
# 按UID数值降序排列
sort -nr -t: -k3 /etc/passwd
# 去重并保存结果
sort -u passwd.txt -o sorted.txt
1.3 uniq - 去除连续重复行
重要:只能去掉相邻的重复行,常与sort配合使用。
常用选项:
-c
:对重复行计数-d
:只显示重复行-u
:只显示唯一行
示例:
# 统计每种水果出现次数
sort fruit.txt | uniq -c
# 查看系统登录用户
who | awk '{print $1}' | uniq
1.4 tr - 字符替换/删除/压缩
主要用于单个字符处理。
常用选项:
-d
:删除字符-s
:压缩重复字符
示例:
# 小写转大写
cat file.txt | tr 'a-z' 'A-Z'
# 删除所有数字
tr -d '0-9' < data.txt
# 压缩连续空格
echo "hello world" | tr -s ' '
1.5 常见组合面试题
① 统计当前连接的主机数
ss -nt | tr -s " " | cut -d " " -f5 | cut -d: -f1 | sort | uniq -c
解析:
ss -nt
:获取TCP连接tr -s " "
:压缩多个空格- 两次
cut
提取IP sort | uniq -c
:统计IP出现次数
② 查看登录过系统的用户
last | awk '{print $1}' | sort | uniq | grep -v "^$" | grep -v wtmp
1.6 总结口诀
- cut - 截列
- sort - 排序
- uniq - 去重(必须连续)
- tr - 替换/删除/压缩
2. sed流编辑器
2.1 sed是什么
sed是专门为文本处理设计的流编辑器,主要功能:
- 自动编辑一个或多个文件
- 简化对文件的反复操作
- 编写转换程序
2.2 sed的工作原理
工作流程:
- 读取一行到模式空间
- 按顺序执行命令
- 输出处理后的内容
- 清空模式空间,重复上述过程
注意:默认情况下处理结果不修改源文件,除非使用
-i
选项。
2.3 sed命令常见用法
基本语法:
sed [选项] '操作' 文件
sed [选项] -f 脚本文件 文件
常用选项:
选项 | 含义 |
---|---|
-e |
多次编辑 |
-n |
取消默认输出 |
-i |
直接修改源文件 |
-r |
使用扩展正则表达式 |
操作命令:
命令 | 含义 |
---|---|
p |
打印 |
d |
删除 |
i |
在行前插入内容 |
a |
在行后插入内容 |
c |
替换整行 |
s |
搜索替换(最常用) |
示例:
# 打印含"root"的行
sed -n '/root/p' /etc/passwd
# 替换所有"apple"为"APPLE"
sed 's/apple/APPLE/g' fruit.txt
# 删除空行
sed '/^$/d' file.txt
# 在第三行后插入内容
sed '3a New Content' file.txt
2.4 生产扩展案例
案例1:修改IP地址
sed -i 's/^IPADDR=.*/IPADDR=192.168.10.100/' /etc/sysconfig/network-scripts/ifcfg-ens33
案例2:调整vsftpd配置
#!/bin/bash
SAMPLE="/usr/share/doc/vsftpd/EXAMPLE/vsftpd.conf"
CONFIG="/etc/vsftpd/vsftpd.conf"
# 备份配置
[! -e "$CONFIG.bak"] && cp $CONFIG $CONFIG.bak
# 禁止匿名用户,允许本地用户写入
sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG
# 重启服务
systemctl restart vsftpd
3. shell-awk命令详解
3.1 概述
AWK 是强大的文本分析工具,特点:
- 专门为文本处理设计的编程语言
- 行处理软件,用于扫描、过滤、统计
- 数据可来自标准输入、管道或文件
- Linux系统常用的是gawk(GNU awk)
3.2 工作原理
执行流程:
- 读(Read):读取一行数据
- 执行(Execute):执行awk命令
- 重复(Repeat):循环直到文件结束
3.3 工作流程
标准结构:
awk 'BEGIN{开始块} pattern{主体块} END{结束块}' 文件
- BEGIN块:处理前执行一次(初始化变量)
- 主体块:每行都执行
- END块:处理后执行一次(汇总结果)
3.4 基本语法
内置变量:
变量 | 含义 |
---|---|
FS |
输入字段分隔符(默认空格) |
OFS |
输出字段分隔符 |
RS |
输入行分隔符(默认\n) |
ORS |
输出行分隔符 |
NF |
当前行的字段数 |
NR |
当前行号 |
FNR |
各文件分别计数的行号 |
$0 |
整行内容 |
$n |
第n个字段 |
3.5 实战案例
基础操作:
# 打印用户名和登录shell
awk -F: '{print $1,$7}' /etc/passwd
# 统计行数
awk 'END{print NR}' file.txt
# 显示文件最后一行
awk 'END{print $0}' file.txt
高级应用:
# 获取本机IP
ifconfig ens33 | awk '/netmask/{print $2}'
# 统计内存使用率
free -m | awk '/Mem:/ {print int($3/($3+$4)*100)"%"}'
# 统计IP访问次数
awk '{ip[$1]++} END{for(i in ip) print ip[i],i}' /var/log/nginx/access.log
安全监控脚本:
#!/bin/bash
# 分析登录失败记录
log_data=$(awk '/Failed password/{ip[$(NF-3)]++} END{for(i in ip) print i,ip[i]}' /var/log/secure)
# 报警处理
echo "$log_data" | while read ip count; do
if [ $count -ge 3 ]; then
echo "警告! $ip 访问失败 $count 次!" | mail -s "安全警报" admin@example.com
fi
done
3.6 总结
工具对比:
工具 | 最佳用途 | 特点 |
---|---|---|
grep |
文本过滤 | 简单匹配 |
sed |
流编辑 | 适合编辑匹配的文本 |
awk |
格式化文本输出 | 复杂文本处理 |
cut |
按列截取 | 简单结构化数据 |
sort |
排序 | 数据整理 |
uniq |
去重 | 需配合sort |
tr |
字符替换/删除 | 单个字符处理 |
核心要点:
- 组合使用:管道连接多个命令 (e.g.,
sort | uniq
) - 备份操作:修改文件前备份 (
sed -i.bak
) - 性能考量:大文件处理用
awk
代替while read
- 安全审计:定期分析日志 (
/var/log/secure
, access_log) - 脚本测试:生产环境前充分验证
掌握这些工具的组合应用,可以高效解决95%的Linux文本处理需求。实际工作中建议多积累实用代码片段,建立个人工具箱。