find 在目录树里翻文件,条件很丰富。删东西前一定先用 -print 或 ls 确认一遍,别一个手滑。
find /etc -name "*.conf"
find /tmp -type f -size +10M
find /var/log -name "*.log" -mtime +30 -exec rm -f {} \;
find /opt/scripts -name "*.sh" -exec chmod +x {} \;
组合起来才好玩
单个命令解决不了的事,管道一连就通了:
# 把 nginx 下所有 conf 的 80 改成 8080
find /etc/nginx -name "*.conf" -type f -exec sed -i 's/80/8080/g' {} \;
# 近 7 天日志里 500 错误的来源 IP 排行
find /var/log/nginx -name "*.log" -mtime -7 -type f -exec grep "500" {} \; | awk '{print $1}' | sort | uniq -c | sort -nr
最后
这四个命令没有哪个需要背下来,用多了自然就熟。我一般遇到什么需求现查现用,但上面这几条基本每周都要用。建议直接在自己的机器上敲一遍,比看十篇教程都管用。
awk 按列切,日志统计一把好手。常用内置变量:$1..$n 是第几列,-F 指定分隔符,NR 行号,NF 列数。
awk -F: '{print $1, $3}' /etc/passwd # 用户名和 UID
awk '{ip[$1]++} END{for(i in ip) print i, ip[i]}' access.log | sort -nr # 每个 IP 的访问量
ps aux | awk 'NR>1 {print $4,$11}' | sort -nr | head -5 # 内存占用前 5 的进程
find:找文件 + 顺手处理
find 在目录树里翻文件,条件很丰富。删东西前一定先用 -print 或 ls 确认一遍,别一个手滑。
find /etc -name "*.conf"
find /tmp -type f -size +10M
find /var/log -name "*.log" -mtime +30 -exec rm -f {} \;
find /opt/scripts -name "*.sh" -exec chmod +x {} \;
组合起来才好玩
单个命令解决不了的事,管道一连就通了:
# 把 nginx 下所有 conf 的 80 改成 8080
find /etc/nginx -name "*.conf" -type f -exec sed -i 's/80/8080/g' {} \;
# 近 7 天日志里 500 错误的来源 IP 排行
find /var/log/nginx -name "*.log" -mtime -7 -type f -exec grep "500" {} \; | awk '{print $1}' | sort | uniq -c | sort -nr
最后
这四个命令没有哪个需要背下来,用多了自然就熟。我一般遇到什么需求现查现用,但上面这几条基本每周都要用。建议直接在自己的机器上敲一遍,比看十篇教程都管用。
sed 最常用就是替换。记住 -i 是直接改文件,生产环境动手前先备一份。
sed -i 's/listen 80;/listen 8080;/g' nginx.conf
sed -i '/^$/d;/^#/d' redis.conf # 清掉空行和注释
sed 's/localhost/127.0.0.1/g' hosts # 不加 -i 只预览
awk:专治结构化文本
awk 按列切,日志统计一把好手。常用内置变量:$1..$n 是第几列,-F 指定分隔符,NR 行号,NF 列数。
awk -F: '{print $1, $3}' /etc/passwd # 用户名和 UID
awk '{ip[$1]++} END{for(i in ip) print i, ip[i]}' access.log | sort -nr # 每个 IP 的访问量
ps aux | awk 'NR>1 {print $4,$11}' | sort -nr | head -5 # 内存占用前 5 的进程
find:找文件 + 顺手处理
find 在目录树里翻文件,条件很丰富。删东西前一定先用 -print 或 ls 确认一遍,别一个手滑。
find /etc -name "*.conf"
find /tmp -type f -size +10M
find /var/log -name "*.log" -mtime +30 -exec rm -f {} \;
find /opt/scripts -name "*.sh" -exec chmod +x {} \;
组合起来才好玩
单个命令解决不了的事,管道一连就通了:
# 把 nginx 下所有 conf 的 80 改成 8080
find /etc/nginx -name "*.conf" -type f -exec sed -i 's/80/8080/g' {} \;
# 近 7 天日志里 500 错误的来源 IP 排行
find /var/log/nginx -name "*.log" -mtime -7 -type f -exec grep "500" {} \; | awk '{print $1}' | sort | uniq -c | sort -nr
最后
这四个命令没有哪个需要背下来,用多了自然就熟。我一般遇到什么需求现查现用,但上面这几条基本每周都要用。建议直接在自己的机器上敲一遍,比看十篇教程都管用。
grep 就是在文件里按关键字捞行。几个我离不开的参数:-i 忽略大小写、-n 带行号、-r 递归目录、-v 反选(排掉注释很香)、-c 数次数。
grep "Failed password" /var/log/secure # 看谁在爆破 ssh
grep -ni "error" application.log
grep -c "404" access.log # 统计 404 出现次数
sed:批量改最省事
sed 最常用就是替换。记住 -i 是直接改文件,生产环境动手前先备一份。
sed -i 's/listen 80;/listen 8080;/g' nginx.conf
sed -i '/^$/d;/^#/d' redis.conf # 清掉空行和注释
sed 's/localhost/127.0.0.1/g' hosts # 不加 -i 只预览
awk:专治结构化文本
awk 按列切,日志统计一把好手。常用内置变量:$1..$n 是第几列,-F 指定分隔符,NR 行号,NF 列数。
awk -F: '{print $1, $3}' /etc/passwd # 用户名和 UID
awk '{ip[$1]++} END{for(i in ip) print i, ip[i]}' access.log | sort -nr # 每个 IP 的访问量
ps aux | awk 'NR>1 {print $4,$11}' | sort -nr | head -5 # 内存占用前 5 的进程
find:找文件 + 顺手处理
find 在目录树里翻文件,条件很丰富。删东西前一定先用 -print 或 ls 确认一遍,别一个手滑。
find /etc -name "*.conf"
find /tmp -type f -size +10M
find /var/log -name "*.log" -mtime +30 -exec rm -f {} \;
find /opt/scripts -name "*.sh" -exec chmod +x {} \;
组合起来才好玩
单个命令解决不了的事,管道一连就通了:
# 把 nginx 下所有 conf 的 80 改成 8080
find /etc/nginx -name "*.conf" -type f -exec sed -i 's/80/8080/g' {} \;
# 近 7 天日志里 500 错误的来源 IP 排行
find /var/log/nginx -name "*.log" -mtime -7 -type f -exec grep "500" {} \; | awk '{print $1}' | sort | uniq -c | sort -nr
最后
这四个命令没有哪个需要背下来,用多了自然就熟。我一般遇到什么需求现查现用,但上面这几条基本每周都要用。建议直接在自己的机器上敲一遍,比看十篇教程都管用。
作者:司陌笙
环境:阿里云 ECS / Alibaba Cloud Linux 3
标签:阿里云、运维学习
刚开始摸 Linux 运维的时候,最怕的就是对着一堆日志和配置文件发呆。后来发现,真正天天在用的文本/文件处理命令就这四个:grep、sed、awk、find。它们单独用已经很强,串起来就是一条排障流水线。下面把我常用的姿势记一下,都是在我阿里云 ECS(Alibaba Cloud Linux 3)上实测过的。
先记一张速查表
| 命令 | 干啥用 | 一句例子 |
| grep | 按关键字捞行 | grep “error” app.log |
| sed | 改文件内容 | sed -i ‘s/old/new/g’ file |
| awk | 按列拆、做统计 | awk ‘{print $1}’ access.log |
| find | 在目录里翻文件 | find / -name “*.conf” |
grep:先学会”看”
grep 就是在文件里按关键字捞行。几个我离不开的参数:-i 忽略大小写、-n 带行号、-r 递归目录、-v 反选(排掉注释很香)、-c 数次数。
grep "Failed password" /var/log/secure # 看谁在爆破 ssh
grep -ni "error" application.log
grep -c "404" access.log # 统计 404 出现次数
sed:批量改最省事
sed 最常用就是替换。记住 -i 是直接改文件,生产环境动手前先备一份。
sed -i 's/listen 80;/listen 8080;/g' nginx.conf
sed -i '/^$/d;/^#/d' redis.conf # 清掉空行和注释
sed 's/localhost/127.0.0.1/g' hosts # 不加 -i 只预览
awk:专治结构化文本
awk 按列切,日志统计一把好手。常用内置变量:$1..$n 是第几列,-F 指定分隔符,NR 行号,NF 列数。
awk -F: '{print $1, $3}' /etc/passwd # 用户名和 UID
awk '{ip[$1]++} END{for(i in ip) print i, ip[i]}' access.log | sort -nr # 每个 IP 的访问量
ps aux | awk 'NR>1 {print $4,$11}' | sort -nr | head -5 # 内存占用前 5 的进程
find:找文件 + 顺手处理
find 在目录树里翻文件,条件很丰富。删东西前一定先用 -print 或 ls 确认一遍,别一个手滑。
find /etc -name "*.conf"
find /tmp -type f -size +10M
find /var/log -name "*.log" -mtime +30 -exec rm -f {} \;
find /opt/scripts -name "*.sh" -exec chmod +x {} \;
组合起来才好玩
单个命令解决不了的事,管道一连就通了:
# 把 nginx 下所有 conf 的 80 改成 8080
find /etc/nginx -name "*.conf" -type f -exec sed -i 's/80/8080/g' {} \;
# 近 7 天日志里 500 错误的来源 IP 排行
find /var/log/nginx -name "*.log" -mtime -7 -type f -exec grep "500" {} \; | awk '{print $1}' | sort | uniq -c | sort -nr
最后
这四个命令没有哪个需要背下来,用多了自然就熟。我一般遇到什么需求现查现用,但上面这几条基本每周都要用。建议直接在自己的机器上敲一遍,比看十篇教程都管用。