跳到主要内容

Linux-常用 Shell 命令

· 阅读需 22 分钟

最后更新于 2018-10-14 13:00:00

Linux 是一个优秀的开发环境,大多数服务器都在上面部署。作为一个程序员,熟悉Linux 系统的常用操作也是很必要的。在 linux 内核外,shell 提供了我们程序员(用户)与内核之间的交互媒介,shell 可以说是一个命令解释器,当然它也负责将内核输出信息翻译给程序员。

Shell

Linux 是一个基于命令行的操作系统,提供了一个命令解释器,即 Shell(壳)。Shell 是一个软件,是操作系统的用户界面,用户通过在 Shell 中输入命令,然后命令解释器解释完成后将指令送往内核中执行,来实现对 Linux 系统的操作。

Linux 中的 Shell 也有不同的版本:Bourne Shell(贝尔实验室开发)、Bash(GNU 开发)、C shell(Sun 公司开发)、Z shell(集成了前几种 shell 的优点)等等,我们目前最常用的就是 Bash。

常用命令

下面将是一些常用的 Shell 命令的总结,熟悉这些命令能帮助我们更快的适应 Linux 系统的环境。

目录、文件

文件与目录是系统中最常见的基本单位,这里介绍一些常用的文件、目录操作。

# 文件属性与权限(总共10位)
[-][---][---][---]
# 第1位:-表示文件;d表示目录;l表示软链接
# 第2-4位:rwx 所有者(user)用户权限
# 第5-7位:rwx 所属组(group)用户权限
# 第8-10位: rwx 其他用户权限
r (可读) w (可写) x (可执行)
# 示例
-rwxr-xr-x # 这是一个文件,所有者可读可写可执行,所属组与其他用户可读可执行但不可写

pwd # 查看当前路径
cd [目录] # 切换到目标目录

创建

# 目录
mkdir [目录] # 创建一个空目录
mkdir -p [目录/子目录/] # 创建一个多层嵌套目录

# 文件
touch [文件] # 创建一个文件,或者更新已有文件时间

删除

# 命令格式
rm [选项] [目录文件]
# 命令选项
-i # 删除时提示
-r # 允许删除目录
-f # 忽略提示警告
# 命令示例
rm -rf ./tmp # 删除当前目录下的tmp文件或目录,忽略提示警告

rmdir [目录] # 删除一个目录(只能删除空目录)

查看

# 目录
# 命令格式
ls [选项] [目录]
# 命令选项
-d # 查看目录属性
-a # 查看目录内所有文件和子目录,包括隐藏的
-l # 显示文件、子目录详细信息
-h # 显示文件、子目录大小(带单位)
-i # 显示文件、子目录 inode
-R # 递归显示目录(显示子目录的子目录路径)
# 命令示例
ls -a # 查看当前目录所有文件、子目录
ls -lh /root/ # 查看root目录内所有文件、子目录并显示详细信息和大小

# 文件
cat [文件] # 查看文件内容
file [文件] # 查看文件类型

head [-n] [文件] # 显示文件内容开始n行(默认10行)
tail [-n] [文件] # 显示文件内容末尾n行(默认10行)
-f # 持续更新文件末尾内容(方便查看更新的日志)

more [文件] # 翻页显示文件内容(只能向下翻页)
less [文件] # 翻页显示文件内容(上下翻页)

复制

# 命令格式
cp [选项] [源目录文件] [目标目录]
# 命令选项
-r # 允许复制目录
-p # 同时复制文件属性
-d # 若源文件是链接文件,则复制链接属性
-a # 相当于 -pdr
-v # 显示详细信息
# 命令示例
cp -r ./tmp1 ./tmp/ # 将当前目录下的tmp1目录或文件复制到当前目录下tmp目录内

剪切

mv [源目录文件] [目标目录]  # 剪切目录或文件
mv [旧目录文件名] [新目录文件名] # 重命名

搜索

由于命令行的界面给我们查看系统文件带来了视觉上的不便,所以学会使用命令去搜索文件会给我们了解系统中存放的文件情况带来方便。

locate

# 搜索某个目录、文件的所在路径
locate [文件] # 在后台数据库中搜索,速度快;但是最近新建的不能找到,需执行 updatedb 更新数据库

