读与搜 · Linux 与命令行
在终端里怎么读文件、搜文件?
课程目录为什么需要它
出问题时第一件事就是看日志,而日志可能有几百万行。你不会用编辑器打开它们;你会要最后几行、数一数错误、搜某一个用户。几条命令就够了。
直觉理解
cat 文件:打印整个文件head -n 3 文件、tail -n 3 文件:前 3 行或后 3 行wc -l 文件:数行数grep 词 文件:只显示包含这个词的行
grep 有几个好用的开关:-i 不区分大小写,-c 数匹配的行,-n 显示行号,-v 显示不匹配的行,-r 搜整个文件夹。
定义
grep
Prints the lines of its input that match a pattern. If nothing matches it prints nothing and reports failure, which scripts can test.打印输入里匹配某个模式的行。什么都没匹配到时,它什么也不打印并报告失败,脚本可以检测这一点。
选项(开关)
A word starting with - that changes what a command does, like `-n 3` or `-i`. Several single-letter options can be joined: `-in`.以 - 开头、改变命令行为的词,比如 `-n 3` 或 `-i`。多个单字母选项可以合在一起写:`-in`。
示例
先看一眼日志
在互动课里运行它有多长,开头是什么,最后发生了什么?
wc -l logs/app.log
head -n 2 logs/app.log
tail -n 1 logs/app.log逐步执行
- L18 行。
8 logs/app.log - L2前两行。
09:00 INFO server started - L3最后一行:最近发生的事。
09:20 INFO user ada logged out
用 grep 搜索
在互动课里运行找出错误、数一数,再找出所有不是 INFO 的行。
grep ERROR logs/app.log
grep -c ERROR logs/app.log
grep -v INFO logs/app.log
grep -in "ADA" logs/app.log逐步执行
- L1有三行包含 ERROR。
- L2-c 打印数量,而不是那些行。
3 - L3-v:WARN 和 ERROR 的行,所有不是 INFO 的。
- L4-i 忽略大小写,-n 加上行号。
2:09:01 INFO user ada logged in
常见错误
对大文件用 cat
对 2 GB 的日志用 cat,屏幕会被刷好几分钟。先用 wc -l、head、tail,或者直接 grep 你要找的东西。
grep 区分大小写
grep error 找不到 ERROR。不确定大小写时加 -i。
小测验
1. 这段代码会输出什么?
grep -c payment logs/app.log查看答案
答案:A
有两行提到了 payment timeout。
2. 这段代码会输出什么?
grep -v -c ERROR logs/app.log查看答案
答案:A
8 行里有 3 行包含 ERROR,所以 5 行不包含。
动手练习
3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。
- 预测输出读用户表
准确写出这些命令打印的内容。
- 改需求只看问题
这条命令打印日志的每一行。改成只打印 WARN 或 ERROR 的行,并带上行号。(提示:它们就是不是 INFO 的那些行。)
- 从零写谁登录过?
打印
logs/app.log里所有包含logged in的行,再打印包含ERROR的行数。
本课术语
| 术语 | 中文 | 英文定义 |
|---|---|---|
| Log file | 日志文件 | A file a program appends a line to for each thing that happens. |
| Option (flag) | 选项 | A word starting with - that changes what a command does. |