跳转至

文件内容查看与处理

概述

查看和处理文件内容是安全测试中日志分析、配置审计和代码审查的基础技能。本文介绍了 cat、more、less、head、tail、grep、wc、diff 等常用命令,以及管道符号的强大组合能力。

文本文件和二进制文件

Linux中的文件分为两大类,查看和处理方式完全不同:

类型 编码/格式 常见扩展名 查看方式
文本文件 ASCII、UTF-8、Unicode、ANSI .txt、.xml、.conf、.properties、.yml、.log、源代码文件 cat、more、less、head、tail、vim等
二进制文件 机器码、特定格式编码 可执行程序、图片(.jpg/.png)、音频(.mp3)、视频(.mp4) 不能用文本工具直接查看,会显示乱码

专业解读:Linux的哲学是"一切皆文件",但处理文本文件和二进制文件的工具完全不同。试图用 cat 查看图片或二进制程序,终端会输出乱码甚至导致终端状态异常(可用 reset 命令恢复)。


cat - 连接并显示文件内容

全称:concatenate [kənˈkætəneɪt](连接)

格式cat [选项] 文件名

cat file.txt                  # 显示文件全部内容
cat -n file.txt               # 显示内容并带有行号
cat file1.txt file2.txt       # 连接多个文件并输出
cat file1.txt file2.txt > combined.txt  # 合并到新文件

专业解读:cat适合查看小文件。对于大文件(如几百MB的日志),cat会瞬间刷屏,无法阅读。此时应使用more/less分页查看。


more / less - 分页查看

more 命令

more redis.conf               # 分页查看文件
more +3 test.log              # 从第3行开始显示
more +/wuya test.log          # 从第一次出现"wuya"的位置开始显示

less 命令

less是more的增强版,功能更强大,推荐优先使用。

less redis.conf               # 分页查看
less -N redis.conf            # 显示行号

more/less 分屏操作

操作 按键
下一行 Enter
上一行 y
下一屏 Space 空格 或 Ctrl + F
上一屏 bCtrl + B
退出 qCtrl + CZZ

more/less 搜索

操作 按键
向下查找 /关键字 然后回车
向上查找 ?关键字 然后回车
查找下一个 n
查找上一个 N(大写)

专业解读:less比more更强大的一点是支持向前翻页(more只能向后),且less不会一次性加载整个文件到内存,对大文件更友好。查看日志文件时,强烈推荐使用 less


head / tail - 查看文件开头和结尾

head - 查看文件头部

head -n 10 redis.conf         # 显示前10行
head -n 20 file.txt           # 显示前20行(默认显示前10行)

tail - 查看文件尾部

tail -n 10 info.log           # 显示最后10行
tail -n 50 info.log           # 显示最后50行

tail -f - 实时追踪文件变化

tail -f /var/log/messages     # 实时监控日志文件的新增内容

专业解读tail -f 是运维工作中最常用的命令之一,用于实时监控日志输出。按 Ctrl + C 退出。更现代的替代是 tail -F(大写F),它在文件被轮转(rename/delete后新建同名文件)时也能继续追踪。


grep - 文本搜索过滤

全称:Globally search a Regular Expression and Print(全局搜索正则表达式并打印)

格式grep [选项] 模式 [文件名]

作用:在文件中搜索匹配指定模式(字符串或正则表达式)的行,并打印出来。

grep常用选项

选项 说明
-i 忽略大小写(ignore case)
-v 反向匹配,显示不包含模式的行
-n 显示行号
-r / -R 递归搜索目录
-l 只显示包含匹配内容的文件名
-c 只显示匹配的行数
-E 使用扩展正则表达式(等同于egrep)
-w 匹配整个单词
--color 高亮显示匹配内容
grep "error" app.log          # 在app.log中查找包含error的行
grep -i "error" app.log       # 忽略大小写
grep -n "error" app.log       # 显示行号
grep -v "debug" app.log       # 查找不包含debug的行
grep -r "TODO" /project/src/  # 递归搜索整个目录

专业解读:grep默认使用基本正则表达式(BRE),特殊字符如 + ? | () 需要转义。使用 -E 选项可启用扩展正则表达式(ERE),无需转义这些字符。egrep 命令等同于 grep -E


管道符号 (|)

管道 (Pipe) 是Linux最强大的特性之一。

作用:把前一个命令原本要输出到屏幕的数据,当作是后一个命令的标准输入。

command1 | command2 | command3

管道使用示例

# 分页查看长输出
cat test.log | more -5        # 每次显示5行

# 带行号分页查看
ps -ef | less -N              # 显示进程列表并带行号

# 查找特定端口
netstat -an | grep 3306       # 查看3306端口的连接情况

# 多级过滤
cat -n info.log | grep "debug" | more   # 先看行号,再过滤debug,再分页

专业解读:管道是进程间通信(IPC)的一种方式,它创建了一个内存缓冲区,前一个进程的标准输出写入缓冲区,后一个进程从缓冲区读取作为标准输入。管道是"匿名管道",只能用于有亲缘关系的进程(父子进程)。


wc - 统计文件内容

全称:word count

格式wc [选项] 文件名

选项 说明
-l / --lines 显示行数
-w / --words 显示字数(以空白分隔的单词数)
-c / --bytes 显示字节数
-m / --chars 显示字符数
wc -l redis.conf              # 统计文件有多少行
wc -w redis.conf              # 统计文件有多少个单词
wc -l *.txt                   # 统计多个文件的行数

专业解读wc -l 是统计代码行数、日志条目数的最常用工具。配合管道可以统计命令输出的行数,如 ps -ef | wc -l 统计当前运行的进程数量。


diff - 比较文件差异

全称:different

格式diff [选项] 文件1 文件2

diff diff_A.txt diff_B.txt    # 比较两个文本文件的差异
diff -r aaa bbb               # 递归比较两个目录的差异

diff输出格式说明: - a = add(增加) - c = change(修改) - d = delete(删除) - < 表示第一个文件的行 - > 表示第二个文件的行

专业解读:diff是版本控制(如Git)的基础工具。diff -u 输出统一格式(unified format),是patch文件的标准格式,更易读且适合用 patch 命令应用。对于二进制文件,应使用 cmpxxd 比较。


安全测试视角:日志分析与入侵检测 在安全运维和应急响应中,grep 和管道组合是最强大的日志分析工具:

# 查找可疑登录尝试
grep "Failed password" /var/log/secure

# 查找 SQL 注入特征
grep -i "union.*select\|sleep(\|benchmark(" /var/log/nginx/access.log

# 查找 Webshell 上传记录
grep -E "POST.*(shell|upload|cmd)" /var/log/apache2/access.log

# 统计攻击源 IP 频率
grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -rn | head -20

安全测试视角:敏感信息搜索 在渗透测试和代码审计中,快速搜索敏感信息是必备技能:

# 在代码库中搜索硬编码密钥
grep -r -n "api_key\|secret\|password\|token" ./src/

# 搜索配置文件中的明文密码
grep -rn "password.*=.*[^*]" /etc/ /var/www/ 2>/dev/null

# 查找包含私钥的文件
grep -rl "BEGIN PRIVATE KEY\|BEGIN RSA PRIVATE KEY" /home/ 2>/dev/null