find

# 搜索某个目录、文件的所在路径,以及详细信息等
# 命令格式
find [搜索范围] [选项] [搜索目标]
# 命令选项
-name # 按目录或文件名搜索
-user # 按用户名搜索
-nouser # 搜索没有用户的目录、文件
-mtime # 按内容修改时间搜索
-atime # 按内容访问时间搜索
-ctime # 按属性修改时间搜索
-size # 按目录、文件大小搜索
-inum # 按目录、文件 inode 搜索
# 命令示例
find ./ -name tmp # 在当前目录下搜索名字为tmp的目录和文件
find / -nouser # 在根目录下搜索没有用户的目录和文件
find ./ -mtime +10 # 在当前目录下搜索10天前修改的目录和文件
find ./ -size 25k # 在当前目录下搜索大小为25KB的目录和文件
find ./ -size +25k -a -size -50k # 在当前目录下搜索大小为25KB到50KB的目录和文件
find ./ -inum 262 # 在当前目录下查找inode是262的目录和文件

# 执行多条命令(后一条命令接受前一条命令的结果)
find [搜索范围] [选项] [搜索目标] -exec [命令] [选项] {} \;
# 命令示例
find ./ -size 25k -exec ls -lh {} \; # 搜索当前目录下大小是25KB的目录和文件并显示详细信息

whereis

# 搜索命令所在路径及帮助文档
# 命令格式
whereis [选项] [命令]
# 命令选项
-b # 只查找可执行文件(命令)
-m # 只查找帮助文件
# 命令示例
whereis ls # 查找 ls 命令可执行文件所在路径及帮助文档所在路径

which

# 搜索命令所在路径以及别名
which [命令]

grep

# 搜索文件内容
# 命令格式
grep [选项] [搜索内容] [文件]
# 命令选项
-v # 结果取反
-i # 忽略大小写
# 命令示例
grep "Hello" hello.sh # 搜索 hello.sh 文件内包含Hello字符串的地方

帮助

事实上,Linux 下的 shell 命令大概有三千左右个,而且常用的也非常多,我们不可能去死记硬背,学会适当的时候去查看命令的帮助文件也是很好的。

man

# 命令格式
man [选项] [级别] [命令]
# 命令选项
-f # 查看命令所有级别(等价于 whatis )
-k # 查看所有相关命令(等价于 apropos )
# 命令示例
man ls # 查看 ls 命令详细帮助

help

[命令] --help  # 查看 shell 外部命令的详细帮助,如 ls
help [命令] # 查看 shell 内部命令的详细帮助,如 cd(可用 whereis 判断是否内部命令)

info

# 命令格式
info [命令]
# 帮助页面命令
- 回车 # 进入子帮助页面
- u # 进入上层页面
- n # 进入下一个帮助小节
- p # 进入下一个帮助小节
- q # 退出帮助页面

压缩、解压

Linux 系统下的多数应用软件都是以源代码的方式打包,而解压缩则是安装应用软件的常用操作。

.zip 格式

# 压缩
zip [压缩文件名] [源文件]
zip -r [压缩文件名] [源目录]

# 解压
unzip [源目录文件]

.gz 格式

# 压缩
gzip [源文件] # 直接压缩源文件,源文件消失
gzip -c [源文件] > [压缩文件名] # 本质是写入一个压缩文件,源文件不消失
gzip -r [源目录] # 只会压缩源目录内源文件,源文件消失

# 解压
gzip -d [源文件] # 源文件消失
gunzip [源文件] # 源文件消失
gunzip -r [源目录] # 源目录内源文件解压,源文件消失

.bz2 格式

# 压缩(不能压缩目录)
bzip2 [源文件] # 源文件消失
bzip2 -k [源文件] # 保留源文件

# 解压
bzip2 -d [源文件] # 源文件消失
bzip2 -dk [源文件] # 保留源文件
bunzip2 [源文件] # 源文件消失
bunzip2 -k [源文件] # 保留源文件

.tar 包格式

