【Linux】常用命令
- 【一】tar命令
- 【1】可用参数
- 【2】常用案例
- (1)创建归档(打包)
- (2)查看归档内容:
- (3)解包归档 (提取):
- 【二】日志查看命令
- 【1】基础命令
- 【2】组合技巧
【一】tar命令
【1】可用参数
(1)操作模式 (必须指定一个):
🔥🔥🔥-c, --create: 创建一个新的归档文件。
-x, --extract, --get: 解包(提取)归档文件中的内容。
-t, --list: 列出归档文件中的内容(查看包含哪些文件)。
-r, --append: 追加文件到已存在的归档文件末尾。(注意:这不是更新,可能导致重复文件)
-u, --update: 仅追加比归档文件中同名文件更新的文件。(谨慎使用,行为可能不符合直觉)
-A, --catenate, --concatenate: 合并多个 .tar归档文件。
(2)指定归档文件名:
🔥🔥🔥-f [文件名], --file=[文件名]: 指定归档文件名。这是极其重要的选项。后面必须紧跟归档文件的名称(或路径)。例如:
创建:tar -cvf backup.tar /some/dir
解包:tar -xvf backup.tar
查看:tar -tvf backup.tar.gz
(3)压缩/解压缩选项 (通常与 -f结合使用):
🔥🔥🔥-z, --gzip: 使用 gzip 进行压缩(创建 .tar.gz/.tgz)或解压缩。
创建:tar -czvf archive.tar.gz files...
解压:tar -xzvf archive.tar.gz-j, --bzip2: 使用 bzip2 进行压缩(创建 .tar.bz2/.tbz2)或解压缩。压缩率通常比 gzip 高,但速度慢。
创建:tar -cjvf archive.tar.bz2 files...
解压:tar -xjvf archive.tar.bz2-J, --xz: 使用 xz 进行压缩(创建 .tar.xz/.txz)。通常提供比 bzip2 更高的压缩率,但速度更慢。
创建:tar -cJvf archive.tar.xz files...
解压:tar -xJvf archive.tar.xz--zstd: (较新版本支持) 使用 Zstandard (zstd) 进行压缩(创建 .tar.zst)。在压缩率和速度之间取得较好平衡。
创建:tar --zstd -cvf archive.tar.zst files...
解压:tar --zstd -xvf archive.tar.zst-a, --auto-compress: 根据归档文件名的后缀自动推断压缩类型并调用相应的程序(解压时常用)。
解压:tar -xavf archive.tar.gz(等价于 tar -xzvf)
解压:tar -xavf archive.tar.xz(等价于 tar -xJvf)
(4)输出/交互选项:
🔥🔥🔥-v, --verbose: 详细模式。在处理文件时列出文件名。强烈推荐使用,方便了解进度。-p, --preserve-permissions, --same-permissions: 解包时保留文件的原始权限和所有权信息(需要 root 权限才能完全恢复所有者)。
--same-owner: 解包时尝试保留文件的所有者(通常需要 root 权限)。-k, --keep-old-files: 解包时不覆盖已存在的文件。遇到同名文件会跳过并报错。--overwrite: 解包时覆盖已存在的文件和目录(默认行为,但显式指定有时有用)。--skip-old-files: 解包时跳过已存在的文件(不覆盖也不报错)。🔥🔥🔥-C [目录], --directory=[目录]: 改变目标目录。
创建:在指定目录下查找要归档的文件(相对路径基于此目录)。tar -cvf backup.tar -C /path/to/source .(归档 /path/to/source下的所有内容)
解包:将文件提取到指定目录。tar -xvf backup.tar -C /path/to/target--strip-components=[N]: 解包时去除归档文件中路径的前 N 层目录。
例如:归档文件包含 project/src/main.c,使用 --strip-components=1解压后,会得到 src/main.c。-O, --to-stdout: 解包时将文件内容输出到标准输出 (stdout),而不是写入磁盘文件。常与管道 (|) 结合进行流处理。
tar -xOf archive.tar.gz path/to/file.txt(查看特定文件内容)
tar -xzf archive.tar.gz path/to/file.txt -O | grep "keyword"(搜索归档内文件内容)
(5)选择文件/排除文件:
[文件或目录列表]: 在命令末尾指定要归档的文件或目录路径。支持通配符 (*, ?),但注意 shell 会扩展通配符,最好用引号保护或结合 --files-from。
🔥🔥🔥tar -cvf docs.tar *.txt(归档当前目录下所有 .txt文件)--exclude=[模式]: 排除匹配指定模式的文件或目录。模式可以是路径或 glob 模式。可多次使用。
tar -cvf backup.tar --exclude='*.log' --exclude='temp/' /home/user--exclude-from=[文件]: 从指定文件中读取要排除的模式列表(每行一个模式)。
tar -cvf backup.tar --exclude-from=exclude-list.txt /home/user-T [文件], --files-from=[文件]: 从指定文件中读取要归档的文件路径列表(每行一个路径)。常用于精确控制归档内容。
tar -cvf backup.tar -T file-list.txt
(6)处理链接:
🔥🔥🔥-h, --dereference: 跟随(解引用)符号链接。归档的是链接指向的实际文件/目录的内容,而不是链接本身。
(默认行为): 归档符号链接本身(存储为链接类型条目)。
(默认行为): 归档硬链接本身(存储为硬链接类型条目,保留链接关系)。
--hard-dereference: (较少用) 跟随硬链接,归档它们指向的文件内容(破坏硬链接关系,存储为独立文件)。
(7)其他实用选项:
--checkpoint=[N], --checkpoint-action=[动作]: 每处理 N 条记录(默认 10)执行一次检查点动作(如打印信息 --checkpoint-action=echo)。
--totals: 在处理完成后显示总字节数。
--wildcards: 在使用 --exclude或 -T时显式启用通配符匹配(现代 tar 通常默认启用)。
--selinux, --no-selinux: 启用或禁用 SELinux 上下文信息的保存/恢复。
--acls, --no-acls: 启用或禁用 POSIX ACLs 的保存/恢复。
--xattrs, --no-xattrs: 启用或禁用扩展属性 (xattrs) 的保存/恢复。
【2】常用案例
(1)创建归档(打包)
(1)基本打包: 将 /home/user/docs目录打包成 docs.tar
tar -cvf docs.tar /home/user/docs
(2)打包并压缩 (gzip): 将 /var/log打包并压缩成 logs.tar.gz
🔥🔥🔥tar -czvf logs.tar.gz /var/log
(3)打包并压缩 (bzip2): 将当前目录打包并压缩成 project.tar.bz2
tar -cjvf project.tar.bz2 .
(4)打包并压缩 (xz): 将 /usr/local/bin打包并压缩成 binaries.tar.xz
tar -cJvf binaries.tar.xz /usr/local/bin
(5)打包并压缩 (zstd): 将 /etc打包并压缩成 config.tar.zstbash
tar --zstd -cvf config.tar.zst /etc
(6)打包时排除文件: 打包 /home/user,排除 .cache目录和所有 .tmp文件bash
tar -czvf home_backup.tar.gz --exclude='.cache' --exclude='*.tmp' /home/user
(7)从列表文件打包: 根据 important_files.txt中的路径列表打包bash
tar -czvf important.tar.gz -T important_files.txt
(8)打包时跟随符号链接: 打包 /opt/app,并解引用其中的符号链接bash
🔥🔥🔥tar -czhvf app.tar.gz /opt/app
(9)打包到特定目录下的内容: 打包 /path/to/source目录下的所有内容(不包括 source目录本身)bash
🔥🔥🔥tar -czvf source_content.tar.gz -C /path/to/source .
(2)查看归档内容:
(1)列出内容: 查看 backup.tar.gz中包含哪些文件bash
tar -tzvf backup.tar.gz
(2)查看特定文件内容: 查看 archive.tar.xz中 path/to/file.conf的内容bash
tar -xJOf archive.tar.xz path/to/file.conf
(3)搜索归档内容: 在 logs.tar.gz中搜索包含 “error” 的文件名bash
tar -tzvf logs.tar.gz | grep error
(4)搜索归档文件内容: 在 source.tar.bz2中搜索所有 .py文件里包含 “import requests” 的行 (结合 grep)bash
tar -xjOf source.tar.bz2 $(tar -tjf source.tar.bz2 | grep '\.py$') | grep 'import requests'
(3)解包归档 (提取):
(1)基本解包: 解压 data.tar到当前目录bash
tar -xvf data.tar
(2)解压并解压缩 (gzip): 解压 software.tar.gz到当前目录bash
🔥🔥🔥tar -xzvf software.tar.gz
(3)解压并解压缩 (bzip2): 解压 images.tar.bz2到当前目录bash
tar -xjvf images.tar.bz2
(4)解压并解压缩 (xz): 解压 archive.tar.xz到当前目录bash
tar -xJvf archive.tar.xz
(5)解压并解压缩 (zstd): 解压 backup.tar.zst到当前目录bash
tar --zstd -xvf backup.tar.zst
(6)解压到指定目录: 解压 website.tar.gz到 /var/www/htmlbash
🔥🔥🔥tar -xzvf website.tar.gz -C /var/www/html
(7)解压时保留权限: 解压系统备份 root_backup.tar.gz并保留原始权限 (通常需要 root)bash
sudo tar -xzpvf root_backup.tar.gz -C /
(8)解压时不覆盖已有文件: 解压 update.tar,如果文件已存在则跳过bash
tar -xkvf update.tar
(9)解压特定文件: 从 big_archive.tar.gz中只解压 dir/subdir/file.txtbash
tar -xzvf big_archive.tar.gz dir/subdir/file.txt
(10)解压并去除路径前缀: 解压 project.tar.gz,去除最外层目录(假设归档内第一层是 project-v1.0/)bash
tar -xzvf project.tar.gz --strip-components=1
【二】日志查看命令
【1】基础命令
(1)cat- 连接并打印文件内容
作用:一次性将整个文件内容输出到终端。
适用场景:查看非常小的日志文件。对于大文件,会刷屏且难以阅读。
cat /var/log/syslog
(2) less- 分页查看器 (推荐)
作用:分页显示文件内容,支持上下滚动、搜索等,不会一次性加载整个文件。
适用场景:查看任何大小日志文件的首选工具。
常用操作:
空格键/ Page Down: 向下翻一页
b/ Page Up: 向上翻一页
/关键词: 向下搜索(按 n下一个,N上一个)
?关键词: 向上搜索
g: 跳到文件开头
G: 跳到文件末尾
q: 退出
🔥🔥🔥less /var/log/auth.log
# 进入less后,输入 `/Failed` 来搜索所有失败登录尝试
(3)tail- 查看文件尾部
作用:显示文件的最后一部分内容。
适用场景:查看最新的日志条目,尤其是实时跟踪日志增长。
常用选项:
-n <行数>: 显示最后 N 行(例如 tail -n 50 file.log)
-f/ --follow: 实时跟踪日志输出。这是最重要的选项,用于监控正在写入的日志。
-F: 类似于 -f,但更强大。它会在文件被轮转(rotate)或删除后重新打开新文件继续跟踪。(例如 logrotate后会自动跟踪新产生的日志文件)
案例:
# 查看最后20行日志
tail -n 20 /var/log/nginx/access.log# 实时跟踪系统认证日志(监视登录行为)
tail -f /var/log/auth.log🔥🔥🔥# 实时跟踪系统认证日志(监视登录行为)
tail -500f /var/log/auth.log# 实时跟踪日志,即使日志文件被轮转也能继续(最佳实践)
tail -F /var/log/myapp/app.log
(4)head- 查看文件头部
作用:显示文件的开始一部分内容。
适用场景:查看日志文件的开头,例如确认日志的格式或初始启动信息。
# 查看日志文件的前10行
head -n 10 /var/log/bootstrap.log
(5)grep- 文本搜索利器
作用:使用正则表达式搜索文本,并打印匹配的行。
适用场景:在日志中过滤出包含特定关键词、错误代码、IP地址等的行。
常用选项:
-i: 忽略大小写
-v: 反向选择,只显示不匹配的行(排除干扰)
-r/ -R: 递归搜索目录下的所有文件
-n: 显示匹配行所在的行号
-A <数字>: 显示匹配行之后的 N 行(After)
-B <数字>: 显示匹配行之前的 N 行(Before)
-C <数字>: 显示匹配行前后的 N 行(Context)
案例:
# 在syslog中搜索所有包含"error"的行(忽略大小写)
grep -i error /var/log/syslog# 在Nginx访问日志中查找来自特定IP(192.168.1.1)的请求
grep '192.168.1.1' /var/log/nginx/access.log🔥🔥🔥# 搜索包含“error”的行,并显示其后的3行内容(获取错误上下文)
grep -A 3 -i error /var/log/myapp/app.log# 从多个日志文件中搜索“Timeout”关键字
grep -r "Timeout" /var/log/# 排除所有包含“DEBUG”的行(只显示非调试信息)
grep -v "DEBUG" /var/log/myapp/app.log
【2】组合技巧
(1)实时跟踪并过滤日志
这是最常用的组合,一边实时看新日志,一边过滤出你关心的内容。
# 案例:实时监控Nginx日志,只显示404错误的请求
tail -F /var/log/nginx/access.log | grep ' 404 '🔥🔥🔥# 使用 grep -A显示匹配行后的内容
tail -f /path/to/logfile.log | grep --line-buffered -A 10 "your_keyword"# 显示匹配行前后各 5 行(-C = Context)
tail -f app.log | grep --line-buffered -C 5 "Connection refused"# 组合使用:显示匹配行前 3 行 + 匹配行 + 后 7 行
tail -f app.log | grep --line-buffered -B 3 -A 7 "Transaction failed"# 案例:实时监控应用日志,同时过滤掉“heartbeat”这种无关紧要的信息
tail -f /var/log/myapp.log | grep -v "heartbeat"# 同时监控多个关键词(OR 逻辑)
tail -f logfile | grep --line-buffered -A 5 -e "Timeout" -e "Deadlock"# 高亮显示关键词(更易阅读)
tail -f logfile | grep --line-buffered --color=always -A 3 "Critical"
(2)统计和分析
# 案例:统计Nginx访问日志中每个IP的访问次数(找出谁在刷接口)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 20# 分解说明:
# awk '{print $1}' // 提取第一列(默认是IP地址)
# sort // 对IP进行排序,为下一步去重准备
# uniq -c // 计数并去重
# sort -nr // 按数字逆序排序(访问次数从高到低)
# head -n 20 // 显示前20个# 案例:查看HTTP状态码的分布
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr# 案例:找出消耗时间最长的请求(假设日志最后一列是请求耗时)
awk '{print $NF " | " $0}' /var/log/nginx/access.log | sort -nr | head -n 10
# $NF 代表最后一列(Number of Field)🔥🔥🔥# 显示匹配行及之后10行(无分隔符)
tail -f logfile | awk '/keyword/{c=11} c&&c--'
(3)查看特定时间范围的日志
如果你的日志时间格式可以被识别(如 [10/Sep/2023:14:30:00]),可以使用 sed、awk或 grep来提取时间段。
# 案例:提取今天上午10点到11点的日志 (假设时间格式是HH:MM:SS)
grep '10:\[0-5][0-9]:[0-5][0-9]' /var/log/myapp.log# 更精确的方法,使用awk(如果时间戳在每行开头)
awk '/Sep 10 10:00:00/,/Sep 10 11:00:00/' /var/log/syslog
# 注意:这个命令依赖于日志中确实存在这两个精确时间点的行
(4)结合 cut, awk, sort, uniq进行多维分析
awk是一个强大的文本处理语言,非常适合处理结构化的日志(如 CSV 或空格分隔的日志)。
# 案例:分析Nginx日志,找出访问量最高的URL(第7列)
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10# 案例:计算平均响应时间(假设最后一列是响应时间)
awk '{sum+=$NF; count++} END {print "Avg:", sum/count, "ms"}' /var/log/nginx/access.log