Linux:这啥命令?这台服务器我说了算-文本处理——“日志几万行,难道让我一行一行看?”
第七章:文本处理——“日志几万行,难道让我一行一行看?”
真正开始用 Linux 之后,你迟早会遇到这种场面:
access.log
error.log
app.log
system.log
打开一看,几万行起步。
这时候如果你还想:
“我慢慢翻,总能找到。”
那服务器可能都修好了,你还在第 837 行。
Linux 的强项之一,就是处理文本。
1. cat:先看一眼文件
最简单:
cat file.txt
查看整个文件。
如果文件只有十几行,很方便。
但如果日志有几十万行:
cat access.log
终端就会像瀑布一样刷屏。
所以:
cat适合小文件,不适合拿来硬刚大型日志。
查看并显示行号:
cat -n file.txt
2. less:大文件要“翻着看”
更推荐:
less access.log
常用操作:
↑ ↓ 上下移动
PageUp 向上翻页
PageDown 向下翻页
/keyword 搜索
n 下一个匹配
N 上一个匹配
q 退出
比如搜索:
/error
就能快速找日志里的 error。
口诀:
小文件
cat,大文件less。
3. head 和 tail:我只看开头和结尾
看前 10 行:
head access.log
前 20 行:
head -n 20 access.log
看最后 10 行:
tail access.log
最后 50 行:
tail -n 50 access.log
排查服务日志时,tail 特别常用。
因为报错通常发生在文件最后。
4. tail -f:实时蹲守日志
想实时观察日志增长:
tail -f app.log
这时候程序每写一行日志,你的终端就跟着显示。
很适合:
我点一下按钮
↓
日志冒出来
↓
看看程序到底干了什么
退出:
Ctrl + C
如果你在排查 Nginx:
sudo tail -f /var/log/nginx/access.log
另开一个终端访问网站,就能看到请求实时出现。
5. grep:在文本海洋里捞针
找包含 error 的行:
grep "error" app.log
忽略大小写:
grep -i "error" app.log
显示行号:
grep -n "error" app.log
反向匹配,也就是“不包含”:
grep -v "DEBUG" app.log
递归搜索目录:
grep -r "database" /etc/myapp/
多个条件可以用扩展正则:
grep -E "error|fail|fatal" app.log
这条在排错时很好用。
6. 管道符 |:Linux 的乐高积木
Linux 很多命令之所以强,是因为可以组合。
管道符:
|
意思是:
“把左边命令的输出,交给右边继续处理。”
比如:
ps aux | grep nginx
左边列出进程,右边筛选 Nginx。
查日志里的错误:
grep "ERROR" app.log | tail -n 20
意思是:
找出所有错误,只看最后 20 条。
7. wc:数一数到底有多少
统计行数:
wc -l app.log
统计单词数:
wc -w file.txt
统计字节:
wc -c file.txt
比如想知道日志里有多少条错误:
grep "ERROR" app.log | wc -l
这就从“我感觉错误很多”升级成了:
“一共有 237 条。”
8. cut:我只要这一列
假设文件:
alice:18:Shanghai
bob:20:Beijing
tom:22:Shenzhen
只取第一列:
cut -d ':' -f 1 users.txt
其中:
-d ':' 指定分隔符
-f 1 取第一列
输出:
alice
bob
tom
处理结构固定的文本时非常方便。
9. sort 和 uniq:排序、去重
排序:
sort names.txt
数字排序:
sort -n numbers.txt
去重:
uniq names.txt
注意:
uniq只会去掉相邻的重复行。
所以常见组合是:
sort names.txt | uniq
统计每个值出现次数:
sort names.txt | uniq -c
按出现次数排序:
sort names.txt | uniq -c | sort -nr
10. 实战:统计谁访问网站最多
Nginx 访问日志常见格式中,第一列一般是客户端 IP。
可以这样统计:
awk '{print $1}' /var/log/nginx/access.log \
| sort \
| uniq -c \
| sort -nr \
| head
于是你就能看到:
“今天到底是谁疯狂刷新我的网站?”
这里先记住 awk 的用法就行,后面还会专门讲。
11. 本章挑战
准备一个文件:
cat > users.txt <<EOF
alice
bob
tom
alice
bob
alice
jack
EOF
完成下面任务:
- 查看文件总行数
- 找出所有
alice - 统计
alice出现几次 - 对全部名字排序
- 去除重复名字
- 统计每个名字出现次数
- 按次数从高到低排列
参考思路:
wc -l users.txt
grep "alice" users.txt
grep "alice" users.txt | wc -l
sort users.txt
sort users.txt | uniq
sort users.txt | uniq -c
sort users.txt | uniq -c | sort -nr
如果这些命令你已经能自然组合,说明你开始理解 Linux 的核心玩法:
一个命令做好一件事,再用管道把它们拼起来。
本章速查
cat file.txt
less file.txt
head -n 20 file.txt
tail -n 50 file.txt
tail -f app.log
grep "ERROR" app.log
grep -i "error" app.log
grep -n "error" app.log
grep -v "DEBUG" app.log
grep -E "error|fail|fatal" app.log
wc -l file.txt
cut -d ':' -f 1 file.txt
sort file.txt
sort -n file.txt
sort file.txt | uniq
sort file.txt | uniq -c
sort file.txt | uniq -c | sort -nr
下一章:
《第八章:Shell 脚本——“每天都敲一遍?我又不是打字员。”》
- 点赞
- 收藏
- 关注作者
评论(0)