The Logic Layer

Linux命令行实用技巧

Linux 1,567 阅读

Linux命令行是Linux系统的核心,掌握一些实用的命令行技巧可以大大提高工作效率。本文将介绍一些Linux命令行的实用技巧,帮助你更高效地使用Linux系统。

1. 命令历史

Linux会记录你执行过的命令,这些命令保存在历史文件中(通常是`~/.bash_history`)。利用命令历史可以快速重复执行之前的命令。

# 查看命令历史
$ history

# 执行历史中的第n条命令
$ !n

# 执行上一条命令
$ !!

# 执行最近一次以特定字符串开头的命令
$ !string

# 搜索命令历史(按Ctrl+R进入搜索模式,输入关键词,按Enter执行)
# 示例:搜索包含"git"的命令
(reverse-i-search)`git': git commit -m "Add new feature"

# 清除命令历史
$ history -c

2. 命令别名

命令别名允许你为常用的命令创建简短的别名,减少输入量。你可以在`~/.bashrc`或`~/.bash_aliases`文件中定义别名。

# 临时创建别名(仅在当前会话有效)
$ alias ll='ls -la'

# 永久创建别名(编辑~/.bashrc文件)
$ echo "alias ll='ls -la'" >> ~/.bashrc
$ echo "alias gitcm='git commit -m'" >> ~/.bashrc
$ echo "alias gs='git status'" >> ~/.bashrc

# 重新加载~/.bashrc文件使别名生效
$ source ~/.bashrc

# 查看所有别名
$ alias

# 取消别名
$ unalias ll

3. 文件和目录操作

文件和目录操作是Linux命令行中最常用的操作之一,以下是一些实用技巧:

# 递归创建目录
$ mkdir -p dir1/dir2/dir3

# 复制文件并保留权限
$ cp -p source.txt destination.txt

# 递归复制目录
$ cp -r source_dir destination_dir

# 移动文件或目录
$ mv source destination

# 安全删除文件(需要安装trash-cli)
$ trash-put file.txt

# 查找文件
$ find /path/to/search -name "filename"
$ find /path/to/search -type f -name "*.txt"  # 查找所有.txt文件
$ find /path/to/search -type d -name "dir*"   # 查找所有以dir开头的目录

# 查找包含特定内容的文件
$ grep -r "content" /path/to/search
$ grep -r "content" /path/to/search --include="*.txt"  # 仅查找.txt文件

# 查找大文件
$ find /path/to/search -type f -size +100M  # 查找大于100MB的文件

# 查看文件大小
$ du -h file.txt  # 以人类可读的格式显示
$ du -sh directory  # 显示目录的总大小

# 排序文件大小
$ du -h * | sort -hr  # 按大小降序排序

# 显示文件的前n行
$ head -n 10 file.txt

# 显示文件的后n行
$ tail -n 10 file.txt

# 实时查看文件内容(常用于查看日志)
$ tail -f file.txt

# 查看文件的前n个字符
$ head -c 100 file.txt

# 查看文件的后n个字符
$ tail -c 100 file.txt

# 统计文件的行数、单词数和字符数
$ wc file.txt
$ wc -l file.txt  # 仅统计行数
$ wc -w file.txt  # 仅统计单词数
$ wc -c file.txt  # 仅统计字符数

# 比较两个文件的差异
$ diff file1.txt file2.txt
$ vimdiff file1.txt file2.txt  # 使用vim查看差异

# 合并两个文件的差异
$ patch file1.txt file2.patch

4. 文本处理

Linux提供了强大的文本处理工具,如grep、sed、awk等,它们可以帮助你快速处理和分析文本数据。

# 搜索文本
$ grep "pattern" file.txt
$ grep -i "pattern" file.txt  # 忽略大小写
$ grep -v "pattern" file.txt  # 反向搜索,显示不包含pattern的行
$ grep -n "pattern" file.txt  # 显示行号
$ grep -A 2 -B 2 "pattern" file.txt  # 显示匹配行及其前后2行

# 替换文本
$ sed 's/old/new/g' file.txt  # 替换所有匹配的文本
$ sed 's/old/new/' file.txt   # 只替换每行的第一个匹配
$ sed -i 's/old/new/g' file.txt  # 直接修改文件

# 按列处理文本
$ awk '{print $1, $3}' file.txt  # 打印第1列和第3列
$ awk -F"," '{print $1}' file.csv  # 使用逗号作为分隔符
$ awk '{sum += $1} END {print sum}' file.txt  # 计算第1列的和

# 排序文本
$ sort file.txt
$ sort -n file.txt  # 按数字排序
$ sort -r file.txt  # 反向排序
$ sort -k 2 file.txt  # 按第2列排序

# 去重
$ uniq file.txt  # 移除连续的重复行
$ sort file.txt | uniq  # 移除所有重复行
$ sort file.txt | uniq -c  # 显示重复行的次数

# 分割文件
$ split -l 1000 file.txt  # 每1000行分割为一个文件
$ split -b 10M file.txt   # 每10MB分割为一个文件

# 连接文件
$ cat file1.txt file2.txt > combined.txt

# 压缩文件
$ gzip file.txt
$ bzip2 file.txt
$ xz file.txt

# 解压文件
$ gunzip file.txt.gz
$ bunzip2 file.txt.bz2
$ unxz file.txt.xz

# 创建和提取tar归档
$ tar -cvf archive.tar files/  # 创建归档
$ tar -xvf archive.tar        # 提取归档
$ tar -czvf archive.tar.gz files/  # 创建压缩归档
$ tar -xzvf archive.tar.gz        # 提取压缩归档

5. 系统管理

以下是一些系统管理相关的实用命令:

# 查看系统信息
$ uname -a
$ lsb_release -a

# 查看CPU信息
$ cat /proc/cpuinfo
$ lscpu

# 查看内存信息
$ free -h
$ cat /proc/meminfo

# 查看磁盘使用情况
$ df -h

# 查看磁盘分区
$ fdisk -l
$ lsblk

# 查看系统负载
$ uptime
$ top
$ htop  # 需要安装

# 查看进程
$ ps aux
$ ps aux | grep process_name

# 终止进程
$ kill PID
$ kill -9 PID  # 强制终止
$ pkill process_name

# 查看网络连接
$ netstat -tuln
$ ss -tuln  # 更现代的命令

# 查看IP地址
$ ifconfig
$ ip addr

# 测试网络连接
$ ping google.com
$ traceroute google.com
$ mtr google.com  # 需要安装

# 下载文件
$ wget https://example.com/file.txt
$ curl -O https://example.com/file.txt

# 查看系统日志
$ journalctl  # systemd日志
$ tail -f /var/log/syslog  # 系统日志
$ tail -f /var/log/auth.log  # 认证日志

# 查看用户登录历史
$ last
$ lastlog

# 查看当前登录用户
$ who
$ w

# 切换用户
$ su - username

# 以其他用户身份执行命令
$ sudo command

# 查看sudo历史
$ sudo journalctl _COMM=sudo

# 更改文件权限
$ chmod 755 file.txt
$ chmod +x script.sh

# 更改文件所有者
$ chown user:group file.txt

# 查看文件的访问时间、修改时间和更改时间
$ stat file.txt

# 查找最近修改的文件
$ find /path/to/search -type f -mtime -1  # 最近1天修改的文件
$ find /path/to/search -type f -mmin -30  # 最近30分钟修改的文件

# 清理系统垃圾
$ sudo apt clean  # Debian/Ubuntu
$ sudo dnf clean all  # Fedora
$ sudo yum clean all  # CentOS/RHEL

# 检查系统更新
$ sudo apt update  # Debian/Ubuntu
$ sudo dnf check-update  # Fedora
$ sudo yum check-update  # CentOS/RHEL

# 安装系统更新
$ sudo apt upgrade  # Debian/Ubuntu
$ sudo dnf update  # Fedora
$ sudo yum update  # CentOS/RHEL

6. 命令行快捷键

命令行快捷键可以帮助你更高效地操作命令行:

# 光标移动
Ctrl+A  # 移动到行首
Ctrl+E  # 移动到行尾
Ctrl+F  # 向前移动一个字符
Ctrl+B  # 向后移动一个字符
Alt+F   # 向前移动一个单词
Alt+B   # 向后移动一个单词

# 删除
Ctrl+U  # 删除从光标到行首的内容
Ctrl+K  # 删除从光标到行尾的内容
Ctrl+W  # 删除从光标到前一个单词的内容
Alt+D   # 删除从光标到下一个单词的内容

# 编辑
Ctrl+C  # 中断当前命令
Ctrl+D  # 发送EOF(结束文件),退出shell
Ctrl+Z  # 暂停当前命令,放入后台

# 历史导航
Ctrl+R  # 反向搜索命令历史
Ctrl+P  # 上一条命令
Ctrl+N  # 下一条命令

# 其他
Ctrl+L  # 清屏
Ctrl+S  # 暂停输出
Ctrl+Q  # 恢复输出
Tab     # 自动补全命令、文件名等

# 重复执行命令
!!      # 执行上一条命令
!n      # 执行历史中的第n条命令
!string # 执行最近一次以string开头的命令

# 在命令间跳转
Ctrl+O  # 执行当前命令并显示下一条命令

# 修正命令
^old^new^  # 替换上一条命令中的old为new并执行

# 查看命令的完整路径
which command

# 查看命令的帮助信息
command --help
man command
info command

7. 高级技巧

以下是一些更高级的Linux命令行技巧:

# 命令组合
$ command1 && command2  # 仅当command1成功执行后才执行command2
$ command1 || command2  # 仅当command1执行失败后才执行command2
$ command1 ; command2   # 无论command1是否成功,都执行command2

# 管道
$ command1 | command2  # 将command1的输出作为command2的输入
$ command1 | command2 | command3  # 多级管道

# 重定向
$ command > file.txt  # 将标准输出重定向到file.txt(覆盖)
$ command >> file.txt  # 将标准输出重定向到file.txt(追加)
$ command 2> error.txt  # 将标准错误重定向到error.txt
$ command > file.txt 2>&1  # 将标准输出和标准错误都重定向到file.txt
$ command < input.txt  # 将input.txt作为command的标准输入

# 后台执行
$ command &  # 在后台执行命令
$ nohup command &  # 在后台执行命令,即使关闭终端也继续运行
$ disown  # 从当前shell中分离后台任务

# 作业控制
$ jobs  # 查看后台作业
$ fg %n  # 将后台作业n带到前台
$ bg %n  # 将前台作业n放到后台

# 命令替换
$ echo "Today is $(date)"  # 使用$()进行命令替换
$ echo "Today is `date`"  # 使用``进行命令替换

# 变量
$ var=value  # 定义变量
$ echo $var  # 访问变量
$ export var  # 导出变量,使其在子shell中可用

# 数组
$ array=(value1 value2 value3)
$ echo ${array[0]}  # 访问第一个元素
$ echo ${array[@]}  # 访问所有元素
$ echo ${#array[@]}  # 数组长度

# 条件判断
$ if [ condition ]; then
    commands
  elif [ condition ]; then
    commands
  else
    commands
  fi

# 循环
$ for i in {1..10}; do
    echo $i
  done

$ while [ condition ]; do
    commands
  done

# 函数
$ function name() {
    commands
  }

$ name() {
    commands
  }

# 计算
$ echo $((1+1))
$ expr 1 + 1
$ bc <<< "1+1"

# 随机数
$ echo $RANDOM
$ shuf -i 1-100 -n 1

# 字符串操作
$ string="hello world"
$ echo ${#string}  # 字符串长度
$ echo ${string:0:5}  # 截取前5个字符
$ echo ${string//world/everyone}  # 替换字符串

# 网络相关
$ curl ifconfig.me  # 查看公网IP
$ curl ipinfo.io  # 查看IP信息
$ ssh user@hostname  # SSH登录
$ scp file.txt user@hostname:/path/to/destination  # 复制文件到远程服务器
$ rsync -avz source/ user@hostname:/path/to/destination  # 同步文件到远程服务器

# 磁盘相关
$ dd if=/dev/zero of=/path/to/file bs=1M count=100  # 创建100MB的文件
$ shred -u file.txt  # 安全删除文件

# 时间相关
$ date  # 显示当前时间
$ date -s "2024-03-01 12:00:00"  # 设置系统时间
$ sleep 10  # 睡眠10秒

# 系统监控
$ watch -n 1 'command'  # 每1秒执行一次命令并显示结果
$ vmstat 1  # 每1秒显示一次系统状态
$ iostat 1  # 每1秒显示一次I/O统计

# 调试
$ set -x  # 开启调试模式
$ set +x  # 关闭调试模式
$ bash -x script.sh  # 以调试模式执行脚本

# 查看系统调用
$ strace command  # 跟踪命令的系统调用
$ ltrace command  # 跟踪命令的库调用

# 查看文件的依赖
$ ldd /path/to/executable

# 查看进程的打开文件
$ lsof -p PID

# 查看端口占用
$ lsof -i :8080
$ netstat -tuln | grep 8080
$ ss -tuln | grep 8080

# 生成SSH密钥
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

# 复制SSH公钥到远程服务器
$ ssh-copy-id user@hostname

# 查看SSL证书信息
$ openssl x509 -in certificate.crt -text -noout

# 测试SSL连接
$ openssl s_client -connect example.com:443

# 生成密码
$ openssl rand -base64 32
$ pwgen 12 1  # 需要安装pwgen

# 加密文件
$ openssl enc -aes-256-cbc -salt -in file.txt -out file.txt.enc

# 解密文件
$ openssl enc -d -aes-256-cbc -in file.txt.enc -out file.txt

# 查看文件的MD5哈希值
$ md5sum file.txt

# 查看文件的SHA1哈希值
$ sha1sum file.txt

# 查看文件的SHA256哈希值
$ sha256sum file.txt

# 比较两个文件的哈希值
$ md5sum file1.txt file2.txt

# 检查文件的完整性
$ md5sum -c checksums.txt

8. 命令行工具推荐

以下是一些值得推荐的命令行工具:

  • htop - 增强版的top命令,提供更友好的界面和更多功能
  • iftop - 实时显示网络带宽使用情况
  • iotop - 实时显示磁盘I/O使用情况
  • ncdu - 交互式磁盘使用分析工具
  • tmux - 终端复用器,允许在一个终端中运行多个会话
  • screen - 终端复用器,类似于tmux
  • fd - 更快速、更友好的find替代品
  • rg - 更快速、更友好的grep替代品
  • bat - 增强版的cat命令,支持语法高亮
  • exa - 增强版的ls命令,提供更友好的界面
  • fzf - 命令行模糊查找工具
  • ripgrep - 快速的文本搜索工具
  • tldr - 简化版的man页,提供实用的命令示例
  • httpie - 增强版的curl命令,提供更友好的界面
  • jq - JSON处理工具
  • yq - YAML处理工具
  • docker - 容器化平台
  • git - 版本控制系统
  • vim - 文本编辑器
  • neovim - 增强版的vim

结论

Linux命令行是一个强大的工具,掌握这些实用技巧可以大大提高你的工作效率。当然,Linux命令行的功能远不止于此,还有很多其他的命令和技巧等待你去探索。

记住,最好的学习方法是实践。尝试在日常工作中使用这些命令和技巧,逐渐熟悉它们,你会发现Linux命令行越来越得心应手。

希望本文对你有所帮助,祝你在Linux的世界中愉快地探索!