服务器上没有图形界面,找文件、查日志、改配置全靠命令行。这几个工具单独用都简单,组合起来能解决大部分日常问题。
find:按条件找文件
# 最近 7 天改过的 php 文件
find /www -name "*.php" -mtime -7
# 大于 100M 的文件
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
# 找出所有空目录
find . -type d -empty
# 配合删除(先打印确认!)
find /tmp -name "*.log" -mtime +30 -print
find /tmp -name "*.log" -mtime +30 -delete
最后这条先把结果打印出来看一眼,确认没误伤再换成 -delete。我吃过一次亏,路径多打了一个 /,差点删掉整个目录。
grep:在文件内容里找
# 递归搜索,显示行号
grep -rn "TODO" app/
# 只列出文件名
grep -rl "api_key" .
# 忽略大小写,排除目录
grep -rni --exclude-dir={node_modules,.git} "timeout" .
# 前后各两行上下文
grep -A2 -B2 "ERROR" app.log
-r 递归、-n 行号、-i 忽略大小写、-l 只列文件名,这四个记住就够用。
awk:按列处理
访问日志分析是 awk 的主场:
# 统计访问量前 10 的 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# 统计每种状态码的数量
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 找出响应时间超过 2 秒的请求(假设 $NF 是耗时)
awk '$NF > 2 {print $7, $NF}' access.log | head -20
# 按小时统计请求量
awk -F'[:[]' '{print $3":"$4}' access.log | sort | uniq -c
$1 是第一列,$NF 是最后一列,-F 指定分隔符。日志字段位置固定,所以按列取值很可靠。
组合起来
查某个接口最近报错的请求:
grep "/api/publish" access.log | grep " 500 " | awk '{print $1, $4, $7}' | tail -20
统计某个目录下代码总行数:
find app -name "*.py" -exec wc -l {} + | tail -1
批量替换文件名里的空格:
find . -name "* *" -type f -exec bash -c 'mv "$0" "${0// /_}"' {} \;
一个习惯
涉及删除、替换、批量改名的命令,一律先在前面加 echo 或者用 -print 看一遍输出。多花三秒钟,能避免很多事故。
- THE END -
最后修改:2023年6月10日
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:https://mi-blog.cn/archives/672
共有 0 条评论