# 打包、解包
tar [选项] [包文件名] [源文件]
# 命令选项
-c # 打包
-x # 解包
-t # 查看包内文件
-v # 显示过程
-f # 指定打包后文件名
# 命令示例
tar -cvf bag.tar bag # 打包一个目录或文件
tar -xvf bag.tar # 解包
tar -tvf bag.tar # 查看包内文件

.tar.gz,.tar.bz2 格式

# 压缩
tar -zcvf [压缩文件名] [源目录文件] # 保留源目录文件(-z 为 .gz 格式)
tar -jcvf [压缩文件名] [源目录文件] # 保留源目录文件(-j 为 .bz2 格式)

# 解压
tar -zxvf [源文件名] # 保留源文件(-z 为 .gz 格式)
tar -jxvf [源文件名] # 保留源文件(-j 为 .bz2 格式)

命令历史

history  # 所有曾经执行过的命令
-c # 清空历史命令
-w # 把缓存中的历史命令保存在文件中 ./bash_history

!! # 执行上一条命令
!u # 执行曾经以u开头的命令
!12 # 执行曾经第12命令
!-n # 执行曾经第前n个命令
!?name # 执行曾经包含name的命令

Ctrl+R # 搜索曾经执行过的命令
# 按 ESC 后再按 . 会增加上一个命令的选项

命令别名

alias  # 查询所有别名
alias ls="ls --color=never" # 设置别名
unalias ls # 删除别名

# 用户目录下的 bashrc ,设置别名永久生效
source .bashrc # 让文件立即执行,别名立即生效

IO

这里简单介绍一些输入、输出重定向的命令。

输出重定向

# 标准输出重定向
[命令] > [文件] # 以覆盖的方式,把命令的正确输出到指定文件或者设备中去
[命令] >> [文件] # 以追加的方式,把命令的正确输出到指定文件或者设备中去

# 标准错误输出重定向
[错误命令] 2>[文件] # 以覆盖的方式,把命令的正确输出到指定文件或者设备中去(注意>后无空格)
[错误命令] 2>>[文件] # 以追加的方式,把命令的正确输出到指定文件或者设备中去(注意>>后无空格)

# 标准正确和错误输出同时保存
[命令] > [文件] 2>&1 # 覆盖方式
[命令] >> 文件 2>&1 # 追加方式
[命令] &>[文件] # 覆盖方式(注意>后无空格)
[命令] &>>[文件] # 追加方式(注意>>后无空格)
[命令]>>[文件1] 2>>[文件2] # 正确输出保存到文件1,错误输出保存到文件2(注意>>后无空格)

输入重定向

wc  # 输入内容,输入完成后Ctrl+D
-c # 统计字节数
-w # 统计单词数
-l # 统计行数

wc < [文件] # 将文件内容输入
wc << [定界符] # 结束定界符

管道符

[命令1] | [命令2]  # 命令1的正确输出作为命令2的操作对象

系统命令

这是一些涉及到系统权限或者说有关系统信息的命令,应谨慎操作。

关机、重启

  • shutdown

      # 命令格式
    shutdown [选项] [时间]
    # 命令选项
    -h # 关机
    -r # 重启
    -c # 取消前一个关机、重启命令
    # 命令示例
    shutdown -h now # 立即关机
    shutdown -r 20:20 & # 20:20时重启(& 为后台运行)
  • 其他命令

      reboot  # 立即重启
    poweroff # 立即关机
    logout # 退出登录

    # 非安全命令
    init 0 # 0 关机
    init 6 # 6 重启
    # (0 关机 1 单用户 2 不完全多用户,无NFS 3 完全多用户 4 未分配 5 图形界面 6 重启)
    runlevel # 查看当前运行级别

    [命令] & # 该命令在后台执行

用户、密码

su [用户名] # 切换到目标用户,默认是 root 用户

sudo [命令] # 以 root 权限执行该条命令

# 添加用户
useradd [选项] [用户名]
-d # 指定用户目录
-g # 指定用户群组

passwd [用户名] # 更改目标用户密码,默认当前用户

登录日志

w  # 查看系统中用户登录情况,资源情况
who # 查看系统中用户登录情况
last # 查看系统中用户登录日志
lastlog # 查看系统中所有用户最后一次登陆时间

