Linux 运维入门:grep、sed、awk、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

最后

这四个命令没有哪个需要背下来,用多了自然就熟。我一般遇到什么需求现查现用,但上面这几条基本每周都要用。建议直接在自己的机器上敲一遍,比看十篇教程都管用。

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

最后

这四个命令没有哪个需要背下来,用多了自然就熟。我一般遇到什么需求现查现用,但上面这几条基本每周都要用。建议直接在自己的机器上敲一遍,比看十篇教程都管用。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注