0%

Linux-Shell常用指令

Shell 基本命令

Bash提供了命令行补全的特性.我们可以利用Tab键来完成命令以及文件名的自动补全.如果以已输入的字符开头的文件不止一个,那么连续输入两次Tab键,shell将会以列表的形式给出所有以输入字符开头的文件名.

同样我们可以补全Linux命令,这是因为Linux的命令本质上是一些可执行文件,所以可以认为命令补全和文件名补全其实是同一件事.

此外,Shell在查找文件中存在通配符的专用符号,其为*,?,[].这些通配符可以搜索并匹配文件名的一部分,从而可以做到批量检索文件.

  1. *用于匹配文件名中任意长度的字符串.

    1
    $ ls *.cpp ## 检索以.cpp结尾的文件
  2. ?和*类似,但是与*匹配任意长度的字符串不同,?只能匹配一个字符串

    1
    $ ls text? ## 检索文件名中以text开头并且后面接一个字符的文件.
  3. []用于匹配所有出现在方括号内的字符.

    1
    $ ls text[1A]  ## 用于列出以text开头而仅以1或者A结束的文件

    如果需要查找多个连续字符范围的,可以利用短线-来指定一个字符集范围.所有包含在上下界之间的字符都会被匹配.同样可对字母操作,如在ASC码中,A-Z可以包含所有的大写字母.

    1
    2
    $ ls text[1-3] ## 用于列出以text开头而仅以1-3中字符结束的文件
    $ ls text[A-Z] ## 用于列出以text开头而仅以大写字母结束的文件

虽然我们上面的演示都以通配符位于文件末,但实际上通配符的位置是任意的.并且可以随意搭配使用.

pwd: 显示当前目录

pwd命令会显示当前所在的位置,也就是工作目录.

1
2
3
$ cd /usr/local/bin  ## 进入/usr/local/bin目录
$ pwd ## 显示当前所在位置
/user/local/bin

cd: 改变目录

cd是Linux文件系统在不同文件夹之间转移的常用指令.其后一般都加上路径名作为参数表示跳转到相应的位置,但其有一些特殊的路径符号来简化跳转特定文件夹的指令.

  1. /表示根目录,不管在什么目录下,命令

    1
    $ cd / ## 跳转到根目录

    都会快速跳转到根目录下.

  2. ..表示当前目录的上一级目录,例如如果现在工作目录都是/usr/bin

    1
    $ cd .. ## 跳转到上一级目录

    其会跳转到上一级目录即/usr中.

  3. .表示当前目录,我们如果需要跳转到当前目录的某个文件夹中可以用

    1
    $ cd ./xxx  ## 跳转到同级目录中的下级目录
  4. ~表示用户主目录,其一般是/home/下名称为用户名的文件夹,在其中存储对应用户的数据和设置.同样我们可以用cd命令不加任何参数来跳转到用户主目录.

    1
    2
    $ cd ~  ## 跳转到用户主目录
    $ cd ## 跳转到用户主目录

ls: 列出目录内容

ls命令实际上是list的简化形式.list的用法十分多,但其基本语法是

1
ls [OPTION]... [FILE]... ## ls命令的基本形式

最简单的情况,我们直接在任意工作目录下输入ls命令,用于列出当前目录下所有文件和子目录.为了区分文件目录和文件,linux系统会用不同颜色来标注不同的类型.由于不同的系统对于颜色渲染不太一样,甚至可能没有颜色,我们可以用-F参数的ls命令,-F会在每个目录后面加上/,在可执行文件后加*,在链接文件后加@.

1
$ ls -F ##列出文件并且在列出的文件名称后加一符号

虽然我们可以用ls列出当前目录下的所有内容,但实际上有很多的名称以.开头的文件并未展示,我们称这类文件为隐含文件,在默认情况下是不会展示的.我们可以用参数-a来显示所有的文件.对于命令的参数是可以组合使用的,并且制定多个选项只需要用一个短线即可.

1
2
$ ls -a  ## 列出所有文件及目录(以.开头的隐含文件也会被列出)
$ ls -aF ## 列出所有文件和目录的同时加上一个后缀符号

ls另外一个比较常见的参数是-l,这个选项可以用来查看文件的各种属性,