日期、时间

date  # 查看当前系统时间
date -s "20:00:00" # 修改当前时间
date +%Y--%m--%d # 格式化显示

进程管理

通常使用ps命令来查看系统运行的进程信息。

# 显示在当前 shell 终端运行的进程
ps [选项]
-[A|e] # 显示所有进程信息
-l # 显示长列表信息

# 示例
ps -ef # 查看系统中所有运行进程

# 实时显示系统进程信息
top

# 杀死进程
kill [PID]
killall [进程名]

磁盘管理

下面是一些用于对磁盘信息进行查看或者统计的命令。

# 查看磁盘分区使用情况
df [选项] [路径]
-l # 仅显示本地磁盘(默认选项)
-a # 显示所有文件系统的磁盘使用情况
-h # 以1024进制自动换算合适的单位显示磁盘容量
-H # 以1000进制自动换算合适的单位显示磁盘容量
-T # 显示磁盘分区类型
-t # 显示指定类型文件系统的磁盘分区(比如EXT4)
-x # 不显示指定类型文件系统的磁盘分区

# 统计磁盘上的文件大小
du [选项] [路径]
-b # 以byte为单位统计文件(四舍五入)
-k # 以KB为单位统计文件(四舍五入)
-m # 以MB为单位统计文件(四舍五入)
-h # 以1024进制自动换算合适的单位统计文件
-H # 以1000进制自动换算合适的单位统计文件
-s # 指定统计路径(默认是当前路径)

文件系统

仅仅分区之后,磁盘还是不能使用的,必须创建文件系统才能使用,此时也会首先格式化硬盘。

# 创建文件系统
mke2fs [选项] [文件系统格式] [磁盘目录]
-t # 指定文件系统格式
-b # 指定文件系统块大小
-L # 指定卷标
-j # 建立文件系统日志
# 命令示例
mke2fs -t ext4 /dev/sda3

# 简写操作命令
mkfs.[文件系统格式] [磁盘目录]
# 命令示例
mkfs.ext4 /dev/sda3

# 查看文件系统的详细信息
dumpe2fs [磁盘目录]
# 命令示例
dumpe2fs /dev/sda2

# 查看文件系统标签
e2label [磁盘目录]
# 设置文件系统标签
e2label [磁盘目录] [标签名]

# 检查目标磁盘文件系统是否损坏(已卸载)
fsck [磁盘目录]
-y # 不提示直接修复
-t # 指定修复的文件系统格式

挂载、卸载

mount  # 查看系统中已经挂载的设备
mount -a # 按配置文件 /etc/fstab 的内容,自动挂载
mount -t [文件系统] -o [特殊选项] [设备文件名] [挂载点] # 挂载指定设备

umount [挂载点或设备文件名] # 卸载设备文件

fdisk -l # 查看系统中已经识别的硬盘
fdisk -t vfat [设备文件名] [挂载点] # 以 fat32 文件格式挂载U盘(linux 默认不支持 ntfs 文件系统)

端口

netstat -anp | grep 177  # 查看指定端口进程

系统服务

service [服务名称] [选项]
service * start # 启动服务
service * stop # 停止服务
service * status # 服务状态
service * restart # 重启服务

系统信息

# 操作系统信息
uname [选项]
-a # 所有信息,包含操作系统名称,计算机名、内核、架构
-m # 系统架构(32/64)

hwclock # 查看硬件时钟时间(等价 clock 命令)
uptime # 查看系统运行时间

lspci # 查看PCI设备
-v # 详细信息

lsusb # 查看USB设备
-v # 详细信息

lsmod # 查看加载的模块(驱动)

应用安装

dpkg -L [应用名称]  # 查看已安装应用相关路径

dpkg --get-selections | grep [应用名称] # 查看已安装应用相关所有包

快捷键

下面是一些在 Bash 终端界面的快捷键。

  • Ctrl + C 强制终止命令
  • Ctrl + L 清屏命令 clear
  • Ctrl + A 光标移动到行首
  • Ctrl + E 光标移动到行尾
  • Ctrl + U 删除整行
  • Ctrl + Z 把命令放入后台
  • Ctrl + R 在历史中搜索命令