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:显示当前工作目录

pwd

mkdir:创建目录

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-x

chown:修改文件所有者

chown user:group filename   # 修改所有者和所属组
chown user filename          # 只修改所有者
chown -R user:group dirname  # 递归修改

chgrp:修改文件所属组

chgrp group filename
chgrp -R group dirname

4. 进程管理

ps:查看进程

ps                    # 查看当前终端的进程
ps aux                # 查看所有进程,详细信息
ps -ef                # 查看所有进程,另一种格式
ps aux | grep nginx   # 查找特定进程

top:实时查看系统进程和资源使用

top
# top中的操作:
# P:按CPU使用率排序
# M:按内存使用率排序
# T:按运行时间排序
# k:杀死进程
# q:退出

htop:更强大的交互式进程查看器(需要安装)

htop

kill:发送信号给进程

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}' filename

2. 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' filename

3. 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.com

3. 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.com

4. 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/dir

2. 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
EOF

2. 命令替换

# 将命令的输出作为参数
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/' *.txt

8. 查找大文件

# 查找当前目录下大于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 -hr

9. 监控日志

# 实时查看日志
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 -10

10. 系统资源监控

# 实时监控系统资源
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
done

3. 批量创建用户

#!/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命令行技巧要点:

  1. 基础命令:文件目录操作(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)
  2. 文本处理:awk(按列处理文本,强大的文本分析工具)、sed(流编辑器,替换删除插入)、sort(排序)、uniq(去重)、cut(按列切割)、tr(字符转换删除)
  3. 网络工具:ping(连通性测试)、traceroute(路由追踪)、curl(网络传输,GET/POST/下载)、wget(文件下载,断点续传)、netstat/ss(网络连接和端口)、ifconfig/ip(网络接口)、ssh(远程登录)、scp(远程复制)、rsync(高效文件同步)
  4. 压缩解压:tar(打包解包,支持gzip/bzip2/xz)、gzip/gunzip、zip/unzip
  5. 高级技巧:管道和重定向(| > >> 2> 2>&1 /dev/null)、命令替换($())、别名(alias)、历史命令(history ! !! ^old^new)、快捷键(Ctrl+A/E/U/K/L/C/Z/R Tab)、后台执行(& nohup)、批量重命名、查找大文件、监控日志、系统资源监控
  6. 实用脚本:备份脚本(备份网站文件和数据库,自动删除旧备份)、磁盘空间监控(超过阈值发送告警)、批量创建用户
  7. 学习资源:《鸟哥的Linux私房菜》《Linux命令行与shell脚本编程大全》《UNIX环境高级编程》《Linux系统管理技术手册》,man pages,在线教程

Linux命令行,是程序员和运维人员的必备技能。熟练掌握Linux命令行,不仅能提升工作效率,还能让你更深入地理解操作系统,解决各种复杂的问题。

学习Linux命令行,没有捷径,只有多练多用。刚开始,可能会觉得命令太多,记不住。但没关系,常用的命令,也就几十个,用多了,自然就记住了。遇到不熟悉的命令,用man查看帮助,或者上网搜索,慢慢积累,就会越来越熟练。

"熟能生巧。"Linux命令行,也是如此。用得多了,自然就熟练了。希望这篇文章,能帮你掌握Linux命令行的常用技巧,提升你的工作效率,成为命令行高手。

最后,记住:Linux命令行,是工具,不是目的。 我们学习命令行,是为了更好地完成工作,解决问题。不要为了学命令行而学命令行,要在实际工作中,多运用,多总结,才能真正掌握。

祝你,在Linux的世界里,游刃有余,高效工作!