命令行效率:find、grep、awk 的组合用法

米阳 2023-6-10 12 6/10

服务器上没有图形界面,找文件、查日志、改配置全靠命令行。这几个工具单独用都简单,组合起来能解决大部分日常问题。

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 -

米阳

6月10日09:15

最后修改:2023年6月10日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论