人人都能学编程
English 开始学习
核心 · Linux第 2 课 / 共 6 课免费阅读

读与搜 · 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
逐步执行
  1. L18 行。8 logs/app.log
  2. L2前两行。09:00 INFO server started
  3. 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
逐步执行
  1. L1有三行包含 ERROR。
  2. L2-c 打印数量,而不是那些行。3
  3. L3-v:WARN 和 ERROR 的行,所有不是 INFO 的。
  4. 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
  1. A
    2
  2. B
    3
  3. C
    1
查看答案

答案:A

有两行提到了 payment timeout。

2. 这段代码会输出什么?

grep -v -c ERROR logs/app.log
  1. A
    5
  2. B
    3
  3. C
    8
查看答案

答案:A

8 行里有 3 行包含 ERROR,所以 5 行不包含。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  1. 预测输出读用户表

    准确写出这些命令打印的内容。

  2. 改需求只看问题

    这条命令打印日志的每一行。改成只打印 WARN 或 ERROR 的行,并带上行号。(提示:它们就是不是 INFO 的那些行。)

  3. 从零写谁登录过?

    打印 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.