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。