Linux 命令行高级用法大全
一、命令组合与管道进阶(最常用高级技巧)
1. 管道 | + 多阶段过滤
基础:cmd1 | cmd2
高级搭配:
# 统计日志中500错误,取Top10访问IP
grep " 500 " access.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -10
# 多条件过滤、反向过滤
ps aux | grep nginx | grep -v grep
2. 进程替换 <() / >()
解决两个文件对比、命令输出当临时文件,替代临时文件:
# 对比两个命令输出差异(不用存文件)
diff <(ls dir1) <(ls dir2)
# 一边输出到文件,一边管道处理
ls -lh | tee output.txt | grep ".log"
3. 分号 ;、&&、||、()、{} 流程控制
# 全部顺序执行,不管前一条是否报错
mkdir test; cd test; touch a.txt
# 前一条成功才执行后一条(推荐)
nginx -t && systemctl restart nginx
# 前一条失败才执行(错误兜底)
curl 127.0.0.1:80 || echo "服务挂了"
# 批量执行,输出合并
{ echo "start"; ls -l; echo "end"; } > log.txt
# 子shell执行,不污染当前环境
(cd /tmp; ls)
pwd # 还在原来目录
二、文本三剑客高级:grep / sed / awk(运维核心高级工具)
1. grep 高级
# 递归搜索代码,排除node_modules目录
grep -r "user_id" ./ --exclude-dir=node_modules --include=*.js
# 正则匹配、显示前后3行上下文
grep -C 3 "Exception" app.log
# 反向匹配、只显示匹配行数
grep -v "^#" nginx.conf | grep -v "^$" | wc -l
2. sed 流编辑器(批量修改文本)
# 全局替换,直接修改文件(mac去掉-i,用 -i '')
sed -i 's/127.0.0.1/0.0.0.0/g' config.yaml
# 删除空行、注释行
sed -i '/^#/d;/^$/d' app.conf
# 提取指定行 10~20行
sed -n '10,20p' log.txt
# 多行匹配替换
sed '/start/,/end/s/old/new/g' file
3. awk 数据处理(最强文本分析,类编程语言)
# 打印磁盘使用率大于80%的分区
df -h | awk 'NR>1 {gsub(/%/,""); if($5>80) print $1,$5"%"}'
# 求和统计(日志流量汇总)
awk '{sum+=$10} END{print "总流量:",sum/1024/1024,"MB"}' access.log
# 多分隔符、自定义变量、条件判断
cat csv.txt | awk -F '[;,]' '$3>100 {print $1,$4}'
三、文件操作高级技巧
1. 重定向高阶:stdout/stderr 分离
# 标准输出到文件,错误输出到另一个文件
cmd > out.log 2> err.log
# 输出+错误全部写入同一个文件
cmd &> all.log
# 错误丢弃,只保留正常输出
cmd 2>/dev/null
# 输出到屏幕同时写入文件(tee)
tail -f app.log | tee -a monitor.log
2. find 高级批量处理(运维神器)
# 查找7天前日志并删除
find /var/log -name "*.log" -mtime +7 -delete
# 找到文件后批量执行sed替换
find ./ -type f -name "*.yaml" -exec sed -i 's/foo/bar/g' {} \;
# 限定大小、排除目录、并行处理
find . -size +100M -type f -not -path "./tmp/*" | xargs ls -lh
3. xargs 批量传参(解决参数过长报错 Argument list too long)
# 批量删除匹配文件
find . -name "*.tmp" | xargs rm -f
# 带空格文件名安全处理(-0 空字符分隔)
find . -print0 | xargs -0 ls -lh
# 分批执行,每次10个文件
ls *.log | xargs -n10 cat
四、进程与系统监控高级用法
1. ps / top / htop 进阶
# 按CPU排序,只看进程名、PID、CPU、内存
ps aux --sort=-pcpu,-rss | head -15
# 查找占用端口进程(替代netstat)
ss -tulnp | grep :8080
# 实时监控某个进程资源
top -p $(pidof java)
2. nohup / screen / tmux 后台常驻会话
nohup:后台运行,断开ssh不终止
nohup python task.py > run.log 2>&1 &
# 查看后台任务
jobs
# 切回前台
fg %1
# 后台暂停任务继续运行
bg %1
tmux(最推荐高级会话工具)
tmux new -s monitor # 创建命名会话
tmux attach -s monitor # 重新连接会话
# 快捷键:Ctrl+b 后
# % 垂直分屏 | " 水平分屏 | d 后台挂起会话
tmux ls # 查看所有会话
tmux kill-session -t monitor # 销毁会话
3. 定时一次性任务:at
# 1小时后执行脚本
at now + 1 hour <<EOF
/opt/clean_log.sh
EOF
atq # 查看定时任务
五、变量、循环、函数(Shell脚本单行高级语法)
1. for 循环单行批量操作
# 批量重命名
for f in *.txt; do mv $f ${f%.txt}.bak; done
# 遍历数字1~10
for i in {1..10}; do echo $i; done
# 遍历命令输出
for ip in $(cat ip_list.txt); do ping -c1 $ip; done
2. while 循环实时监控
# 每秒打印端口连接数
while true; do ss -s; sleep 1; clear; done
3. 自定义函数(命令行直接定义,临时生效)
# 定义查看端口函数
checkport() { ss -tulnp | grep ":$1"; }
# 直接调用
checkport 80
checkport 3306
六、历史命令、快捷操作
1. history 高级复用
!100 # 执行第100条历史命令
!nginx # 执行最近以nginx开头的命令
!! # 重复上一条命令
!$ # 取上一条命令最后一个参数
cat !$ # 例:mkdir test ; cd !$
# 替换上一条命令参数
ls /opt/xxx
^xxx^yyy # 等价 ls /opt/yyy
2. 快捷键(无需鼠标,大幅提速)
- •
Ctrl+a:跳到行首,Ctrl+e:跳到行尾
七、网络高级命令
# 端口连通性测试(不用telnet)
timeout 1 bash -c 'cat < /dev/tcp/127.0.0.1/3306' && echo ok || echo fail
# 抓包过滤指定端口
tcpdump -i any port 8080 -w capture.pcap
# 批量ping网段(并行)
for i in {1..254}; do (ping -c1 192.168.$i >/dev/null && echo 192.168.$i online) & done
八、压缩、校验、加密高级用法
# 排除目录打包
tar -zcvf code.tar.gz ./ --exclude=node_modules --exclude=.git
# 大文件分片压缩、合并解压
tar -zcv - split -b 100m -o code.tar.gz.part
cat code.tar.gz.part* | tar -zxv
# 文件完整性校验
sha256sum *.iso > check.txt
sha256sum -c check.txt
九、参数扩展、字符串处理(无awk/sed纯bash操作)
file="/opt/log/app.log"
echo ${file##*/} # 取文件名 app.log
echo ${file%/*} # 取路径 /opt/log
echo ${file%.log} # 去掉后缀 /opt/log/app
echo ${file/app/backend} # 字符串替换
十、实用组合实战案例(可直接复制使用)
- 1. 日志告警:检测5xx错误超过100条触发提示
count=$(grep " 500 " access.log | wc -l); [ $count -gt 100 ] && echo "告警:500错误过多"
docker system prune -a --filter "until=720h" -f
find . -type f | awk -F '.' '{print $NF}' | sort | uniq -c
watch -n 10 "df -h | awk 'NR>1 {gsub(/%/,\\"\"); if(\$5>=90) print \\"磁盘告警:\\",\$1,\$5\\"%\\"}'"