第二章 Shell命令 v1.0
第一部分 文件与目录操作
一、文件操作命令
文件操作命令是Linux系统中最基础和最常用的命令
①基本文件操作
ls:列出当前目录文件ls -l:显示详细信息(权限、所有者、大小、修改时间)ls -a:显示所有文件(包括隐藏文件)ls -la:显示所有文件的详细信息ls -lh:以人类可读格式显示文件大小(KB、MB、GB,-h需配合-l或-s才生效)ls -t:按修改时间排序ls --color=auto:彩色显示文件类型
touch:创建空文件或更新文件时间戳touch file.txt:创建空文件touch -t 202312311200 file.txt:修改文件时间戳为2023年12月31日12:00
cp:复制文件或目录cp file1 file2:复制file1到file2cp -r dir1 dir2:递归复制目录dir1到dir2cp -p file1 file2:复制时保留文件属性(权限、时间戳等)cp -i file1 file2:覆盖前提示确认
mv:移动或重命名文件mv file1 file2:重命名file1为file2mv file1 dir1/:移动file1到dir1目录mv -i file1 file2:覆盖前提示确认
rm:删除文件或目录rm file.txt:删除文件rm -r dir1/:递归删除目录rm -rf dir1/:强制递归删除(慎用)rm -i file.txt:删除前提示确认
②文件内容查看
cat:查看文件全部内容cat file.txt:显示文件内容cat -n file.txt:显示行号cat -b file.txt:显示行号(跳过空行)cat file1 file2 > merged.txt:合并多个文件
less:分页查看文件内容less file.txt:打开文件- 快捷键:
空格键:向下翻页b:向上翻页/关键词:向下搜索?关键词:向上搜索n:下一个搜索结果N:上一个搜索结果q:退出
head:查看文件开头部分head file.txt:显示前10行head -n 20 file.txt:显示前20行
tail:查看文件末尾部分tail file.txt:显示后10行tail -n 20 file.txt:显示后20行tail -f file.log:实时监控日志文件(f= follow)
③文件查找
find:查找文件和目录find . -name "*.txt":当前目录查找所有.txt文件find /home -type f -name "test":在/home目录查找名为test的文件find . -type d -name "logs":查找名为logs的目录find . -size +100M:查找大于100M的文件find . -mtime -7:查找7天内修改过的文件find . -perm 755:查找权限为755的文件
locate:快速查找文件(需要先更新数据库)locate file.txt:查找file.txtsudo updatedb:更新文件数据库
whereis:查找二进制程序、源代码和手册whereis ls:查找ls命令的位置
二、目录操作命令
目录操作命令用于管理文件系统的目录结构
①目录基本操作
pwd:显示当前工作目录pwd:显示当前目录的绝对路径
cd:切换目录cd /home/user:切换到绝对路径cd ..:切换到上级目录cd ~:切换到用户主目录cd -:切换到上一次所在目录cd Desktop:切换到当前目录下的Desktop目录
mkdir:创建目录mkdir dir1:创建单个目录mkdir -p dir1/dir2/dir3:递归创建多级目录mkdir -m 755 dir1:创建目录并设置权限
rmdir:删除空目录rmdir dir1:删除空目录rmdir -p dir1/dir2/dir3:递归删除多级空目录
tree:以树形结构显示目录tree:显示当前目录树形结构tree -L 2:显示2层深度的目录结构tree -d:只显示目录tree -a:显示所有文件(包括隐藏文件)
第二部分 文本处理命令
一、文本搜索与编辑
文本处理命令用于查找、替换和处理文本文件
①文本搜索
grep:文本搜索工具grep "error" log.txt:在log.txt中搜索errorgrep -r "error" ./logs/:递归搜索logs目录下所有文件grep -i "error" log.txt:忽略大小写搜索grep -n "error" log.txt:显示匹配的行号grep -v "error" log.txt:显示不包含error的行grep -E "error|warning" log.txt:搜索error或warninggrep -c "error" log.txt:统计匹配的行数grep --color=auto "error" log.txt:高亮显示匹配内容
②文本排序与去重
sort:文本排序sort file.txt:按字母顺序排序sort -n file.txt:按数字顺序排序sort -r file.txt:反向排序sort -u file.txt:排序并去重sort -t: -k2 -n /etc/passwd:按第2字段数字排序(以冒号分隔)
uniq:去重(需要先排序)uniq file.txt:去除相邻重复行sort file.txt | uniq:排序后去重uniq -c file.txt:统计重复次数uniq -d file.txt:只显示重复的行
二、文本统计与转换
①文本统计
wc:统计文件信息wc file.txt:显示行数、字数、字节数wc -l file.txt:只显示行数wc -w file.txt:只显示字数wc -c file.txt:只显示字节数wc -L file.txt:显示最长行的长度
②文本转换
tr:字符替换和删除tr 'a-z' 'A-Z' < file.txt:小写转大写tr -d '0-9' < file.txt:删除所有数字tr -s ' ' < file.txt:压缩连续空格为一个空格
cut:按列切分文本cut -f1 file.txt:提取第1列(以Tab分隔)cut -d: -f1 /etc/passwd:以冒号分隔,提取第1列cut -c1-10 file.txt:提取每行第1到10个字符
sed:流编辑器sed 's/old/new/g' file.txt:全局替换old为newsed '3d' file.txt:删除第3行sed '2,5d' file.txt:删除第2到5行sed '/error/d' file.txt:删除包含error的行sed -i 's/old/new/g' file.txt:直接修改文件(备份后)sed -i.bak 's/old/new/g' file.txt:修改并备份为file.txt.bak
awk:文本分析工具awk '{print $1}' file.txt:打印第1列awk -F: '{print $1}' /etc/passwd:以冒号分隔,打印第1列awk '{print NR, $0}' file.txt:显示行号和整行内容awk '{sum+=$1} END {print sum}' file.txt:计算第1列的和awk 'NR==5' file.txt:只显示第5行awk 'NR>=5 && NR<=10' file.txt:显示第5到10行
第三部分 权限与用户管理
一、文件权限管理
Linux使用rwx权限模式控制文件访问
①权限表示
| 权限 | 数字 | 说明 |
|---|---|---|
| r | 4 | 读权限(read) |
| w | 2 | 写权限(write) |
| x | 1 | 执行权限(execute) |
| 组合 | 权限 | 说明 |
|---|---|---|
| rwx | 7 | 读+写+执行 |
| rw- | 6 | 读+写 |
| r-x | 5 | 读+执行 |
| r-- | 4 | 只读 |
②chmod:修改文件权限
字母模式
chmod u+x file.txt:所有者增加执行权限chmod g-w file.txt:工作组去掉写权限chmod o=r file.txt:其他用户设置为只读chmod a+r file.txt:所有用户增加读权限
数字模式
chmod 755 file.txt:所有者rwx,组和其他用户rxchmod 644 file.txt:所有者rw,组和其他用户rchmod 777 dir/:所有用户全部权限(不安全)chmod -R 755 dir/:递归设置目录及内部文件权限
权限示例:
-rwxr-xr-- 1 user group 1024 Jan 1 12:00 file.txt
│ ││││ │ │ │ │ │ │
│ ││││ │ │ │ │ └── 文件名
│ ││││ │ │ │ └────────── 修改时间
│ ││││ │ │ └────────────────── 文件大小
│ ││││ │ └─────────────────────── 所属组
│ ││││ └────────────────────────────── 所有者
│ └┴┴┴└─────────────────────────────── 文件类型及权限二、用户与组管理
①用户管理
useradd:创建用户useradd username:创建用户useradd -m username:创建用户并创建主目录useradd -d /home/user username:指定主目录useradd -s /bin/bash username:指定默认shell
userdel:删除用户userdel username:删除用户(保留主目录)userdel -r username:删除用户及主目录
passwd:修改用户密码passwd:修改当前用户密码passwd username:修改指定用户密码(需要root权限)
whoami:显示当前用户名who:显示登录用户信息w:显示登录用户及其活动
②组管理
groupadd:创建用户组groupadd groupname:创建组
groupdel:删除用户组groupdel groupname:删除组
usermod:修改用户属性usermod -aG groupname username:将用户添加到组(不覆盖原有组)usermod -g groupname username:修改用户的主组usermod -l newname oldname:修改用户名
groups:显示用户所属组groups:显示当前用户所属组groups username:显示指定用户所属组
③文件所有者管理
chown:修改文件所有者chown user file.txt:修改文件所有者为userchown user:group file.txt:修改所有者和组chown -R user:group dir/:递归修改目录及内部文件chown :group file.txt:只修改组
第四部分 系统管理命令
一、进程管理
进程管理命令用于监控和控制运行的程序
①进程查看
ps:查看进程ps:显示当前用户的进程ps aux:显示所有进程详细信息ps -ef:显示所有进程(格式略有不同)ps aux | grep nginx:查看nginx相关进程ps -u username:查看指定用户的进程
top:实时显示进程信息top:启动top- 快捷键:
P:按CPU使用率排序M:按内存使用率排序N:按PID排序q:退出k:杀死进程(输入PID)
htop:增强版top(需要安装)htop:启动htop(支持鼠标和颜色显示)
②进程控制
kill:终止进程kill PID:正常终止进程(发送SIGTERM信号)kill -9 PID:强制终止进程(发送SIGKILL信号)kill -l:列出所有信号
常见信号:
| 信号 | 数字 | 说明 |
|---|---|---|
| SIGTERM | 15 | 终止信号(进程可捕获并处理) |
| SIGKILL | 9 | 强制终止(进程无法捕获) |
| SIGHUP | 1 | 重新加载配置 |
pkill:按名称终止进程pkill nginx:终止所有名为nginx的进程pkill -9 nginx:强制终止nginx进程
killall:按名称终止所有进程killall nginx:终止所有nginx进程killall -9 nginx:强制终止所有nginx进程
nohup:后台运行程序(不挂断)nohup command &:后台运行命令nohup ./app > app.log 2>&1 &:后台运行并重定向输出
bg:将后台暂停的作业继续运行fg:将后台作业调至前台jobs:显示后台作业列表
二、系统监控
①资源监控
free:查看内存使用情况free:显示内存信息(默认单位 KiB)free -h:以人类可读格式显示free -m:以MB显示free -g:以GB显示free -s 2:每2秒刷新一次
df:查看磁盘使用情况df:显示磁盘使用情况(1KB块)df -h:以人类可读格式显示df -T:显示文件系统类型df -i:显示inode使用情况
du:查看目录占用空间du -h dir/:显示目录大小du -sh dir/:显示目录总大小du -h --max-depth=1 /:显示根目录下一级目录的大小
uptime:查看系统运行时间和负载uptime:显示运行时间、用户数、平均负载
②日志查看
dmesg:查看内核日志dmesg:显示内核消息dmesg | grep error:搜索error相关内核消息
journalctl:查看systemd日志journalctl:查看所有日志journalctl -u nginx:查看nginx服务日志journalctl -f:实时查看日志journalctl --since today:查看今天的日志journalctl -p err:查看错误级别日志
第五部分 网络命令
一、网络连接管理
网络命令用于配置和监控网络连接
①网络配置
ifconfig:查看和配置网络接口(部分系统需安装net-tools)ifconfig:显示所有网络接口信息ifconfig eth0:显示eth0接口信息ifconfig eth0 up:启用eth0接口ifconfig eth0 down:关闭eth0接口
ip:新一代网络配置工具ip addr:显示网络接口地址ip link:显示网络接口状态ip route:显示路由表ip addr add 192.168.1.10/24 dev eth0:添加IP地址ip addr del 192.168.1.10/24 dev eth0:删除IP地址
ping:测试网络连通性ping google.com:ping谷歌ping -c 4 google.com:ping 4次后停止ping -i 2 google.com:间隔2秒ping一次
traceroute:路由追踪traceroute google.com:追踪到google的路由traceroute -n google.com:不解析主机名(更快)
②端口监控
netstat:网络连接统计(部分系统需安装net-tools)netstat -tunlp:显示所有监听端口netstat -an:显示所有网络连接netstat -tunlp | grep 80:查找占用80端口的进程
参数说明:
-t:TCP连接-u:UDP连接-n:以数字形式显示地址和端口-l:只显示监听套接字-p:显示进程ID和名称ss:新一代网络连接查看工具ss -tunlp:显示所有监听端口ss -tulpn:显示所有连接和监听端口ss -s:显示统计摘要
lsof:列出打开的文件(包括网络连接)lsof -i:80:查看占用80端口的进程lsof -i TCP:查看所有TCP连接lsof -u username:查看指定用户打开的文件
③网络下载
wget:下载文件wget http://example.com/file.zip:下载文件wget -O newname.zip http://example.com/file.zip:下载并重命名wget -c http://example.com/file.zip:断点续传wget -b http://example.com/file.zip:后台下载wget -r http://example.com/:递归下载整个网站
curl:传输数据(支持多种协议)curl http://example.com:获取网页内容curl -O http://example.com/file.zip:下载文件curl -I http://example.com:只获取响应头curl -X POST -d "key=value" http://example.com/api:发送POST请求curl -H "Content-Type: application/json" -d '{"key":"value"}' http://example.com/api:发送JSON数据
第六部分 压缩与归档
一、压缩命令
压缩命令用于减少文件大小以便存储或传输
①tar:归档工具
tar -cvf archive.tar file1 file2:创建tar归档tar -xvf archive.tar:解压tar归档tar -czvf archive.tar.gz dir/:创建gzip压缩归档tar -xzvf archive.tar.gz:解压gzip压缩归档tar -cjvf archive.tar.bz2 dir/:创建bzip2压缩归档tar -xjvf archive.tar.bz2:解压bzip2压缩归档tar -xzvf archive.tar.gz -C /path/to/dest:解压到指定目录
参数说明:
-c:创建归档-x:解压归档-v:显示详细信息-f:指定文件名-z:使用gzip压缩-j:使用bzip2压缩-C:切换到指定目录
②zip/unzip
zip -r archive.zip dir/:递归压缩目录zip archive.zip file1 file2:压缩多个文件unzip archive.zip:解压zip文件unzip -l archive.zip:列出zip文件内容(不解压)unzip -o archive.zip:覆盖已存在的文件unzip -d /path/to/dest archive.zip:解压到指定目录
二、压缩格式对比
| 格式 | 压缩率 | 速度 | 特点 |
|---|---|---|---|
| .tar | 不压缩 | 快 | 仅归档,不做压缩 |
| .tar.gz | 中等 | 中等 | 兼容性好,最常用 |
| .tar.bz2 | 较高 | 较慢 | 压缩率高,Linux常用 |
| .zip | 中等 | 较快 | 跨平台兼容性好 |
第七部分 其他常用命令
一、帮助与手册
①获取帮助
man:查看命令手册man ls:查看ls命令的手册man -f ls:显示ls相关的手册页man -k keyword:搜索包含keyword的手册
--help:大多数命令的帮助选项ls --help:查看ls命令的帮助cp --help:查看cp命令的帮助
info:更详细的信息info ls:查看ls的详细信息
whatis:简要描述命令whatis ls:显示ls的一行描述
二、历史与快捷键
①命令历史
history:查看命令历史history:显示所有历史命令history 20:显示最近20条命令!100:执行第100条历史命令!ls:执行最近一条以ls开头的命令!!:执行上一条命令
②命令行快捷键
| 快捷键 | 功能 |
|---|---|
Ctrl + C | 终止当前命令 |
Ctrl + Z | 暂停当前命令 |
Ctrl + D | 退出当前Shell或输入结束 |
Ctrl + L | 清屏(等同于clear命令) |
Ctrl + A | 光标移至行首 |
Ctrl + E | 光标移至行尾 |
Ctrl + K | 删除光标到行尾的内容 |
Ctrl + U | 删除光标到行首的内容 |
Ctrl + W | 删除光标前一个单词 |
Ctrl + Y | 粘贴最近删除的内容 |
Ctrl + R | 搜索历史命令 |
Tab | 自动补全命令或路径 |
↑ / ↓ | 上一条/下一条历史命令 |
三、其他实用命令
echo:输出文本或变量echo "Hello World":输出文本echo $HOME:输出环境变量HOME的值echo -e "Line1\nLine2":支持转义字符echo "text" >> file.txt:追加文本到文件
date:显示或设置系统日期和时间date:显示当前日期和时间date "+%Y-%m-%d %H:%M:%S":自定义格式显示date -s "2024-01-01 12:00:00":设置系统时间
cal:显示日历cal:显示当前月份日历cal 2024:显示2024年日历cal 12 2024:显示2024年12月日历
alias:设置命令别名alias ll='ls -l':设置ll为ls -l的别名alias:显示所有别名unalias ll:删除ll别名
exit:退出Shellclear:清屏sleep:暂停执行sleep 5:暂停5秒sleep 5 && echo "done":5秒后输出done
附录:常用组合命令示例
①查找并删除大文件
# 查找大于100M的文件
find . -type f -size +100M -exec ls -lh {} \;
# 删除所有.log文件
find . -name "*.log" -delete②统计代码行数
# 统计当前目录下所有.py文件的代码行数
find . -name "*.py" | xargs wc -l
# 递归统计目录下所有文件的行数
find . -type f | xargs wc -l | tail -1③批量重命名
# 将所有.jpg文件改为.png
for file in *.jpg; do mv "$file" "${file%.jpg}.png"; done
# 批量添加前缀
for file in *; do mv "$file" "prefix_$file"; done④监控日志文件
# 实时查看最新的50行日志
tail -f -n 50 app.log
# 查找错误日志
grep -i "error" app.log | tail -n 20⑤查看进程占用端口
# 查看占用8080端口的进程
netstat -tunlp | grep 8080
# 或使用ss命令
ss -tunlp | grep 8080
# 或使用lsof命令
lsof -i:8080⑥查找并杀死进程
# 查找nginx进程并杀死
ps aux | grep nginx | grep -v grep | awk '{print $2}' | xargs kill -9
# 或使用pkill
pkill -9 nginx⑦查找空文件
# 查找当前目录下所有空文件
find . -type f -empty
# 查找并删除空文件
find . -type f -empty -delete⑧批量修改文件权限
# 递归设置所有.sh文件为可执行
find . -name "*.sh" -exec chmod +x {} \;
# 或使用xargs
find . -name "*.sh" | xargs chmod +x⑨查看文件变化
# 查看文件最后10行变化
watch -n 1 'tail -n 10 file.txt'
# 查看目录下的文件变化
watch -n 1 'ls -lh'⑩查找文件中的内容
# 递归查找包含特定内容的文件
grep -r "function" . --include="*.js"
# 统计关键词出现的次数
grep -o "keyword" file.txt | wc -l