1
2
3
4
5
6
7
8
9
10
$ ls -l  ## 列出所有文件和目录以及其对应的属性
总计 152
drwxr-xr-x 2 lyd lyd 4096 2月 5 09:49 公共
drwxr-xr-x 2 lyd lyd 4096 2月 5 09:49 模板
drwxr-xr-x 2 lyd lyd 4096 2月 5 09:49 视频
drwxr-xr-x 3 lyd lyd 4096 2月 25 20:55 图片
drwxr-xr-x 2 lyd lyd 4096 2月 5 09:49 文档
drwxr-xr-x 2 lyd lyd 4096 3月 14 15:39 下载
drwxr-xr-x 2 lyd lyd 4096 2月 5 09:49 音乐
drwxr-xr-x 2 lyd lyd 4096 2月 5 09:49 桌面

这一共有九个不同的信息栏,从左到右依次表示,

  1. 文件的权限标志(后续会进一步讨论其含义)
  2. 文件连接个数(同上)
  3. 文件所有者的用户名
  4. 该用户所在的用户组祖名(后续会讨论)
  5. 文件的大小
  6. 最后一次修改时的月份
  7. 最后一次修改的日期
  8. 最后一次修改的时间
  9. 文件名

ls命令后接路径名,可以直接查看子目录的内容,

1
$ ls /etc/init.d/ ## 用来查看/etc/init.d/的内容

除了ls命令可以列出目录,我们也可以用windows系统常用的dir命令来列出,但其功能比ls要少.我们也可以用vdir来代替ls -l来列出目录和文件的完整信息.但由于ls的功能明显更为强大,我们就不再多介绍dir和vdir的用法.

cat 和 more: 查看文本文件

cat命令用于查看文件内容(一般是文本文件,如果打开的是PDF或者其他形式的文件会以文本文件的形式打开),后跟文件名作为参数.

1
$ cat xxx ## 查看文件内容

cat后面的文件名参数可以添加多个文件名,同样也可以用通配符来批量查看文件.

为了调试方便,我们可以用-n参数来在展示的文本文件形式的每行前面显示行号

1
$ cat -n xxxx ## 查看文件内容的同时显示行号

但是当我们打开多个文件的时候,用-n参数并不会智能地区分每个文件的终止,而是连续的对行号进行递增编号.

但由于cat命令会将文件的内容全部展示在shell命令行之上,对于内容较多的文件,这样的打开方式并不合适.因此我们可以用more命令来一页页的显示文章内容,

1
2
3
$ more XXX ## 以分页的形式展示文件内容
....
--More-- (75%)

more命令会在最后显示一个百分比,其表示已显示内容占整个文件的比例.我们可以用空格键向下翻一页,用Enter则可以向下滚动一行,用Q退出文本文件展示.

more命令和cat一样可以添加多个文件名,也可以通配符来批量查看文件.

head 和 tail: 查看文件的开头和结尾

head和tail用于展示文件的开头和结尾.我们可以用-n参数来修改展示的行数,如果我们不加-n命令手动修改展示行数,那么会默认展示10行的内容.head命令的默认输出是包括输出文件名,但不会计入展示文件开头的行数,我们可以用-q参数来取消输出文件名.不仅如此,head后面还可以接多个文件名,用于批量展示多个文件的开头和结尾.

1
2
$ head -n k xxx ## 展示文件前k行,如果没有-n参数,默认展示文件的前10行
$ head -q xxx ## 不展示文件名

tail和head的用法完全一致.

less: 更好的文本阅读工具

less和前面提到的more十分类似,都不能对文本文件进行修改,也支持打开多个文本文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ less ~/.bashrc ## 用less查看文件
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $ - in
*i*) ;;
*) return;;
esac

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
:

在屏幕的末尾会有一个冒号,其表示等待用户输入命令.在此我们罗列常用的移动命令,

  • 向下滚动一页
  • 向下滚动一行
  • b 向上翻一页
  • y 向上滚动一行
  • d 向下翻半页
  • u 向上翻半页

在less查看的文本文件中,我们还可以用/跟上想要查找的内容,来实现对文本内容的检索,less会把第一个搜索目标高亮显示,如果我们还需要查找相同内容,我们只需要用n来跳转到下一个搜索目标,同样如果我们需要跳转到前一次的搜索结果我们可以用N来跳转.

