文件查看命令
文件查看命令
cat命令
文件处理
cat命令连接文件并打印到标准输出设备上,cat经常用来显示文件的内容,类似于下的type命令。
注意:当文件较大时,文本在屏幕上迅速闪过(滚屏),用户往往看不清所显示的内容。因此,一般用more等命令分屏显示。为了控制滚屏,可以按Ctrl+S键,停止滚屏;按Ctrl+Q键可以恢复滚屏。按Ctrl+C(中断)键可以终止该命令的执行,并且返回Shell提示符状态。
语法
cat(选项)(参数)选项
-n或-number:有1开始对所有输出的行数编号;
-b或--number-nonblank:和-n相似,只不过对于空白行不编号;
-s或--squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行;
-A:显示不可打印字符,行尾显示"$";
-e:等价于"-vE"选项;
-t:等价于"-vT"选项;参数
文件列表:指定要连接的文件列表。
实例
设ml和m2是当前目录下的两个文件
cat m1 (在屏幕上显示文件ml的内容)
cat m1 m2 (同时显示文件ml和m2的内容)
cat m1 m2 > file (将文件ml和m2合并后放入文件file中)cat 高级用法
# 显示文件并显示行号(最常用)
cat -n /etc/passwd
# 只对非空行编号
cat -b /etc/nginx/nginx.conf
# 压缩连续空行为一行
cat -s /var/log/messages
# 显示所有不可见字符(调试文件格式问题非常有用)
cat -A file.txt
# 输出中 $ 表示行尾,^I 表示 Tab,M- 表示高位字符
# 创建文件并写入内容(heredoc 用法)
cat > /tmp/config.txt << 'EOF'
server.port=8080
server.host=0.0.0.0
log.level=info
EOF
# 追加内容到文件
cat >> /tmp/config.txt << 'EOF'
database.url=jdbc:mysql://localhost:3306/mydb
EOF
# 安全地查看包含特殊字符的文件
cat -- "-filename-with-dash"
# 将多个文件合并为一个
cat header.txt body.txt footer.txt > full_document.txt
# 行号从指定数字开始
cat -n /etc/hosts | awk '{printf "%5d\t%s\n", NR+99, $0}'
# 查看二进制文件的前几个字节(配合 hexdump)
cat /bin/ls | hexdump -C | head -20
# 反向显示文件(配合 nl)
cat -n file.txt | tac
# 去除空行后显示
cat -s file.txt | grep -v '^$'
# cat 配合 sed 删除注释行
cat /etc/my.cnf | sed 's/^[[:space:]]*#.*$//' | sed '/^$/d'
# 将文件内容转换为大写
cat file.txt | tr 'a-z' 'A-Z'tac命令
文件过滤分割与合并
tac命令用于将文件已行为单位的反序输出,即第一行最后显示,最后一行先显示。
语法
tac(选项)(参数)选项
-a或——append:将内容追加到文件的末尾;
-i或——ignore-interrupts:忽略中断信号。参数
文件列表:指定要保存内容的文件列表。
tac 高级用法
# 反序查看日志文件(最新日志在最前面)
tac /var/log/syslog | head -50
# 反序查看配置文件
tac /etc/nginx/nginx.conf
# 按指定分隔符反序(默认分隔符是换行符)
# 例如以 . 为分隔符反序显示 IP 地址的各段
echo "192.168.1.100" | tac -s '.'
# 查看文件最后修改的内容(反向查看 diff 输出)
tac diff_output.patch | less
# 查看文件中每行反转但行序不变(配合 rev)
tac file.txt | rev # 完全反转
rev file.txt # 每行反转,行序不变
# 合并多个文件并反序输出
tac file1.txt file2.txt file3.txt
# 反向查看日志中某个模式最后一次出现
tac /var/log/app.log | grep -m1 "ERROR"head命令
文件内容查看
head命令用于显示文件的开头的内容。在默认情况下,head命令显示文件的头10行内容。
语法
head(选项)(参数)选项
-n<数字>:指定显示头部内容的行数;
-c<字符数>:指定显示头部内容的字符数;
-v:总是显示文件名的头信息;
-q:不显示文件名的头信息。参数
文件列表:指定显示头部内容的文件列表。
head 高级用法
# 显示文件前 20 行
head -n 20 /var/log/messages
# 显示文件前 100 个字节
head -c 100 /var/log/messages
# 显示文件前 1KB
head -c 1024 binary_file.dat
# 显示多个文件,不显示文件名头
head -q file1.txt file2.txt
# 从文件开头显示到第 50 行(等同于 head -n 50)
head -n 50 file.txt
# 显示除了最后 N 行以外的所有行
head -n -5 file.txt # 显示除最后 5 行外的所有内容
# 查看文件的前几行,确认文件编码
head -c 3 file.txt | xxd
# 配合管道查看排序后前 10 个最大的文件
du -h /var/log/* | sort -rh | head -10
# 查看每个日志文件的前 3 行
head -n 3 /var/log/app/*.log
# 显示 CSV 文件的表头
head -n 1 data.csv
# 从标准输入读取
echo -e "line1\nline2\nline3" | head -n 2
# 显示多个文件内容,总是显示文件名
head -v file1.txt file2.txt
# 查看前 N 行并显示行号
head -n 20 file.txt | cat -ntail命令
文件内容查看
tail命令用于输入文件中的尾部内容。tail命令默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题。如果没有指定文件或者文件名为"-",则读取标准输入。
注意:如果表示字节或行数的N值之前有一个"+"号,则从文件开头的第N项开始显示,而不是显示文件的最后N项。N值后面可以有后缀:b表示512,k表示1024,m表示1 048576(1M)。
语法
tail(选项)(参数)选项
--retry:即是在tail命令启动时,文件不可访问或者文件稍后变得不可访问,都始终尝试打开文件。使用此选项时需要与选项"--follow=name"连用;
-c<N>或--bytes=<N>:输出文件尾部的N(N为整数)个字节内容;
-f<name/descriptor>或;--follow<nameldescript>:显示文件最新追加的内容。"name"表示以文件名的方式监视文件的变化。"-f"与"-fdescriptor"等效;
-F:与选项"-follow=name"和"--retry"连用时功能相同;
-n<N>或--line=<N>:输出文件的尾部N(N位数字)行内容。
--pid=<进程号>:与"-f"选项连用,当指定的进程号的进程终止后,自动退出tail命令;
-q或--quiet或--silent:当有多个文件参数时,不输出各个文件名;
-s<秒数>或--sleep-interal=<秒数>:与"-f"选项连用,指定监视文件变化时间隔的秒数;
-v或--verbose:当有多个文件参数时,总是输出各个文件名;
--help:显示指令的帮助信息;
--version:显示指令的版本信息。参数
文件列表:指定要显示尾部内容的文件列表。
实例
tail file (显示文件file的最后10行)
tail +20 file (显示文件file的内容,从第20行至文件末尾)
tail -c 10 file (显示文件file的最后10个字符)tail 高级用法
# 实时跟踪日志文件(最常用的运维命令之一)
tail -f /var/log/messages
# 实时跟踪日志,显示行号
tail -f -n 0 /var/log/app.log | cat -n
# 实时跟踪多个文件
tail -f /var/log/nginx/access.log /var/log/nginx/error.log
# -F 选项:文件被 rotated(重命名)后自动跟踪新文件
tail -F /var/log/syslog
# -F 等同于 --follow=name --retry
# 跟踪日志并过滤(只看 ERROR)
tail -f /var/log/app.log | grep --line-buffered "ERROR"
# 跟踪日志并过滤多个关键字
tail -f /var/log/app.log | grep --line-buffered -E "ERROR|WARN|Exception"
# 跟踪日志并高亮关键字
tail -f /var/log/app.log | grep --color=auto "ERROR"
# 跟踪日志并显示时间戳
tail -f /var/log/app.log | while read line; do echo "$(date '+%Y-%m-%d %H:%M:%S') $line"; done
# 从第 100 行开始显示到文件末尾
tail -n +100 file.txt
# 显示最后 50 行
tail -n 50 /var/log/messages
# 显示最后 1KB 的内容
tail -c 1024 binary_file
# 实时跟踪,指定轮询间隔为 2 秒
tail -f -s 2 /var/log/app.log
# 跟踪日志,当指定进程退出后自动停止
tail -f --pid=$(pgrep -f myapp) /var/log/app.log
# 同时跟踪并写入另一个文件
tail -f /var/log/app.log | tee /tmp/app_log_copy.log
# 显示多个文件,每个都显示文件名
tail -v -n 5 file1.txt file2.txt file3.txt
# 查看日志中最近出现的错误
tail -n 1000 /var/log/app.log | grep "ERROR" | tail -20
# 查看文件最后修改的几行(结合 watch 使用)
watch -n 5 "tail -n 5 /var/log/app.log"more命令
文件内容查看
more命令是一个基于vi编辑器文本过滤器,它以全屏幕的方式按页显示文本文件的内容,支持vi中的关键字定位操作。more名单中内置了若干快捷键,常用的有H(获得帮助信息),Enter(向下翻滚一行),空格(向下滚动一屏),Q(退出命令)。
该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示的该文件的百分比:--More--(XX%)可以用下列不同的方法对提示做出回答:
- 按Space键:显示文本的下一屏内容。
- 按Enier键:只显示文本的下一行内容。
- 按斜线符|:接着输入一个模式,可以在文本中寻找下一个相匹配的模式。
- 按H键:显示帮助屏,该屏上有相关的帮助信息。
- 按B键:显示上一屏内容。
- 按Q键:退出rnore命令。
语法
more(语法)(参数)选项
-<数字>:指定每屏显示的行数;
-d:显示"[press space to continue,'q' to quit.]"和"[Press 'h' for instructions]";
-c:不进行滚屏操作。每次刷新这个屏幕;
-s:将多个空行压缩成一行显示;
-u:禁止下划线;
+<数字>:从指定数字的行开始显示。参数
文件:指定分页显示内容的文件。
实例
显示文件file的内容,但在显示之前先清屏,并且在屏幕的最下方显示完核的百分比。
more -dc file显示文件file的内容,每10行显示一次,而且在显示之前先清屏。
more -c -10 filemore 高级用法
# 从第 50 行开始分页查看
more +50 /var/log/messages
# 每屏显示 20 行
more -20 long_file.txt
# 显示提示信息
more -d /var/log/syslog
# 压缩连续空行
more -s /etc/my.cnf
# 管道配合 more
cat /var/log/messages | more
# more 中常用操作快捷键
# Space - 下一页
# Enter - 下一行
# b - 上一页
# q - 退出
# h - 帮助
# /pattern - 向前搜索
# n - 下一个搜索结果
# v - 用 vi 编辑当前文件
# = - 显示当前行号
# :f - 显示文件名和当前行号
# !command - 执行 Shell 命令
# 查看多个文件
more file1.txt file2.txt file3.txt
# 在 more 中按 :n 切换到下一个文件
# 在 more 中按 :p 切换到上一个文件
# 配合管道查看命令输出
ps aux | more
dmesg | more
ls -la /etc | more
# 搜索关键字
# 在 more 中输入 /ERROR 然后回车,可以搜索 ERROR
# 按 n 跳到下一个匹配less命令
文件内容查看
less命令的作用与more十分相似,都可以用来浏览文字档案的内容,不同的是less命令允许用户向前或向后浏览文件,而more命令只能向前浏览。用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页。要退出less程序,应按Q键。
语法
less(选项)(参数)选项
-e:文件内容显示完毕后,自动退出;
-f:强制显示文件;
-g:不加亮显示搜索到的所有关键词,仅显示当前显示的关键字,以提高显示速度;
-l:搜索时忽略大小写的差异;
-N:每一行行首显示行号;
-s:将连续多个空行压缩成一行显示;
-S:在单行显示较长的内容,而不换行显示;
-x<数字>:将TAB字符显示为指定个数的空格字符。参数
文件:指定要分屏显示内容的文件。
less 高级用法与快捷键
# 显示行号
less -N /etc/nginx/nginx.conf
# 忽略大小写搜索
less -i /var/log/app.log
# 压缩连续空行
less -s /etc/my.cnf
# 不换行显示长行
less -S /var/log/csv_data.csv
# 自动退出(文件内容可以一屏显示完时)
less -e small_file.txt
# Tab 显示为 4 个空格
less -x4 Makefile
# 强制打开二进制文件
less -f /proc/kcore
# 打开多个文件
less file1.txt file2.txt file3.txt
# :n 下一个文件 :p 上一个文件 :x 第一个文件
# 管道输入
ps aux | less
dmesg | less -N
# ====== less 搜索操作 ======
# /pattern 向下搜索
# ?pattern 向上搜索
# n 下一个匹配
# N 上一个匹配
# &pattern 只显示匹配的行
# g 跳到文件开头
# G 跳到文件末尾
# <数字>g 跳到指定行
# ====== less 标记操作 ======
# m<字母> 设置标记(如 ma)
# '<字母> 跳到标记处(如 'a)
# ====== less 实用技巧 ======
# 只显示包含 ERROR 的行(过滤模式)
less /var/log/app.log
# 进入 less 后输入 &ERROR,只显示匹配行
# 再次输入 & 取消过滤
# 查看多个日志文件(自动跟踪新文件)
less +F /var/log/syslog
# 按 Ctrl+C 停止跟踪,然后可以搜索
# 按 F 继续跟踪
# less 中执行 Shell 命令
# !command 执行 Shell 命令
# !! 重复上一次命令
# 查看 gzip 压缩文件(不需要解压)
less /var/log/syslog.1.gz
# 查看 tar 包中的文件列表
less /tmp/backup.tar.gz
# less 配合环境变量
# 在 ~/.bashrc 中添加:
export LESS='-R -N -i -s -M'
# -R 显示颜色(ANSI 转义码)
# -N 显示行号
# -i 忽略搜索大小写
# -s 压缩空行
# -M 显示更详细的状态栏其他文件查看工具
nl 命令 - 添加行号
# 基本用法
nl /etc/passwd
# 自定义行号格式
nl -n ln /etc/hosts # 左对齐,不加前导零
nl -n rn /etc/hosts # 右对齐,不加前导零
nl -n rz /etc/hosts # 右对齐,加前导零
nl -n rz -w3 /etc/hosts # 右对齐,宽度 3,加前导零
# 不对空行编号
nl -b t /etc/nginx/nginx.conf
# 只对空行编号(不常用)
nl -b n /etc/nginx/nginx.conf
# 对所有行编号(包括空行,默认行为)
nl -b a /etc/nginx/nginx.conf
# 自定义行号起始值
nl -v 100 /etc/hosts # 从 100 开始编号
# 自定义行号递增步长
nl -i 5 /etc/hosts # 每行增加 5
# 指定分隔符
nl -s '. ' /etc/hosts # 行号后跟 ". "
# 实用示例:为代码添加行号并复制到剪贴板
nl -ba -n rz -w4 -s' ' script.shcut 命令 - 列截取
# 按字节截取
echo "Hello World" | cut -b 1-5 # Hello
# 按字符截取
echo "Hello World" | cut -c 1-5 # Hello
# 按分隔符截取字段
echo "name,age,city" | cut -d',' -f1 # name
echo "name,age,city" | cut -d',' -f2 # age
echo "name,age,city" | cut -d',' -f1,3 # name,city
echo "name,age,city" | cut -d',' -f2- # age,city
# 截取 /etc/passwd 中的用户名和 Shell
cut -d':' -f1,7 /etc/passwd
# 截取多个字段并指定输出分隔符
cut -d':' -f1,7 --output-delimiter=' -> ' /etc/passwd
# 排除指定字段
echo "a,b,c,d,e" | cut -d',' -f1,3 --complement # b,d,e
# 按字节范围截取固定宽度文件
cut -b1-8,25-32 fixed_width_file.txtsplit 命令 - 文件分割
# 按行数分割(每 1000 行一个文件)
split -l 1000 large_file.txt segment_
# 按字节大小分割(每个文件 100MB)
split -b 100M large_file.bin part_
# 按行数分割并使用数字后缀
split -l 1000 -d large_file.txt segment_
# 按行数分割并指定后缀长度
split -l 5000 -d -a 3 large_file.txt segment_
# 使用与源文件相同的后缀
split -b 50M --additional-suffix=.bin large_archive data_part
# 合并分割后的文件
cat segment_* > large_file.txt
# 分割 CSV 文件(保留表头)
head -n1 data.csv > header.csv
tail -n +2 data.csv | split -l 10000 -d -a 3 - chunk_
for f in chunk_*; do cat header.csv "$f" > "data_${f}.csv"; donesort 命令 - 排序
# 默认按字典序排序
sort file.txt
# 按数字排序
sort -n numbers.txt
# 反向排序
sort -r file.txt
# 按指定列排序
sort -t':' -k3 -n /etc/passwd # 按第 3 列(UID)数字排序
# 按多列排序
sort -t',' -k2,2n -k3,3r data.csv # 第 2 列数字升序,第 3 列降序
# 去重排序
sort -u file.txt
# 检查文件是否已排序
sort -c file.txt
# 按人类可读的数字排序(如 1K, 2M, 3G)
du -h * | sort -hr
# 忽略前导空白
sort -b file.txt
# 指定月份排序
sort -M months.txt
# 排序并写入文件
sort -o sorted.txt unsorted.txt
# 复杂排序:按 IP 地址排序
sort -t. -k1,1n -k2,2n -k3,3n -k4,4n ip_list.txt
# 只检查并显示重复行
sort file.txt | uniq -duniq 命令 - 去重
# 去除相邻重复行
sort file.txt | uniq
# 只显示重复的行
sort file.txt | uniq -d
# 只显示不重复的行
sort file.txt | uniq -u
# 显示每行出现的次数
sort file.txt | uniq -c
# 忽略前 N 个字段进行比较
uniq -f 1 data.txt
# 忽略前 N 个字符进行比较
uniq -s 3 data.txt
# 只比较前 N 个字符
uniq -w 10 data.txt
# 统计日志中每个 IP 的访问次数
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20wc 命令 - 统计
# 统计行数、单词数、字节数
wc /etc/passwd
# 输出:40 60 1800 /etc/passwd(行数 单词数 字节数)
# 只统计行数
wc -l /var/log/messages
# 只统计单词数
wc -w /etc/hosts
# 只统计字节数
wc -c /etc/hosts
# 只统计字符数(多字节字符会不同)
wc -m /etc/hosts
# 统计最长行的长度
wc -L /etc/hosts
# 统计多个文件并显示总计
wc -l file1.txt file2.txt file3.txt
# 统计目录下所有文件的行数
wc -l /etc/nginx/conf.d/*.conf
# 统计代码行数(排除空行和注释)
find /path/to/project -name "*.py" -exec cat {} + | grep -v '^\s*#' | grep -v '^\s*$' | wc -l
# 统计当前目录下所有 .log 文件的总行数
wc -l *.log | tail -1diff 命令 - 文件比较
# 比较两个文件
diff file1.txt file2.txt
# 并排比较
diff -y file1.txt file2.txt
# 统一格式(更易读)
diff -u file1.txt file2.txt
# 递归比较目录
diff -r dir1/ dir2/
# 忽略空白差异
diff -w file1.txt file2.txt
# 忽略大小写
diff -i file1.txt file2.txt
# 只显示是否不同(不显示具体差异)
diff -q file1.txt file2.txt
# 比较并生成补丁文件
diff -u old_file.txt new_file.txt > changes.patch
# 应用补丁
patch < changes.patch
# 比较目录,只显示文件名
diff -rq dir1/ dir2/
# 使用 colordiff 彩色显示(需安装 colordiff)
diff -u file1.txt file2.txt | colordifftee 命令 - 输出分流
# 同时输出到屏幕和文件
echo "hello" | tee /tmp/output.txt
# 追加到文件
echo "world" | tee -a /tmp/output.txt
# 同时写入多个文件
echo "data" | tee file1.txt file2.txt file3.txt
# 提升权限写入
echo "config" | sudo tee /etc/myapp/config.txt
# 实时查看日志同时保存
tail -f /var/log/app.log | tee /tmp/app_log_copy.log
# 管道中使用 tee
cat /var/log/messages | tee /tmp/msg_copy.log | grep "ERROR"
# 只写入文件不输出到屏幕
echo "silent" | tee /tmp/silent.txt > /dev/null
# 配合 sudo 使用
docker logs myapp 2>&1 | sudo tee /var/log/myapp.logfile 命令 - 文件类型识别
# 识别文件类型
file /etc/passwd # /etc/passwd: ASCII text
file /bin/ls # /bin/ls: ELF 64-bit LSB executable
file image.png # image.png: PNG image data
file document.pdf # document.pdf: PDF document
# 识别多个文件
file /etc/*
# 显示 MIME 类型
file -i /etc/passwd # text/plain; charset=us-ascii
file -i image.png # image/png
# 不解引用符号链接(查看链接本身的信息)
file -h /usr/bin/python3
# 识别压缩文件
file archive.tar.gz # gzip compressed data
# 识别文件编码
file -i chinese_text.txt # text/plain; charset=utf-8
# 批量识别目录下所有文件
find /var/log -type f -exec file {} \;find 命令 - 文件查找
# 按名称查找
find /etc -name "*.conf"
# 按类型查找(f=文件, d=目录, l=链接)
find /var -type f -name "*.log"
find /opt -type d
# 按大小查找
find /var -size +100M # 大于 100MB
find /tmp -size -10k # 小于 10KB
find /home -size 0 # 空文件
# 按时间查找
find /var -mtime -7 # 7 天内修改的文件
find /tmp -atime +30 # 30 天前访问的文件
find /log -ctime -1 # 1 天内状态改变的文件
# 按权限查找
find /etc -perm 644
find /opt -perm -755 # 至少 755 权限
# 按用户查找
find /home -user deploy
find /var -nouser # 没有所有者的文件
# 组合条件
find /var -name "*.log" -size +50M -mtime +7
# 执行操作
find /tmp -name "*.tmp" -delete # 删除
find /var/log -name "*.gz" -exec rm {} \; # 删除
find /opt -type f -exec chmod 644 {} \; # 修改权限
find /opt -type d -exec chmod 755 {} \; # 修改权限
find . -name "*.bak" -exec mv {} /tmp/backup/ \; # 移动
# 使用 xargs 提高效率(处理大量文件时)
find /var -name "*.log" -print0 | xargs -0 gzip
# 查找并显示详细信息
find /etc -name "*.conf" -exec ls -lh {} \;
# 查找空目录
find /opt -type d -empty
# 排除目录
find / -name "*.py" -path "/proc" -prune -o -print
find / -name "*.log" -not -path "/proc/*" -not -path "/sys/*"
# 查找后用 ls -l 显示
find /var/log -name "*.log" -lsxargs 命令 - 参数传递
# 基本用法
echo "file1 file2 file3" | xargs ls -l
# 指定分隔符
echo "file1:file2:file3" | xargs -d: ls -l
# 每次传递一个参数
find /var/log -name "*.gz" | xargs -I{} gzip -d {}
# 指定每次传递的参数个数
find /tmp -type f | xargs -n 1 rm -f
# 并行执行(指定并发数)
find /data -name "*.log" -print0 | xargs -0 -P4 gzip
# 显示将要执行的命令(不实际执行)
find /tmp -name "*.tmp" | xargs -p rm -f
# 处理包含空格和特殊字符的文件名
find /path -print0 | xargs -0 -I{} echo "Found: {}"
# 超长参数列表时自动分批
find / -name "*.conf" | xargs grep "server_name"
# 统计找到的文件数量
find /var/log -name "*.log" | xargs wc -l | tail -1文件编码与格式处理
dos2unix / unix2dos - 换行符转换
# 安装
yum install -y dos2unix
# 将 Windows 格式转为 Unix 格式(\r\n -> \n)
dos2unix file.txt
# 将 Unix 格式转为 Windows 格式(\n -> \r\n)
unix2dos file.txt
# 批量转换
dos2unix *.sh
dos2unix *.conf
# 查看文件换行符格式
file file.txt
# Unix: ASCII text
# Windows: ASCII text, with CRLF line terminators
# 使用 sed 转换
sed -i 's/\r$//' file.txt # Windows -> Unix
sed -i 's/$/\r/' file.txt # Unix -> Windows
# 使用 tr 转换
tr -d '\r' < file.txt > file_unix.txticonv - 字符编码转换
# 查看 file 命令识别的编码
file -i data.txt
# GBK 转 UTF-8
iconv -f GBK -t UTF-8 gbk_file.txt > utf8_file.txt
# UTF-8 转 GBK
iconv -f UTF-8 -t GBK utf8_file.txt > gbk_file.txt
# 查看系统支持的编码
iconv -l
# GB2312 转 UTF-8
iconv -f GB2312 -t UTF-8 data.txt
# 转换并替换原文件
iconv -f GBK -t UTF-8 file.txt -o file.txt
# 批量转换
for f in *.txt; do
iconv -f GBK -t UTF-8 "$f" -o "${f}.utf8"
doneod / hexdump - 十六进制查看
# 使用 od 查看文件十六进制内容
od -c file.txt # 以字符形式显示
od -x file.txt # 十六进制
od -A x -t x1z file.txt # 更可读的格式
# 使用 hexdump
hexdump -C file.txt # 标准十六进制+ASCII 显示
# 查看 BOM 头
hexdump -C file.txt | head -1
# 查看二进制文件头部
hexdump -C /bin/ls | head -20文本处理三剑客
grep 高级用法
# 递归搜索目录
grep -r "ERROR" /var/log/app/
# 只搜索特定文件类型
grep -r "TODO" --include="*.py" /path/to/project/
# 排除目录
grep -r "pattern" --exclude-dir={".git","node_modules","venv"} .
# 显示行号
grep -n "pattern" file.txt
# 只显示匹配的部分
grep -o "pattern" file.txt
# 统计匹配次数
grep -c "ERROR" /var/log/app.log
# 显示匹配行的上下文
grep -B2 -A5 "Exception" /var/log/app.log # 前 2 行后 5 行
grep -C3 "pattern" file.txt # 前后各 3 行
# 反向匹配(显示不匹配的行)
grep -v "^#" config.conf # 排除注释行
grep -v "^$" config.conf # 排除空行
# 使用扩展正则
grep -E "ERROR|WARN|FATAL" app.log
grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" ips.txt
# 只匹配整个单词
grep -w "error" log.txt
# 忽略大小写
grep -i "error" log.txt
# 使用 Perl 兼容正则
grep -P '\d{4}-\d{2}-\d{2}' dates.txt
# 多文件搜索显示文件名
grep -l "pattern" *.txt # 只显示包含匹配的文件名
grep -L "pattern" *.txt # 只显示不包含匹配的文件名
# 颜色高亮
grep --color=auto "ERROR" app.logsed 高级用法
# 替换
sed 's/old/new/' file.txt # 替换每行第一个
sed 's/old/new/g' file.txt # 替换所有
sed 's/old/new/2' file.txt # 替换每行第 2 个
sed 's/old/new/gi' file.txt # 替换所有,忽略大小写
# 使用不同分隔符
sed 's|/old/path|/new/path|g' file.txt
sed 's#/old/path#/new/path#g' file.txt
# 删除行
sed '/^$/d' file.txt # 删除空行
sed '/^#/d' file.txt # 删除注释行
sed '1d' file.txt # 删除第 1 行
sed '$d' file.txt # 删除最后 1 行
sed '2,5d' file.txt # 删除第 2-5 行
# 打印特定行
sed -n '10,20p' file.txt # 打印第 10-20 行
sed -n '/pattern/p' file.txt # 打印匹配的行
# 行首行尾操作
sed 's/^/prefix /' file.txt # 行首添加
sed 's/$/ suffix/' file.txt # 行尾添加
# 在匹配行前后插入
sed '/pattern/a\new line' file.txt # 匹配行后插入
sed '/pattern/i\new line' file.txt # 匹配行前插入
# 修改文件(直接编辑)
sed -i 's/old/new/g' file.txt
# 备份后修改
sed -i.bak 's/old/new/g' file.txt
# 多个命令
sed -e 's/old/new/g' -e 's/foo/bar/g' file.txt
# 使用 sed 脚本文件
echo -e 's/old/new/g\ns/foo/bar/g' > script.sed
sed -f script.sed file.txtawk 高级用法
# 打印特定列
awk '{print $1, $3}' file.txt
# 指定分隔符
awk -F':' '{print $1, $7}' /etc/passwd
# 条件过滤
awk '$3 > 100 {print $1, $3}' /etc/passwd
# BEGIN 和 END
awk 'BEGIN{sum=0} {sum+=$1} END{print "Total:", sum}' numbers.txt
# 格式化输出
awk '{printf "%-20s %10d\n", $1, $2}' data.txt
# 内置变量
# NR: 行号 NF: 字段数 FILENAME: 文件名
# FS: 输入分隔符 OFS: 输出分隔符
awk 'NR==1 {print "Header:", $0} NR>1 && $3>100 {print $1}' data.csv
# 统计分组
awk '{count[$1]++} END {for (k in count) print k, count[k]}' access.log
# 多文件处理
awk 'FNR==NR{a[$1]=$2;next} {print $0, a[$1]}' users.txt orders.txt
# 条件表达式
awk '{print ($1 > 100 ? "high" : "low")}' numbers.txt
# 字符串函数
awk '{print toupper($1)}' names.txt
awk '{print length($0)}' file.txt
awk '{print substr($0, 1, 10)}' file.txt
# 模式匹配
awk '/ERROR/ {error_count++} END {print "Errors:", error_count}' app.log关键知识点
- 部署类主题的核心不是"装成功",而是"稳定运行、可排障、可回滚"。
- 同一个服务通常至少要关注版本、目录、端口、权限、数据、日志和备份。
- Linux 问题经常跨越系统层、网络层、服务层和应用层。
- cat 适合小文件查看,大文件用 less 或 more。
- tail -f 是实时监控日志最常用的命令。
- less 比 more 更强大,支持前后翻页和搜索。
- grep/sed/awk 是文本处理三剑客,配合管道功能强大。
- find 配合 xargs 可以高效处理大量文件。
项目落地视角
- 把安装步骤补成可重复执行的清单,必要时写成脚本或配置文件。
- 把配置目录、数据目录、日志目录和挂载点明确拆开。
- 上线前检查防火墙、SELinux、时区、磁盘、系统服务和健康检查。
- 使用 less -N +F 组合替代 tail -f,可以在需要时搜索历史内容。
- 对于日志分析,建立基于 grep/awk/sed 的分析工具集。
常见误区
- 使用 latest 或未固定版本,导致环境不可复现。
- 只验证启动成功,不验证持久化、开机自启和故障恢复。
- 遇到问题先改配置而不是先看日志和依赖链路。
- 使用 cat 查看大文件导致终端卡死。
- 在管道中忘记 grep --line-buffered 导致输出延迟。
- 使用 head/tail 处理二进制文件。
- find 结果直接传给 rm 不用 xargs,遇到特殊文件名会出错。
进阶路线
- 继续补齐 systemd、性能监控、安全加固和备份恢复。
- 把单机操作升级成 Docker、Kubernetes 或 IaC 方案。
- 建立标准化运维手册,包括巡检、扩容、回滚和灾备演练。
- 学习 awk 编程,处理复杂的文本分析任务。
- 学习 jq 工具处理 JSON 格式数据。
适用场景
- 当你准备把《文件查看命令》真正落到项目里时,最适合先在一个独立模块或最小样例里验证关键路径。
- 适合单机环境初始化、中间件快速搭建、测试环境验证和生产部署前准备。
- 当服务稳定性依赖端口、权限、目录、网络和系统参数时,这类主题会直接影响成败。
- 日志分析和故障排查是文件查看命令最常用的场景。
落地建议
- 固定版本号与镜像标签,避免"latest"带来的不可预期变化。
- 把配置、数据、日志目录拆开管理,并记录恢复步骤。
- 上线前确认端口、防火墙、SELinux、时区和磁盘空间。
- 在 ~/.bashrc 中设置 LESS 环境变量,统一 less 的默认行为。
- 建立常用命令别名,提高日常操作效率。
排错清单
- 先查 systemctl、容器日志和应用日志,确认失败发生在哪一层。
- 检查端口占用、目录权限、挂载路径和网络连通性。
- 如果是新环境问题,优先对比与已知正常环境的差异。
- 使用 file 命令确认文件类型和编码是否正确。
- 使用 hexdump 查看二进制文件是否有损坏。
复盘问题
- 如果把《文件查看命令》放进你的当前项目,最先要验证的输入、输出和失败路径分别是什么?
- 《文件查看命令》最容易在什么规模、什么边界条件下暴露问题?你会用什么指标或日志去确认?
- 相比默认实现或替代方案,采用《文件查看命令》最大的收益和代价分别是什么?
- 当日志文件达到 GB 级别时,如何高效地搜索和分析?
