Linux命令行,是程序员和运维人员最重要的工具之一。
熟练掌握Linux命令行,不仅能提升工作效率,还能让你更深入地理解操作系统,解决各种复杂的问题。一个命令行高手,能用几行命令,完成别人需要几个小时才能完成的工作。
我自己,从大学开始接触Linux,到现在工作多年,每天都在和Linux命令行打交道。从最初的只会几个基础命令,到后来能够熟练使用各种高级命令和技巧,一路走来,踩了不少坑,也总结了不少经验。我见过太多的开发者,只会用图形界面,或者只会几个简单的命令,遇到复杂一点的问题,就束手无策。其实,只要掌握了一些常用的命令和技巧,Linux命令行,就能成为你手中的利器。
2015年,Linux已经成为服务器操作系统的绝对主流。无论是Web服务器、数据库服务器、缓存服务器,还是云计算平台,绝大多数都运行在Linux上。作为一个程序员,无论是做开发还是做运维,都不可避免地要和Linux打交道。掌握Linux命令行,已经成为了程序员的必备技能。
今天,分享Linux命令行技巧,从基础命令到高级技巧,从文件操作到系统管理,从文本处理到网络工具,全方位讲解Linux命令行的使用方法和技巧,帮你提升工作效率,成为命令行高手。
基础命令
1. 文件和目录操作
ls:列出目录内容
ls # 列出当前目录内容
ls -l # 长格式显示,显示权限、所有者、大小、时间等
ls -a # 显示所有文件,包括隐藏文件
ls -lh # 人类可读的大小格式(K、M、G)
ls -lt # 按修改时间排序,最新的在前面
ls -R # 递归列出子目录内容cd:切换目录
cd /path/to/dir # 切换到指定目录
cd ~ # 切换到用户主目录
cd - # 切换到上一个目录
cd .. # 切换到上一级目录
cd ../.. # 切换到上两级目录pwd:显示当前工作目录
pwdmkdir:创建目录
mkdir dirname # 创建目录
mkdir -p dir1/dir2/dir3 # 递归创建多级目录
mkdir -m 755 dirname # 创建目录并设置权限rm:删除文件或目录
rm filename # 删除文件
rm -r dirname # 递归删除目录及其内容
rm -f filename # 强制删除,不提示
rm -rf dirname # 强制递归删除目录(危险!慎用)
rm -i filename # 删除前提示确认cp:复制文件或目录
cp file1 file2 # 复制文件
cp -r dir1 dir2 # 递归复制目录
cp -p file1 file2 # 复制时保留权限、所有者、时间戳
cp -v file1 file2 # 显示复制过程
cp -a dir1 dir2 # 归档复制,保留所有属性mv:移动或重命名文件或目录
mv oldname newname # 重命名
mv file1 /path/to/dir # 移动文件到指定目录
mv -i file1 file2 # 覆盖前提示
mv -u file1 file2 # 只在源文件比目标文件新时才移动touch:创建空文件或更新文件时间戳
touch filename # 创建空文件或更新时间戳
touch -t 201511021200 filename # 设置指定时间戳find:查找文件
find /path -name "*.txt" # 按文件名查找
find /path -type f # 查找所有文件
find /path -type d # 查找所有目录
find /path -size +10M # 查找大于10M的文件
find /path -mtime -7 # 查找7天内修改的文件
find /path -user username # 查找指定用户的文件
find /path -name "*.log" -delete # 查找并删除文件
find /path -name "*.txt" -exec cat {} \; # 查找并执行命令2. 查看文件内容
cat:查看文件内容
cat filename # 查看文件内容
cat -n filename # 显示行号
cat -A filename # 显示所有字符,包括不可见字符
cat file1 file2 # 合并显示多个文件less:分页查看文件内容(比more更强大)
less filename # 分页查看文件
# less中的操作:
# 空格:向下翻一页
# b:向上翻一页
# 回车:向下翻一行
# y:向上翻一行
# /pattern:向下搜索
# ?pattern:向上搜索
# n:下一个搜索结果
# N:上一个搜索结果
# g:跳到文件开头
# G:跳到文件末尾
# q:退出head:查看文件开头
head filename # 查看文件前10行
head -n 20 filename # 查看文件前20行
head -c 100 filename # 查看文件前100字节tail:查看文件末尾
tail filename # 查看文件最后10行
tail -n 20 filename # 查看文件最后20行
tail -f filename # 实时跟踪文件变化(查看日志常用)
tail -F filename # 跟踪文件,文件被删除重建后自动重新打开grep:在文件中搜索文本
grep "pattern" filename # 在文件中搜索
grep -i "pattern" filename # 忽略大小写
grep -n "pattern" filename # 显示行号
grep -v "pattern" filename # 反向匹配,显示不包含的行
grep -r "pattern" /path # 递归搜索目录
grep -c "pattern" filename # 统计匹配的行数
grep -l "pattern" *.txt # 只显示包含匹配的文件名
grep -E "pattern1|pattern2" filename # 扩展正则表达式
grep -A 5 "pattern" filename # 显示匹配行及后面5行
grep -B 5 "pattern" filename # 显示匹配行及前面5行
grep -C 5 "pattern" filename # 显示匹配行及前后各5行wc:统计文件行数、字数、字节数
wc filename # 显示行数、字数、字节数
wc -l filename # 只显示行数
wc -w filename # 只显示字数
wc -c filename # 只显示字节数3. 权限管理
chmod:修改文件权限
chmod 755 filename # 设置权限为rwxr-xr-x
chmod +x filename # 添加执行权限
chmod -x filename # 移除执行权限
chmod -R 755 dirname # 递归修改目录权限
# 权限数字:
# 4 = r (读)
# 2 = w (写)
# 1 = x (执行)
# 7 = 4+2+1 = rwx
# 6 = 4+2 = rw-
# 5 = 4+1 = r-xchown:修改文件所有者
chown user:group filename # 修改所有者和所属组
chown user filename # 只修改所有者
chown -R user:group dirname # 递归修改chgrp:修改文件所属组
chgrp group filename
chgrp -R group dirname4. 进程管理
ps:查看进程
ps # 查看当前终端的进程
ps aux # 查看所有进程,详细信息
ps -ef # 查看所有进程,另一种格式
ps aux | grep nginx # 查找特定进程top:实时查看系统进程和资源使用
top
# top中的操作:
# P:按CPU使用率排序
# M:按内存使用率排序
# T:按运行时间排序
# k:杀死进程
# q:退出htop:更强大的交互式进程查看器(需要安装)
htopkill:发送信号给进程
kill PID # 发送TERM信号(15),正常终止进程
kill -9 PID # 发送KILL信号(9),强制杀死进程
kill -l # 列出所有信号
killall processname # 按名称杀死所有进程
pkill pattern # 按模式匹配杀死进程jobs:查看后台任务
jobs # 查看所有后台任务
fg %1 # 将后台任务调到前台
bg %1 # 将暂停的任务在后台继续运行5. 系统管理
df:查看磁盘使用情况
df # 查看磁盘使用情况
df -h # 人类可读格式
df -T # 显示文件系统类型
df -i # 显示inode使用情况du:查看目录或文件大小
du # 查看当前目录大小
du -h # 人类可读格式
du -sh /path # 只显示总计
du -h --max-depth=1 /path # 只显示一级子目录大小free:查看内存使用情况
free # 查看内存使用
free -h # 人类可读格式
free -m # 以MB为单位
free -g # 以GB为单位uptime:查看系统运行时间和负载
uptime
# 输出:当前时间、运行时间、登录用户数、1/5/15分钟平均负载uname:查看系统信息
uname -a # 显示所有系统信息
uname -r # 显示内核版本
uname -m # 显示机器硬件架构hostname:查看或设置主机名
hostname # 查看主机名
hostname newname # 临时设置主机名(重启后失效)date:查看或设置系统时间
date # 查看当前时间
date +"%Y-%m-%d %H:%M:%S" # 格式化输出
date -s "2015-11-02 12:00:00" # 设置时间reboot:重启系统
reboot
shutdown -r now # 立即重启
shutdown -r +10 # 10分钟后重启halt/shutdown:关机
halt
shutdown -h now # 立即关机
shutdown -h +10 # 10分钟后关机
shutdown -c # 取消关机文本处理
1. awk
awk是一个强大的文本处理工具,可以按列处理文本。
# 打印文件的第一列
awk '{print $1}' filename
# 打印文件的第一列和第三列
awk '{print $1, $3}' filename
# 指定分隔符为冒号,打印第一列
awk -F: '{print $1}' /etc/passwd
# 打印第3列大于100的行
awk '$3 > 100' filename
# 打印包含"error"的行的第一列
awk '/error/ {print $1}' filename
# 统计第三列的总和
awk '{sum += $3} END {print sum}' filename
# 打印行数大于10且小于20的行
awk 'NR>10 && NR<20' filename
# 打印最后一列
awk '{print $NF}' filename
# 格式化输出
awk '{printf "%-10s %5d\n", $1, $2}' filename2. sed
sed是一个流编辑器,可以对文本进行替换、删除、插入等操作。
# 替换文件中的old为new(只替换每行第一个)
sed 's/old/new/' filename
# 全局替换
sed 's/old/new/g' filename
# 替换第2行
sed '2s/old/new/' filename
# 删除第3行
sed '3d' filename
# 删除第1到5行
sed '1,5d' filename
# 删除包含"error"的行
sed '/error/d' filename
# 在第2行后插入新行
sed '2a\new line' filename
# 在第2行前插入新行
sed '2i\new line' filename
# 替换第2到5行
sed '2,5c\new content' filename
# 直接修改文件(危险!慎用)
sed -i 's/old/new/g' filename
# 备份原文件后修改
sed -i.bak 's/old/new/g' filename3. sort
sort用于对文本进行排序。
sort filename # 按字母顺序排序
sort -r filename # 反向排序
sort -n filename # 按数字排序
sort -k2 filename # 按第2列排序
sort -k2 -n filename # 按第2列数字排序
sort -u filename # 排序并去重
sort -t: -k3 -n /etc/passwd # 指定分隔符为冒号,按第3列数字排序4. uniq
uniq用于去除重复行(需要先排序)。
sort filename | uniq # 去重
sort filename | uniq -c # 统计每行出现的次数
sort filename | uniq -d # 只显示重复的行
sort filename | uniq -u # 只显示不重复的行5. cut
cut用于按列切割文本。
cut -d: -f1 /etc/passwd # 以冒号为分隔符,取第1列
cut -d: -f1,3 /etc/passwd # 取第1列和第3列
cut -d: -f1-3 /etc/passwd # 取第1到3列
cut -c1-5 filename # 取每行前5个字符
cut -c5- filename # 取每行第5个字符到末尾6. tr
tr用于字符转换或删除。
# 小写转大写
cat filename | tr a-z A-Z
# 大写转小写
cat filename | tr A-Z a-z
# 删除指定字符
cat filename | tr -d '\n' # 删除换行符
# 压缩重复字符
cat filename | tr -s ' ' # 压缩多个空格为一个网络工具
1. ping
ping用于测试网络连通性。
ping google.com
ping -c 4 google.com # 发送4个包后停止
ping -i 2 google.com # 每隔2秒发一个包2. traceroute
traceroute用于追踪网络路由。
traceroute google.com3. curl
curl是一个强大的网络传输工具。
# 发送GET请求
curl http://example.com
# 显示响应头
curl -I http://example.com
# 跟随重定向
curl -L http://example.com
# 发送POST请求
curl -X POST -d "key=value" http://example.com
# 发送JSON数据
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' http://example.com
# 下载文件
curl -O http://example.com/file.zip
# 下载文件并重命名
curl -o newname.zip http://example.com/file.zip
# 显示下载进度
curl -# -O http://example.com/file.zip
# 使用代理
curl -x http://proxy:port http://example.com
# 发送Cookie
curl -b "name=value" http://example.com
# 保存Cookie
curl -c cookies.txt http://example.com4. wget
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 --limit-rate=100k http://example.com/file.zip # 限制下载速度
wget -r -np http://example.com/dir/ # 递归下载目录5. netstat
netstat用于查看网络连接和端口。
netstat -tuln # 查看所有监听的TCP和UDP端口
netstat -tulnp # 显示进程信息(需要root)
netstat -an # 查看所有网络连接
netstat -rn # 查看路由表
netstat -i # 查看网络接口统计6. ss
ss是netstat的替代工具,更快更强大。
ss -tuln # 查看所有监听端口
ss -tulnp # 显示进程信息
ss -an # 查看所有连接
ss -tn state established # 查看所有已建立的TCP连接7. ifconfig/ip
ifconfig和ip用于查看和配置网络接口。
ifconfig # 查看网络接口信息(旧命令)
ifconfig eth0 # 查看指定接口
ip addr # 查看网络接口信息(新命令)
ip link # 查看网络接口状态
ip route # 查看路由表
ip neigh # 查看ARP表8. ssh
ssh用于远程登录。
ssh user@host
ssh -p 2222 user@host # 指定端口
ssh -i keyfile user@host # 指定私钥文件
ssh -L 8080:localhost:80 user@host # 本地端口转发
ssh -D 1080 user@host # 动态端口转发(SOCKS代理)9. scp
scp用于远程复制文件。
scp file.txt user@host:/path/ # 本地文件复制到远程
scp user@host:/path/file.txt ./ # 远程文件复制到本地
scp -r dir user@host:/path/ # 递归复制目录
scp -P 2222 file.txt user@host:/path/ # 指定端口10. rsync
rsync用于高效的文件同步。
rsync -avz source/ destination/ # 同步目录
rsync -avz --delete source/ destination/ # 同步并删除目标中多余的文件
rsync -avz -e "ssh -p 2222" source/ user@host:/path/ # 通过ssh同步
rsync -avz --progress source/ destination/ # 显示进度压缩和解压
1. tar
tar用于打包和解包。
# 打包
tar -cvf archive.tar dirname # 打包为tar
tar -czvf archive.tar.gz dirname # 打包并gzip压缩
tar -cjvf archive.tar.bz2 dirname # 打包并bzip2压缩
tar -cJvf archive.tar.xz dirname # 打包并xz压缩
# 解包
tar -xvf archive.tar # 解包tar
tar -xzvf archive.tar.gz # 解包tar.gz
tar -xjvf archive.tar.bz2 # 解包tar.bz2
tar -xJvf archive.tar.xz # 解包tar.xz
# 查看包内容
tar -tvf archive.tar
tar -tzvf archive.tar.gz
# 解包到指定目录
tar -xzvf archive.tar.gz -C /path/to/dir2. gzip/gunzip
gzip file.txt # 压缩为file.txt.gz
gzip -d file.txt.gz # 解压
gunzip file.txt.gz # 解压
gzip -c file.txt > file.txt.gz # 压缩到标准输出,保留原文件3. zip/unzip
zip archive.zip file1 file2 # 压缩为zip
zip -r archive.zip dirname # 递归压缩目录
unzip archive.zip # 解压
unzip -l archive.zip # 查看zip内容
unzip archive.zip -d /path # 解压到指定目录高级技巧
1. 管道和重定向
# 管道:将前一个命令的输出作为后一个命令的输入
cat filename | grep "error" | wc -l
# 输出重定向
command > file.txt # 覆盖写入
command >> file.txt # 追加写入
command 2> error.log # 重定向错误输出
command > output.log 2>&1 # 重定向标准输出和错误输出到同一个文件
command > /dev/null 2>&1 # 丢弃所有输出
# 输入重定向
command < file.txt # 从文件读取输入
command << EOF # here document
line1
line2
EOF2. 命令替换
# 将命令的输出作为参数
echo "Today is $(date)"
echo "Files: $(ls | wc -l)"
# 旧语法
echo "Today is `date`"3. 别名
# 定义别名
alias ll='ls -la'
alias gs='git status'
alias ..='cd ..'
# 查看别名
alias
# 删除别名
unalias ll将别名写入~/.bashrc或~/.bash_profile,使其永久生效。
4. 历史命令
history # 查看历史命令
history -c # 清除历史命令
!100 # 执行第100条历史命令
!! # 执行上一条命令
!ls # 执行最近一条以ls开头的命令
!?ls? # 执行最近一条包含ls的命令
^old^new # 将上一条命令中的old替换为new并执行5. 快捷键
Ctrl + A # 光标移到行首
Ctrl + E # 光标移到行尾
Ctrl + U # 删除光标到行首的内容
Ctrl + K # 删除光标到行尾的内容
Ctrl + W # 删除光标前一个单词
Ctrl + L # 清屏(相当于clear)
Ctrl + C # 中断当前命令
Ctrl + Z # 暂停当前命令(放到后台)
Ctrl + R # 搜索历史命令
Ctrl + D # 退出当前shell(相当于exit)
Tab # 自动补全6. 后台执行
command & # 后台执行
nohup command & # 后台执行,退出终端后继续运行
nohup command > output.log 2>&1 & # 后台执行并输出到文件7. 批量重命名
# 将所有.txt文件重命名为.bak
for f in *.txt; do mv "$f" "${f%.txt}.bak"; done
# 批量添加前缀
for f in *.txt; do mv "$f" "prefix_$f"; done
# 使用rename命令(Perl版本)
rename 's/\.txt$/.bak/' *.txt8. 查找大文件
# 查找当前目录下大于100M的文件
find . -type f -size +100M -exec ls -lh {} \;
# 查找当前目录下最大的10个文件
find . -type f -exec ls -s {} \; | sort -n -r | head -10
# 查看当前目录下各子目录大小
du -h --max-depth=1 | sort -hr9. 监控日志
# 实时查看日志
tail -f /var/log/nginx/access.log
# 实时查看并过滤
tail -f /var/log/nginx/access.log | grep "error"
# 同时查看多个日志
tail -f /var/log/nginx/access.log /var/log/nginx/error.log
# 查看日志中出现最多的IP
cat /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -1010. 系统资源监控
# 实时监控系统资源
vmstat 1 # 每秒显示一次虚拟内存统计
iostat 1 # 每秒显示一次IO统计
sar -u 1 # 每秒显示一次CPU使用情况
sar -r 1 # 每秒显示一次内存使用情况
sar -n DEV 1 # 每秒显示一次网络统计
# 查看进程占用资源
ps aux --sort=-%cpu | head -10 # CPU占用最高的10个进程
ps aux --sort=-%mem | head -10 # 内存占用最高的10个进程实用脚本
1. 备份脚本
#!/bin/bash
# 备份网站文件和数据库
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d_%H%M%S)
WEB_DIR="/var/www/html"
DB_NAME="dbname"
DB_USER="dbuser"
DB_PASS="dbpass"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 备份网站文件
tar -czf $BACKUP_DIR/web_$DATE.tar.gz -C /var/www html
# 备份数据库
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME | gzip > $BACKUP_DIR/db_$DATE.sql.gz
# 删除7天前的备份
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "Backup completed: $DATE"2. 磁盘空间监控
#!/bin/bash
# 监控磁盘空间,超过90%发送告警
THRESHOLD=90
ADMIN_EMAIL="admin@example.com"
df -h | grep -vE '^Filesystem|tmpfs|cdrom' | while read output; do
usage=$(echo $output | awk '{print $5}' | cut -d'%' -f1)
partition=$(echo $output | awk '{print $6}')
if [ $usage -ge $THRESHOLD ]; then
echo "Disk space alert: $partition is ${usage}% full" | mail -s "Disk Space Alert" $ADMIN_EMAIL
fi
done3. 批量创建用户
#!/bin/bash
# 批量创建用户
USERS=("user1" "user2" "user3")
PASSWORD="defaultpass123"
for user in "${USERS[@]}"; do
# 创建用户
useradd -m -s /bin/bash $user
# 设置密码
echo "$user:$PASSWORD" | chpasswd
# 将用户添加到sudo组
usermod -aG sudo $user
echo "User $user created"
done学习资源
推荐书籍
- 《鸟哥的Linux私房菜》:Linux入门经典
- 《Linux命令行与shell脚本编程大全》:命令行和脚本编程
- 《UNIX环境高级编程》:深入理解UNIX/Linux系统编程
- 《Linux系统管理技术手册》:系统管理
在线资源
- Linux man pages:
man command查看命令帮助 - Linux命令大全:http://man.linuxde.net/
- Shell脚本教程:https://www.runoob.com/linux/linux-shell.html
总结
Linux命令行技巧要点:
- 基础命令:文件目录操作(ls cd pwd mkdir rm cp mv touch find)、查看文件内容(cat less head tail grep wc)、权限管理(chmod chown chgrp)、进程管理(ps top htop kill jobs)、系统管理(df du free uptime uname hostname date reboot shutdown)
- 文本处理:awk(按列处理文本,强大的文本分析工具)、sed(流编辑器,替换删除插入)、sort(排序)、uniq(去重)、cut(按列切割)、tr(字符转换删除)
- 网络工具:ping(连通性测试)、traceroute(路由追踪)、curl(网络传输,GET/POST/下载)、wget(文件下载,断点续传)、netstat/ss(网络连接和端口)、ifconfig/ip(网络接口)、ssh(远程登录)、scp(远程复制)、rsync(高效文件同步)
- 压缩解压:tar(打包解包,支持gzip/bzip2/xz)、gzip/gunzip、zip/unzip
- 高级技巧:管道和重定向(| > >> 2> 2>&1 /dev/null)、命令替换($())、别名(alias)、历史命令(history ! !! ^old^new)、快捷键(Ctrl+A/E/U/K/L/C/Z/R Tab)、后台执行(& nohup)、批量重命名、查找大文件、监控日志、系统资源监控
- 实用脚本:备份脚本(备份网站文件和数据库,自动删除旧备份)、磁盘空间监控(超过阈值发送告警)、批量创建用户
- 学习资源:《鸟哥的Linux私房菜》《Linux命令行与shell脚本编程大全》《UNIX环境高级编程》《Linux系统管理技术手册》,man pages,在线教程
Linux命令行,是程序员和运维人员的必备技能。熟练掌握Linux命令行,不仅能提升工作效率,还能让你更深入地理解操作系统,解决各种复杂的问题。
学习Linux命令行,没有捷径,只有多练多用。刚开始,可能会觉得命令太多,记不住。但没关系,常用的命令,也就几十个,用多了,自然就记住了。遇到不熟悉的命令,用man查看帮助,或者上网搜索,慢慢积累,就会越来越熟练。
"熟能生巧。"Linux命令行,也是如此。用得多了,自然就熟练了。希望这篇文章,能帮你掌握Linux命令行的常用技巧,提升你的工作效率,成为命令行高手。
最后,记住:Linux命令行,是工具,不是目的。 我们学习命令行,是为了更好地完成工作,解决问题。不要为了学命令行而学命令行,要在实际工作中,多运用,多总结,才能真正掌握。
祝你,在Linux的世界里,游刃有余,高效工作!
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录