文件内容查看与处理¶
概述¶
查看和处理文件内容是安全测试中日志分析、配置审计和代码审查的基础技能。本文介绍了 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 命令¶
less 命令¶
less是more的增强版,功能更强大,推荐优先使用。
more/less 分屏操作¶
| 操作 | 按键 |
|---|---|
| 下一行 | Enter 或 ↓ |
| 上一行 | y 或 ↑ |
| 下一屏 | Space 空格 或 Ctrl + F |
| 上一屏 | b 或 Ctrl + B |
| 退出 | q 或 Ctrl + C 或 ZZ |
more/less 搜索¶
| 操作 | 按键 |
|---|---|
| 向下查找 | /关键字 然后回车 |
| 向上查找 | ?关键字 然后回车 |
| 查找下一个 | n |
| 查找上一个 | N(大写) |
专业解读:less比more更强大的一点是支持向前翻页(more只能向后),且less不会一次性加载整个文件到内存,对大文件更友好。查看日志文件时,强烈推荐使用
less。
head / tail - 查看文件开头和结尾¶
head - 查看文件头部¶
tail - 查看文件尾部¶
tail -f - 实时追踪文件变化¶
专业解读:
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最强大的特性之一。
作用:把前一个命令原本要输出到屏幕的数据,当作是后一个命令的标准输入。
管道使用示例¶
# 分页查看长输出
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是统计代码行数、日志条目数的最常用工具。配合管道可以统计命令输出的行数,如ps -ef | wc -l统计当前运行的进程数量。
diff - 比较文件差异¶
全称:different
格式:diff [选项] 文件1 文件2
diff输出格式说明:
- a = add(增加)
- c = change(修改)
- d = delete(删除)
- < 表示第一个文件的行
- > 表示第二个文件的行
专业解读:diff是版本控制(如Git)的基础工具。
diff -u输出统一格式(unified format),是patch文件的标准格式,更易读且适合用patch命令应用。对于二进制文件,应使用cmp或xxd比较。
安全测试视角:日志分析与入侵检测 在安全运维和应急响应中,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安全测试视角:敏感信息搜索 在渗透测试和代码审计中,快速搜索敏感信息是必备技能: