[Linux命令分享]日志查看 — — less
[Linux命令分享]日志查看 — — less
介绍
less 是一个功能强大的文本文件查看器,它允许用户逐页浏览大型文件内容。与 more 命令相比,less 提供了更多的导航选项和功能,可以向前或向后滚动文件内容。less 命令遵循"less is more"的理念,是Linux系统中查看文本文件的首选工具。
官方文档:https://greenwoodsoftware.com/less/

安装
# CentOS/RHEL系
yum install less# Ubuntu/Debian系
apt-get install less## 查看less版本
less --version
命令参数
显示行号(-N)
less -N zshrc

禁用行长截断(-S)
-S 参数用于处理长行文本,当文件中包含超过终端宽度的长行时,该参数会禁用自动换行显示。默认情况下,less 会对长行进行自动换行以适应终端宽度,使用 -S 后,长行会保持原样显示,超出部分需要通过左右滚动来查看。
案例:
# 构造测试文件
echo "2024-01-15 14:30:25.123 INFO com.example.service.UserService - User login attempt for user ID 12345 with IP address 192.168.1.100, device info: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36, session ID: abcdef1234567890abcdef1234567890" > application.log# 查看包含长日志行的文件。通过← → 方向键来观察超出屏幕部分的内容
less -S application.log
显示所有字符原始形式(-r)
-r 参数用于显示文件中字符的原始形式(如ANSI转义序列、颜色代码等),不进行任何处理或解释。字符会以原始形式显示在终端中,可能导致显示混乱,但保留了文件的原始内容。
案例:
# less:可能过滤或转换不可打印字符
# less -r:保留所有原始字节,不进行任何处理
less -r app.log
忽略大小写(-I)
默认情况下,less对字母的搜索是区分大小写的。如果要忽略大小写,可以使用less 命令结合-I选项
# 默认区分大小写
less test.log# -I 忽略大小写区分
less -I test.log


自动退出(-F)
-F参数根据文件长度决定是否进入交互模式,如果文件过长,屏幕装不下时,就会进进入交互模式。如果文件很小,行数很小,则不会进入交互模式,运行完之后直接退出。
# app.log文件,记录行数很多,屏幕放不下,则会进入交互模式,支持上下翻页
less -F app.log# test.log,一共3行,屏幕能放下,不会进入交互模式,运行完之后直接退出
less -F test.log


持续观察(+F)
less +F 命令用于持续观察文件内容的变化,类似于 tail -f 命令的功能。
# 持续观察monitor.txt文件,当monitor.txt文件有新增内容时,也会展示
less +F monitor.txt# ctrl/control + C 停止观察,然后按q键 退出less命令交互页面


退出持续观察:

测试文件:
# 1. 创建初始测试文件
echo -e "Line 1: Initial content\nLine 2: Starting content\nLine 3: Base content" > monitor.txt# 2. 执行less +F命令
less +F monitor.txt# 3. 新增一个终端,追加文件内容
# 向文件追加新行
echo "Line 4: Added content at $(date)" >> monitor.txt
sleep 2
echo "Line 5: More content added" >> monitor.txt
sleep 2
echo "Line 6: Final test line" >> monitor.txt# 4. ctrl/control + C 停止观察,然后按q键 退出less命令交互页面
交互参数
- /pattern - 向下搜索模式,也支持正则匹配
- ?pattern - 向上搜索模式,也支持正则匹配
- n - 查找下一个匹配项
- N - 查找上一个匹配项
- 空格键 或 Page Down - 向下翻页
- b 或 Page Up - 向上翻页
- 方向键↑/↓ - 向上/向下滚动一行
- d - 向下滚动半页
- u - 向上滚动半页
- g 或 Home - 跳转到文件开头
- G 或 End - 跳转到文件结尾
- 数字+G - 跳转到指定行号
- q 或 Q - 退出 less
- h - 显示帮助信息
- : - 进入命令模式
- v - 使用编辑器编辑当前文件
实际案例
接下来主要介绍我个人的习惯用法,仅供参考,毕竟合适自己的才是最好的。
- 大型日志文件中查找最近发生的特定事件,比如用户最近的操作、错误或警告信息。可以使用下面一系列命令:
# 查看日志
less -r app.log
# ---------- 从下往上搜索(找最近一次的请求) --------------
#跳到文件末尾
shift + G
# 查找zhangsan最近一次的请求
?zhangsan
# 然后通过n/N控制查找上一个匹配项还是下一个匹配项
n - 查找下一个匹配项
N - 查找上一个匹配项
- less -r app.log打开日志文件,并通过shift + G跳转到文件末尾

- ?zhangsan搜索zhangsan出现的位置

- 回车,我们就找到了zhangsan最后出现的位置

- 接着如果我们还想寻找zhangsan倒数第二次出现在文件中的位置(即向上寻找),按n键即可(注意区分大小写)

- 如果此时,我们向上找的太多,又想向下寻找,那么按N键即可(注意区分大小写)

最后效果:

- 有时,我们可能也需要定位到文件开始,找最早一次zhangsan出现的位置,那么只需要按g键即可定位到文件开始为止,然后通过/zhangsan向下搜索,通过n/N键控制上下寻找即可(注意区分大小写)


