下面整理了Linux运维中常用的命令及实战场景,涵盖日志查询、项目启动、Shell批量处理、数据导入导出等核心场景,附带具体示例:
一、日志查询与分析命令
日志排查是运维高频操作,常用命令组合如下:
1. 实时跟踪日志(最常用)
# 实时输出文件末尾10行(默认),常用于跟踪应用动态日志
tail -f app.log
# 实时跟踪并过滤关键字(如ERROR),快速定位异常
tail -f app.log | grep -i "error" # -i:忽略大小写
# 跟踪最后50行并显示行号
tail -fn 50 app.log | grep -n "timeout" # -n:显示匹配行号
2. 按条件过滤日志
# 搜索包含"ERROR"的行(显示文件名+行号)
grep -rn "ERROR" /var/log/app/ # -r:递归搜索目录,-n:显示行号
# 排除某关键字(如排除"DEBUG"级别的日志)
grep "ERROR" app.log | grep -v "DEBUG" # -v:反向匹配
# 按时间范围过滤(假设日志含时间戳,如"2025-07-07 10:00:00")
# 提取当天09:00-10:00的ERROR日志
sed -n '/2025-07-07 09:00:00/,/2025-07-07 10:00:00/p' app.log | grep "ERROR"
# 统计某关键字出现次数(如统计一天内ERROR出现次数)
grep "2025-07-07" app.log | grep -c "ERROR" # -c:计数
3. 大文件日志查看(避免直接cat)
# 分页查看大文件(支持上下翻页、搜索)
less app.log # 进入后按 /关键字 搜索,q退出
# 查看文件前100行(定位日志开头)
head -n 100 app.log
# 查看文件中包含"Exception"的行,并显示前后5行上下文
grep -C 5 "Exception" app.log # -C:前后5行(-A后5行,-B前5行)
4. 日志内容提取与分析
# 从日志中提取特定字段(如提取所有请求URL,假设日志格式为"时间 URL 状态码")
awk '{print $2}' access.log # 提取第2列(URL)
# 统计访问量最高的前10个URL
awk '{print $2}' access.log | sort | uniq -c | sort -nr | head -10
二、项目启动与进程管理
部署/重启项目时,需掌握进程、端口、服务管理命令:
1. 启动项目(后台运行)
# 后台启动Java项目(nohup忽略挂断信号,&放入后台)
nohup java -jar /opt/apps/user-service.jar --spring.profiles.active=prod > /var/log/user-service.log 2>&1 &
# 说明:2>&1 表示将错误输出重定向到标准输出(统一写入日志文件)
# 启动Python脚本(类似方式)
nohup python3 /opt/scripts/data-sync.py > /var/log/data-sync.log 2>&1 &
2. 查看/终止进程
# 查找指定进程(如Java进程)
ps -ef | grep java # 全量信息
ps aux | grep user-service # 更简洁的进程信息(含CPU/内存占用)
# 按端口查找进程(如8080端口)
netstat -tunlp | grep 8080 # 需安装net-tools;t:TCP, u:UDP, n:数字端口, l:监听, p:进程
# 替代命令(现代系统自带):
ss -lntu | grep 8080 # 功能类似,更轻量
# 终止进程(根据PID)
kill 12345 # 正常终止(推荐)
kill -9 12345 # 强制终止(万不得已时用,可能导致数据不一致)
3. 系统服务管理(如Nginx、MySQL)
# 启动/停止/重启服务(systemd管理,主流Linux通用)
systemctl start nginx # 启动Nginx
systemctl stop mysql # 停止MySQL
systemctl restart redis # 重启Redis
# 查看服务状态
systemctl status docker # 显示是否运行、最近日志
# 设置开机自启动
systemctl enable sshd # 开机启动SSH服务
systemctl disable tomcat # 禁止开机启动Tomcat
三、Shell批量处理数据
批量操作文件/内容是运维效率核心,以下为高频场景:
1. 批量文件操作
# 批量重命名(如给所有.log文件加日期前缀)
for file in /var/log/*.log; do
mv "$file" "$(dirname $file)/$(date +%Y%m%d)_$(basename $file)"
done
# 执行后:access.log → 20250707_access.log
# 批量压缩7天前的日志(保留空间)
find /var/log -name "*.log" -mtime +7 -exec gzip {} \;
# 说明:-mtime +7 表示7天前;-exec 对找到的文件执行gzip压缩
# 批量删除空文件夹
find /opt/tmp -type d -empty -delete
2. 批量内容替换
# 替换当前目录所有.conf文件中的"old_ip"为"new_ip"(原地修改)
sed -i 's/old_ip/new_ip/g' *.conf
# 说明:-i 原地修改;g 全局替换(否则只替换每行第一个)
# 批量注释配置文件中含"debug"的行(在行首加#)
sed -i '/debug/ s/^/#/' *.ini
# 提取CSV文件中"status=success"的行,并保存到新文件
awk -F ',' '$5 == "success" {print $0}' data.csv > success_data.csv
# 说明:-F ',' 指定分隔符为逗号;$5 表示第5列
3. 数据统计与清洗
# 统计日志中不同状态码的出现次数(如HTTP状态码)
awk '{print $9}' access.log | sort | uniq -c | sort -nr
# 输出示例:1234 200;56 404;3 500
# 清洗数据:移除文件中所有空行和以#开头的注释行
grep -vE '^$|^#' config.txt > clean_config.txt
# 说明:-v 反向匹配;E 启用正则;^$ 空行;^# 注释行
四、数据导入导出(数据库/文件)
数据备份、迁移常用导入导出命令:
1. 数据库导入导出(以MySQL为例)
# 导出整个数据库(结构+数据)
mysqldump -u root -p'password' --databases user_db > user_db_20250707.sql
# 仅导出表结构(不含数据)
mysqldump -u root -p'password' --no-data user_db > user_db_schema.sql
# 导入数据库(需先创建空库)
mysql -u root -p'password' user_db < user_db_20250707.sql
# 导出指定表(如导出user表,含where条件)
mysqldump -u root -p user_db user --where="create_time > '2025-07-01'" > user_202507.sql
2. 跨服务器文件传输(文件/目录)
# 本地文件传到远程服务器
scp /opt/backup/db.sql root@192.168.1.100:/data/backup/
# 远程文件下载到本地
scp root@192.168.1.100:/var/log/app.log ./
# 批量传输目录(递归传输)
scp -r /opt/apps root@192.168.1.100:/opt/
3. 压缩包导入导出(备份/迁移)
# 打包并压缩目录(tar+gzip,保留权限)
tar -czvf data_backup_20250707.tar.gz /opt/data
# 说明:c创建,z压缩,v显示过程,f指定文件名
# 解压到指定目录
tar -xzvf data_backup_20250707.tar.gz -C /opt/restore/
# 说明:x解压,-C 指定目标目录
# 拆分大文件(避免传输失败)
split -b 100M data.tar.gz "data_part_" # 按100M拆分,生成data_part_aa,ab...
# 合并拆分的文件
cat data_part_* > data.tar.gz
4. 数据库与文件互导
# 将MySQL查询结果导出为CSV(如导出用户表id和name)
mysql -u root -p -e "SELECT id,name FROM user_db.user WHERE status=1" --batch --skip-column-names > user.csv
# 说明:--batch 取消格式化;--skip-column-names 不导出表头
# 将CSV导入MySQL(需先创建表结构)
mysqlimport -u root -p --fields-terminated-by=',' --local user_db user.csv
# 说明:--fields-terminated-by=',' 指定CSV分隔符;--local 从本地文件导入
总结
以上命令覆盖了日志排查、项目部署、批量处理、数据迁移等核心运维场景。实际使用中,可根据需求组合命令(如tail + grep + awk
),复杂场景可编写Shell脚本固化流程(如定时备份脚本、日志清理脚本)。记住:man 命令
(如man grep
)是最好的手册,可随时查看参数细节。