grep:在文件里搜内容

grep "ERROR" /var/log/syslog          # 找含 ERROR 的行
grep -i "error" file.txt              # 忽略大小写(-i)
grep -n "ERROR" file.txt              # 显示行号(-n)
grep -r "TODO" src/                   # 递归找目录(-r)
grep -v "DEBUG" log.txt               # 反向(不含的行,-v)
grep -c "ERROR" log.txt               # 统计匹配行数(-c)
grep -A 3 "ERROR" log.txt             # 匹配行 + 后 3 行
grep -B 2 "ERROR" log.txt             # 匹配行 + 前 2 行
grep -C 2 "ERROR" log.txt             # 匹配行 + 前后各 2 行

正则表达式基础

grep "^ERROR" log.txt        # 行首 ERROR
grep "ERROR$" log.txt        # 行尾 ERROR
grep "^$" file.txt           # 空行
grep "user[0-9]" log.txt     # user 后跟一个数字
grep "[a-zA-Z]" file.txt     # 一个字母
grep "abc.def" file.txt      # . = 任意一个字符
grep "a.*b" file.txt         # a 后跟任意(包括 0 个)字符再跟 b
grep -E "(cat|dog)" f.txt    # -E = 扩展正则(启用 | 等)

管道符 |:把上一个命令的输出喂给下一个

这是 Linux 哲学的精华

每个工具做好一件事,用管道串起来完成复杂任务。

# 看含 ERROR 的最近 20 条日志
tail -1000 /var/log/syslog | grep ERROR | tail -20

# 统计某个 IP 在日志中出现次数
grep "192.168.1.1" access.log | wc -l

# 看占用最多内存的 5 个进程
ps aux | sort -k 4 -r | head -5

# 找含某字符串的 .py 文件
find . -name "*.py" | xargs grep -l "TODO"

# 处理 CSV:取第 2 列、去重、排序、计数
cut -d, -f2 data.csv | sort | uniq -c | sort -rn

重定向:把输出存进文件

ls -l > out.txt              # 覆盖写
ls -l >> out.txt             # 追加
ls /nonexistent 2> err.txt   # 错误输出(stderr)
ls -l > out.txt 2>&1         # stderr 合并到 stdout,再写文件
ls -l &> out.txt             # 同上简写
command > /dev/null          # 丢掉输出
command < input.txt          # 从文件读输入

实战:分析 Nginx 访问日志

# 1. 看请求最多的 IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10

# 2. 看 500 错误
grep ' 500 ' access.log | tail -50

# 3. 统计某 URL 的请求数
grep '/api/users' access.log | wc -l

# 4. 找慢请求(响应时间 > 1 秒,假设第 N 列是时间)
awk '$NF > 1' access.log | head

下一篇:grep 之外的两大神器——sed + awk。