PS:
- G键 + ?zhangsan 向上搜索zhangsan (通过G键跳转到文件末尾,然后向上搜索)
- g键 + /zhangsan 向下搜索zhangsan(通过g键跳转到文件开头,然后向下搜索)
测试文件:
# 创建一个模拟的应用日志文件 app.log
cat > app.log << 'EOF'
2024-01-15 08:12:34 INFO UserService - User login attempt for user ID 12345
2024-01-15 08:15:22 DEBUG OrderService - Processing order #ORD-78945 for customer lisi
2024-01-15 08:18:45 WARN PaymentService - Payment timeout for transaction TXN-12345
2024-01-15 08:22:17 ERROR DatabaseService - Connection pool exhausted, max connections reached
2024-01-15 08:25:33 INFO EmailService - Sent notification email to user wangwu@example.com
2024-01-15 08:30:15 DEBUG CacheService - Cache hit ratio: 87.5% for region USER_PROFILE
2024-01-15 08:35:42 INFO UserService - User profile updated for user ID 98765
2024-01-15 08:40:28 WARN SecurityService - Failed login attempt from IP 192.168.1.100 for user zhangsan
2024-01-15 08:45:13 ERROR AuthService - Authentication failed for user zhangsan due to invalid credentials
2024-01-15 08:50:56 INFO AuditService - User zhangsan accessed resource /api/users/profile
2024-01-15 08:55:24 DEBUG LoggingService - Log level changed from INFO to DEBUG
2024-01-15 09:00:37 INFO NotificationService - Push notification sent to device ID DEV-55555 for user lisi
2024-01-15 09:05:48 WARN FileService - Disk space usage reached 85% on volume /data
2024-01-15 09:10:15 INFO ReportService - Generated daily report for 2024-01-14 with 1250 records
2024-01-15 09:15:32 ERROR EmailService - Failed to send email to zhangsan@company.com, SMTP timeout
2024-01-15 09:20:44 DEBUG MonitoringService - CPU usage spike detected: 92% at 09:20:43
2024-01-15 09:25:17 INFO BackupService - Starting daily backup process for database PROD_DB
2024-01-15 09:30:29 WARN NetworkService - High latency detected on interface eth0, avg: 156ms
2024-01-15 09:35:55 INFO UserService - User zhangsan successfully logged in from IP 192.168.1.105
2024-01-15 09:40:12 DEBUG SessionService - Session timeout extended for user zhangsan, new expiry: 2024-01-15 10:40:12
2024-01-15 09:45:38 ERROR PaymentService - Payment processing failed for user zhangsan, order #ORD-99999
2024-01-15 09:50:25 INFO APIService - API rate limit increased to 5000 req/min for premium users
2024-01-15 09:55:47 WARN CacheService - Cache eviction triggered for region PRODUCT_CATALOG, 15% items removed
2024-01-15 10:00:13 INFO UserService - Password reset requested for user zhangsan
2024-01-15 10:05:29 DEBUG SearchService - Indexed 2500 documents in 3.2 seconds, avg: 781 docs/sec
2024-01-15 10:10:44 ERROR NotificationService - Failed to send SMS to user zhangsan, gateway timeout
2024-01-15 10:15:18 INFO AuditService - User zhangsan modified settings in admin panel
2024-01-15 10:20:33 WARN SecurityService - Multiple failed login attempts detected for user zhangsan
2024-01-15 10:25:56 INFO AnalyticsService - Generated user activity report for zhangsan, 45 actions recorded
2024-01-15 10:30:22 DEBUG DatabaseService - Connection pool utilization: 78% (39/50 connections)
2024-01-15 10:35:47 ERROR AuthService - Session expired for user zhangsan, token invalid
2024-01-15 10:40:15 INFO UserService - User zhangsan logged out, session duration: 2 hours 15 minutes
EOF
- 查看多个文件
# 同时查看多个文件
less file1.txt file2.txt file3.txt
# 使用 :n 切换到下一个文件
# 使用 :p 切换到上一个文件
# 使用 :q 退出

输入:n查看下一个文件:


输入:p查看上一个文件:


如果不想查看了,输入:q退出查看:


测试文件:
# 创建第一个测试文件
echo -e "This is the content of file 1.\nIt has multiple lines.\nEnd of file 1." > file1.txt# 创建第二个测试文件
echo -e "Content of file 2 is here.\nThis file contains different text.\nFile 2 ends here." > file2.txt# 创建第三个测试文件
echo -e "Finally, this is file 3.\nThe last file in our example.\nGoodbye from file 3." > file3.txt
- 翻看历史命令
有时,可能一段很长的命令,但是我们不记得整个怎么写了,只记得部分,那么就可以通过下面命令来定位
# 翻看最近两百条历史命令,并通过管道传递给less命令
history -n 200 | less
# 然后就可以通过n/N键通过搜索关键字快速定位到整行的命令
- 查看系统日志
# 查看内核日志并启用行号显示
dmesg | less -N
- 实时监控文件变化
# 方式一:tail命令配合less
tail -f logfile.txt | less# 方式二:直接通过+F参数
less +F logfile.txt
- 正则匹配
进入交互模式后,通过/pattern或者?pattern 输入正则表达式,进行正则匹配搜索
# 向后搜索包含 "content" 的行
?content# 使用正则表达式搜索
?file$ # 匹配以 "file" 结尾的行


测试文件:
echo -e "Line 1: Start of file\nLine 2: Contains number 123\nLine 3: Another line\nLine 4: End of file" > test_pattern.txt