实际上/并不是全文检索,而是以光标为基准向后搜索字符串,相反我们可以用?来以光标为基准向前搜索字符串.

由于less的用法较多,可以在冒号后接h来打开less自带的帮助文档查看指令及其作用.

为了展示更多的文件信息,我们可以用-M来展示更多的文件信息,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  $ less -m ~/.bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples

# If not running interactively, don't do anything
case $ - in
*i*) ;;
*) return;;
esac

# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth

# append to the history file, don't overwrite it
shopt -s histappend

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
/home/lyd/.bashrc lines 1-19/114 15%

less在输出的底部显示了文件名,当前行数,总行数以及所占百分比.最后可以用Q推出less程序.

grep: 查找文件内容

1
grep [OPTIONS] PATTERN [FILE...]  ## grep一般形式

如果我们想在文件A中查找包含test的行,可以用如下命令,

1
$ grep test A

从上面的命令我们可以看出grep后面接两个不同类型的参数,第一个是被搜索的关键词,也称之为模式,第二个则是所搜索的文件.grep会将文件中出现关键词的行输出,并且grep可指定多个文件来搜索.另外我们用grep查找的是关键词,对于查找如Debian Ubunut这样的关键词,我们需要用单引号来将空格包含在关键词中,不然grep会认为关键词为Debian,在文件名为Ubuntu的文件中查找.

1
$ grep 'Debian Ubuntu' linux  ##在linux文件中查找关键词 Debian Ubuntu

我们列出一些常用的grep命令选项,

  • -i 忽略大小写进行匹配
  • -r 进行递归查找子目录中的文件
  • -l 仅输出存在匹配的文件名
  • -c 输出匹配的行数
  • -v 反向查找,只打印不匹配的行

grep实际上是以正则表达式的形式对文件进行查找,针对扩展的正则表达式,我们可以用egrep来查找.

find: 文件查找

1
find [OPTION] [path...] [expression] ## find命令的基本语法

find命令需要一个路径名作为查找范围,find会深入该路径中的每个子目录中寻找,如果我们指定的路径名为/,那么就会在整个文件系统中搜索.下给出一个find命令的实例,

1
2
$ find /usr/bin -name zip -print ##在/usr/bin的目录下查找zip
/usr/bin/zip

这里的/usr/bin就是find的查找范围,-name指定了查找条件以文件名为基准,此处支持用通配符*和?.-print表示将结果输出到屏幕,实际上可以不需要加这个动作指令,find会默认将其输出.值得注意的是find输出的结果是文件的绝对路径.

我们在此罗列find常用的查找条件的参数,

  • -name pattern: 按照文件名查找,支持使用通配符
  • -size [+-]size[cwbkMG]: 按文件大小查找,支持使用+或-来表示大于或小于指定大小,单位可以是c(字节),w(字数),b(块数),k(KB),M(MB)或G(GB).
  • -mtime days: 按修改时间查找,支持使用+或-表示在指定天数前或后,days是一个整数表示天数
  • -user username: 按照文件所有者查找
  • -group groupname: 按文件所属组查找
  • -type type: 按照文件类型查找,type的参数含义如下表所示
参数 含义 参数 含义
b 块设备文件 f 普通文件
c 字符设备文件 p 命名管道
d 目录文件 l 符号链接

我们介绍find对匹配到的文件执行的操作,

  • -amin n: 查找在n分钟被访问过的文件
  • -atime n: 查找在n*24小时内被访问的文件
  • -cmin n: 查找在n分钟内状态发生变化的文件(例如权限)
  • -ctime n: 查找在n*24小时内状态发生过变化的文件(例如权限)
  • -mmin n: 查找在n分钟内被修改过的文件
  • -mtime n: 查找在n*24小时内被修改过的文件

上面的参数n可以是正数,负数亦或是0.正数+n表示查找比指定时间更早的文件或目录,负数-n表示查找在指定时间内的文件或目录,0表示当天的文件或目录

locate: 快速定位文件

由于find在查找大批量文件中将花费大量的文件,因此我们可以用locate来代替find,在Ubuntu系统中locate并没有内置安装,因此我们先用apt包管理器下载locate,

1
$ sudo apt-get install mlocate ## 下载locate命令及相关依赖

locate的底层逻辑是并不去查找每个子目录,而是在/var/lib/slocate资料库里查找,因此locate的查找并不是及时的,需要对数据库进行更新,一般来说系统每天会自动更新一次,当然也可以用命令自己手动的更新,

1
$ sudo updatedb ## 手动更新locate的文件名数据库

locate查找也可以使用通配符,一些常用的locate命令参数为

  • -c: 只输出找到的数量
  • -i: 忽略大小写进行查找
  • -n n: 至多显示n个输出
  • -h: 显示帮助

whereis: 查找特定程序

whereis命令主要用于查找程序文件并提供该程序的二进制可执行文件,源代码文件和使用手册页存放的位置.

1
2
$ whereis find ## 寻找find程序文件以及相关的配套文件
find: /usr/bin/find /usr/share/man/man1/find.1.gz /usr/share/info/find.info-1.gz /usr/share/info/find.info.gz /usr/share/info/find.info-2.gz

我们可以用-b选项来让whereis只返回该程序的二进制可执行文件,

1
2
$ whereis -b find ## 寻找find命令的二进制可执行文件
find: /usr/bin/find

同样,可以用-m选项来让whereis只返回该程序的帮助文件,

1
2
$ whereis -m find ## 寻找find命令的帮助文件
find: /usr/share/man/man1/find.1.gz /usr/share/info/find.info-1.gz /usr/share/info/find.info.gz /usr/share/info/find.info-2.gz

如果查找的文件不存在,那会返回一个空字符串,

1
2
$ find xxx
xxx:

事实上,whereis命令查找不到文件,不一定是文件不存在,而是有可能不是在whereis的查找目录中,其实whereis并没有查找全文件系统,仅查找了内置的子目录路径,这在查找精度上是一个缺陷,但对于查找的速度来说是一个显著提升.

用户版本信息查看

who可以查看当前系统有哪些人登陆使用,以及他们使用的工作台,

1
$  who ## 查看当前使用系统的用户

whoami用来查看自己是以什么身份进入系统的

1
$ whoami ## 查看自己进入系统的身份

上面这两个命令对于PC系统的应用不大,主要是对于服务器系统的查看,因为不同的用户会有不同的权限,因此需要用这个来查看用户身份.

uname是用来显示当前系统的版本信息.-a选项会显示当前的操作系统的所有有用的信息

1
2
$ uname -a ## 显示当前的操作系统的所有有用的信息
Linux lyd-Lenovo-330S-14IKB 6.5.0-25-generic #25~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Feb 20 16:09:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux

如果只需要查看处理器类型,-m选项可以只输出这个结果,

1
2
$ uname -m
x86_64

man: 寻求帮助

linux可以用man命令接某个命令的名称来获取该命令的帮助文档,

1
$ man find ## 查看find的帮助文档

man命令显示手册页用的是less程序.对于其上下移动和vim的操作一样,不再赘述.

whatis 和 apropos: 获取命令简介

由于man查找的是帮助文档,因此太过冗长.我们可以用whatis命令快速得到命令的简要介绍,

1
2
$ whatis find  ## 获取命令的简要介绍
find (1) - search for files in a directory hierarchy

但如果我们想要实现某个功能但不知道用什么命令时,我们可以选用apropos来反向查找,如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ apropos search  ##反向搜索使用的命令
apropos (1) - search the manual page names and descriptions
apt-patterns (7) - Syntax and semantics of apt search patterns
badblocks (8) - search a device for bad blocks
bsearch (3) - binary search of a sorted array
bzegrep (1) - search possibly bzip2 compressed files for a regular e...
bzfgrep (1) - search possibly bzip2 compressed files for a regular e...
bzgrep (1) - search possibly bzip2 compressed files for a regular e...
Data::DPath::Context (3pm) - Abstraction for a current context that enables i...
find (1) - search for files in a directory hierarchy
git-bisect (1) - Use binary search to find the commit that introduced a...
hsearch (3) - hash table management
hsearch_r (3) - hash table management
lfind (3) - linear search of an array

可以发现apropos实际上是检索命令简介中包含关键词的条目罗列出,让用户选择.