Linux基本指令(包含vim,用户,文件等方面)超详细

文章目录

Linux 基本指令

前序

如果使用虚拟机

​ 在关机之前要先将虚拟机关闭

  • shutdown
    • -h --halt
      • Halt the machine(停止系统并关闭电源 加 now 会马上关机如果在服务器等环境中只是停止系统运行,不会直接切断电源)
    • -p --poweroff
      • Power-off the machine(默认)
    • -r --reboot
      • Reboot the machine(重启计算机)
    • -c
      • Cancle a pending shutdown(取消关机)

Vim

编辑器分为两种

  • 所见及所得(编辑模式)

  • 多模式(在不同模式下,可以左不同的事情)

设计理念

  • 组合
    • 例如在 Vim 中,"d" 表示删除,"j" 移动到下一行,组合 "dj" 表示删除当前行和下一
      行;"^" 代表行首,故组合 "d^" 表示删除到行首;" " 代表行尾, " d " 代表行尾,"d "代表行尾,"d" 表示删除到
      行尾。而且我们还可以指定命令重复的次数:"dd" 表示删除光标所在行,"2dd" 或
      "d2d" 表示连续删除两行,效果和 "dj" 一致。
  • 简单,快捷

模式

Vim 有多种模式,最常用的是:普通(命令)模式、插入(编辑)模式和视图模式。这些模式之间可以相互转换,如下图所示:

  • 普通模式(Normal)

  • 视觉模式(又叫视图模式)

  • 插入模式

转化指令解释

  • 普通模式转插入模式
    • i (insert) : 在光标前面插入
    • a(after) : 在光标后面插入
    • I(大写) :在行首插入
    • A :在行尾插入
    • o(open) : 在下面另起一行插入
    • O : 在上面另起一行插入
  • 普通模式转视觉模式
    • v ( visual) :行选
    • ctrl + v (v-Block) : 竖选

Normal模式

Normal 又叫命令模式,就是用来执行命令的模式。

  • 命令
    • 短命令
      • i a o等命令
    • 底部命令(长命令)
      • :wqenter

移动光标(motion 核心)

常用指令
  • h :向左移动

  • j : 向下移动

  • k:向上移动

  • i : 向右移动

  • n - : 向上移动 n 行

  • n + : 向下移动 n 行

  • nnG):移动到第n行

  • gg : 到文件的第一行

  • G : 到文件的最后一行

  • 0 : 将光标移动到行首

  • ^ : 移动到第一个非空白字符

  • $ : 行尾

  • w (word) : 下一个词首

    • W (与小写的w的划分方式不同 单词与单词之间以空白字符分割) : 下一个词首
  • b (before) : 上一个词首

    • B(同上): 上一个词首
  • t(to): t) 向后查找,将光标移动到)的前一个字符

    • T :T" 向前查找,将光标移动到 " 的后一个字符
  • f(find):向后查找,将光标移动到)

    • F : T" 向前查找,将光标移动到 "

动作(action)

常用指令
  • d (delete) : 删除

  • y (yank) : 复制

  • c ( change): 删除并进行插入模式

  • u (undo) : 撤销

  • ctrl + r (recovery) : 恢复

  • p / P (paste) : 粘贴

将动作与移动进行组合
  • 删除 (delete )文本

Vim 中的删除类似 Windows 中的剪切,会将删除的内容复制到 Vim 的"剪切板"中。

  • 复制(yank)文本
  • 修改文本

查找(正则表达式)

  • /pattern : 向下查找 pattern为正则表达式 可以简单先理解为要查找的字段
  • ?pattern:向上查找
  • n :移动到下一个匹配项
  • N : 移动到上一个匹配项

替换(substitude)

因为linux操作系统循序 最小前缀原则 所以 :q 和 :quit 等效

  • 格式:

    • 😒/pattern/substitute/选项 将匹配pattern的内容替换为substitute

    • 😒/pattern/substitute 只会替换光标所在行的第一个匹配项

    • 😒/pattern/substitute/g 替换光标所在行的所有匹配项 (g for globally)

    • :m,ns/pattern/substitute/g 替换m,n行的所有匹配项

    • :%s/pattern/substitute/g 替换全文的所有匹配项

文本对象

action + textobj
文本对象与motion的区别
  • a(, a)
    • 包含边界
    • a{, a}
    • a, a
    • a<, a>
    • a''
    • a'
    • ap (paragraph)
      • p的就是空行
  • i(, i)
    • 不包含边界
    • i{, i}
    • i, i
    • i<, i>
    • i''
    • i'
    • ip (paragraph)
      • p的就是空行

多窗口

对文件的操作

常用指令
  • :w :将buffer里面的内容写入文件中,即保存
  • :q :退出
  • :q!:不保存退出
  • :wq :保存退出
  • 注意:ctrl + s 不是保存 ,而是进入僵死状态;ctrl + q 退出僵死状态

视图模式(visual)

批量注释
  • 原生方法

    • ctrl + v 切换为竖选模式
    • 选择要注释的范围
    • 输入I 切换为插入模式
    • 输入//
    • 输入ESC
  • 使用vimplus插件

    • gc :g表示转义 c comment 注释

    • gdc :注释一行 或者 解除注释一行(就是与motion 结合使用)

Linux模型(体系结构)

Linux 的体系结构源自于 Unix,主要分为三层,从内到外依次是:内核 --> 系统调用--> 应用层。

  • 内核(kernel)负责两个功能:管理计算机硬件资源;为上层应用程序提供运行环境。
  • 系统调用(system calls):内核给上层应用程序提供的接口。
  • 库函数(library routines):通常我们会把系统调用封装成库函数,主要的目的是方便程序员使用。系统调用往往设计得比较繁琐复杂,相对于系统调用而言,库函数的设计会更加友好。比如: malloc 、 free 、 printf 、 scanf 等。
  • shell 是一个命令行解释器,它读取用户输入,然后执行命令,然后等待用户的下一次输入。
    shell 拥有很多版本,我们将使用 bash(Bourne-again shell),它位于/bin/bash。

用户子系统命令

linux用户

  • root 根目录,超级用户 皇帝:拥有至高无上的权利
  • sudoer:管理员用户 安装unbantu时,创建的用户默认为sudoer
    • 可以使用sudo 临时提升自己的权利
    • 太监
  • 普通用户

命令

  • 查看所有用户

    • cat /etc/passwd

    • 每一行对应一条记录,每条记录有多个字段,字段之间以 : 分割。我们可以在5号手册中查看 passwd 文件的格式和规范:

  • 创建用户

    • useradd 选项 username

      • 常见选项

        • -m -- create -home
          • 如果不存在,则创建用户目录
        • -s --shell
          • 用户的登录使用的shell
      • 例子

        • sudo useradd test1 这样创建的用户不会自动创建用户的家目录,默认的shell为sh

        • $ sudo useradd -m -s /bin/bash test2 这样创建的用户会自动创建用户的家目录,并可以指定使用哪个shell

  • 删除用户

    • userdel 选项 username

      • 常用选项:
      • -r, --remove 用户主目录中的文件将随用户主目录和用户邮箱一起删除。
    • 例子

      • sudo userdel test1 这样删除用户,不会删除用户的家目录和用户的邮箱。

      • $ sudo userdel -r test2 这样删除用户,会把用户的家目录和用户的邮箱一起删除。

  • 修改用户密码

    • man passwd passwd 命令用来更改用户账户的密码。普通用户通常只更改其自己账户的密码,而超级用户可以更改任何账户的密码。

    • passwd 选项 username

      • sudo passwd test1

      • sudo passwd root

  • 切换用户

    • su + 用户
  • 退出切换

    • exit

常用命令

查看帮助手册

使用 man(manual) 命令可以查看 Linux 内置的帮助手册。该手册分为多卷:第一卷是用来查看 shell 命令的;第二卷是用来查看系统调用相关信息的;第三卷是用来查看库函数信息的...

  • man命令

    • man 手册编号 cmd
    • man man
    • man 3 mkdir
  • 进入帮助页面后,我们可以按照按下面按键进行操作

    • d(down) 向下翻半页
    • u(up) 向上翻半页
    • f(forward) 向下翻一整页
    • b(backward)向上翻一整页
    • q ( quit ) 退出
    • 还有一点 在查看手册时,vim的motion指令也是兼容的

文件子系统

和 Windows 不一样,Linux是以树的结构来管理文件系统的。我们将树的根结点称为根目录,用 / 表示。

常见目录

在linux中,以分门别类的方式管理文件,也就是功能相似的文件放在同一目录下进行管理

  • /bin(binary) 存放可执行程序或者脚本文件
  • /sys(system)存放和系统相关的文件
  • /dev(device)存放设备文件
  • /etc 一般用来存放配置文件或者启动脚本
  • /lib(library)存放系统库文件
  • /var(variable)存放变化很快的文件,比如日志文件
  • /proc(process)存放进程相关数据
  • /root root用户的家目录
  • /home/{username} 普通用户的家目录

与目录有关的指令

查看当前工作目录(pwd)

  • pwd(print working directory)命令可以查看当前工作目录

改变当前工作目录(cd)

  • cd(change directory)命令可以改变工作目录
  • man cd
    • cd 选项 directory
    • cd #切换到家目录
    • cd /usr/lib #切换到/usr/libm目录
    • cd / #切换到 / 目录
    • cd ~ #切换到用户家目录
    • cd . # 切换到当前工作目录
    • cd ... #切换到父目录
    • cd - #切换到上次目录
    • 注意:上次目录保存的环境变量OLDPWD中(可以通过env命令查看),他不是用栈结构管理的

创建目录(mkdir)

  • mkdir

  • man mkdir

    • mkdir - make directories

    • mkdir 选项 directory ...

    • -p, --parents 如果父目录不存在,则创建父目录

    • mkdir dir

    • mkdir dir1 dir2 dir3

    • mkdir -p a/b/c r如果父节点不存在,则创建父节点

删除空目录(rmdir)

  • rmdir (remove directory) 只能用来删除空目录

  • man rmdir

    • rmdir - remove empty directories

    • rmdir 选项 dirctory...

    • -p, --parents 递归删除空目录

    • rmdir dir

    • rmdir dir1 dir2 dir3

    • rmdir -p a/b/c

通配符

  • 可以用来匹配单个或者多个字符

  • *: 匹配任意多个字符(包括0个)

  • ?: 匹配任意一个字符

  • 集合(类): characters匹配集合内任意一个字符。

  • !characters匹配集合外任意一个字符。 比如:abc, !abc, 0-9, a-z, 0-9A-Za-z_

  • rmdir 命令可以和通配符一起使用 (通配符可以提升命令的威力):

  • rmdir dir? 例如:删除dira dir1

  • rmdir dir* 例如:删除dir开头的所有空目录

  • rmdir !abc 删除dir开头后面一个字符不为abc的空文件

查看目录内容(ls)

  • ls (list) 命令可以查看目录内容
  • man ls
  • ls - list directory contents
    • ls 选项 FILE...
    • -a, --all 显示所有的内容,包括以.开头的文件和目录
    • -i, --inode 显示文件的inode编号(inode是物理文件的标识)。
      • 显示文件 通过 inode 编号找到物理文件进行访问
    • -l 以长格式的形式显示目录中的内容
    • -h, --human-readable 和-l选项一起使用,以人类可读的方式显示文件的大小。
  • 常见方式
  • ls # 查看当前工作目录
  • ls dir # 查看dir
  • ls dir1 dir2 dir3 # 查看dir1,dir2,dir3
  • ls -a dir # 查看dir中的所有内容,包括以.开头的文件和目录
  • ls -ilh dir # 显示inode编号,显示详细信息,并以人类可读的方式显示文件的大小
查看目录项的详细信息
  • 第一列的第一个字母来表示文件的类型
    • -: 普通文件
    • d(directory): 目录
    • c(character): 字符设备文件(鼠标,键盘,显示器...
    • b(block): 块设备文件(磁盘)
    • l(symbolic link): 符号链接
    • s(socket): 本地套接字
    • p(named pipe): 有名管道
  • 第1列后面九个字符(分为3组)表示权限。
    • 依次代表拥有者、拥有组和其他用户的读、写、执行权限。可读则显示r,可写则显示w,可执行则显示x, 没有相关权限则显示-。 可以使用3个二进制数字表示 写1表示存在,写0表示-
  • 第2列表示硬链接数。 显示文件 通过 inode 编号找到物理文件进行访问
  • 第3列表示拥有者。
  • 第4列表示拥有组。
  • 第5列表示文件所占空间的大小。
  • 第6列表示最近修改时间。
  • 第7列为文件名。

以树状结构显示目录内容(tree)

tree 命令不是Linux系统自带的命令,使用之前,我们必须先安装 tree 命令

  • sudo apt install tree

tree 命令可以以树状结构显示目录内容

  • man tree
  • tree - list contents of directories in a tree-like format.
  • tree 选项 directory...
    • tree # 以树状结构显示当前工作目录的内容
    • tree dir # 以树状结构显示目录dir中的内容
    • tree dir1 dir2 dir3 # 以树状结构显示目录dir1, dir2, dir3中的内容

复制文件或目录(cp)

cp(copy) 命令可以用来复制文件和目录。

  • man cp

  • cp - copy files and directories

  • cp 选项 source dest

  • cp 选项 source... dest

  • 常用选项:

    • -n, --no-clobber 如果文件已存在,则不覆盖(默认会覆盖已有文件)。
    • -i, --interactive 如果文件存在,则给用户提示信息(由用户决定是否覆盖?)
    • -R, -r, --recursive 递归复制(用于copy目录)
  • cp text1 text2 # 将text1复制到text2中;如果text2存在,则覆盖。

  • cp text1 text2 text3 dir # 将text1,text2,text3复制到目录dir中;如果文件已存在,则覆盖。

  • cp -n text1 text2 # 将text1复制到text2中;如果text2存在,不覆盖。

  • cp -i text1 text2 text3 dir # 将text1,text2,text3复制到目录dir中;如果文件已存在,则提示用户是否覆盖。

  • cp -r dir1 dir2 # 递归地将目录dir1复制到目录dir2

文件和目录的移动或重命名(mv)

mv(move) 命令可以用来移动文件和目录,我们也可以用 mv 命令对文件和目录重命名。

  • man mv
  • mv - move (rename) files
  • mv 选项 SOURCE DEST
  • mv 选项 SOURCE... DEST
  • Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY.
  • 常用选项:
  • -n, --no-clobber 如果文件已存在,则不覆盖(默认会覆盖已有文件)。
  • -i, --interactive 如果文件存在,则给用户提示信息(由用户决定是否覆盖?)

为什么移动目录时,不需要指定-r选项?

本质是修改目录的元数据(如路径、名称),而非复制内容。目录作为一个整体(包含其下所有文件和子目录的结构)直接被 "搬迁",无需递归遍历内部内容(类似文件重命名,只是对象是目录)

bash 复制代码
mv text1 text2 # 将text1重命名为text2;如果text2存在,
则覆盖。
mv dir1 dir2 # 将dir1重命名为dir2
mv -n text1 text2 # 将text1重命名为text2;如果text2存在,
不覆盖。
mv text1 text2 text3 dir # 将text1,text2,text3移动到目录dir中;
如果文件已存在,则覆盖。
mv -i text1 text2 text3 dir # 将text1,text2,text3移动到目录dir中;
如果文件已存在,则提示用户是否覆盖。

删除文件和目录(rm)

rm(remove)命令可以删除文件和目录

bash 复制代码
$ man rm
rm - remove files or directories
格式:
rm [选项] FILE...
常用选项:
-f, --force
忽略不存在的文件,永远不提示
-i
在每次删除前,都提示用户是否删除
-r, -R, --recursive
递归删除

常用方式

bash 复制代码
$ rm text1 # 删除文件text1
$ rm text1 text2 text3 # 删除文件text1, text2, text3
$ rm -i *.txt # 删除当前目录下所有以.txt结尾的文件,并提示用户是否删除
$ rm -rf dir # 递归删除目录dir, 不给出任何提示

mv的本质是将text1,进行复制一份与inode进行关联,然后将原来的text1,删除。

注意:使用rm命令删除文件和目录后,就很难恢复了(Linux系统没有所谓的回收站)。所以除非必要,不要以 root 身份或者使用 sudo 权限来执行 rm 命令!

文件相关指令

创建文件

在linux下创建文件的方式有很多,常用的是以下三种方式:

bash 复制代码
$ echo "Hello Linus Torvalds" > text 	# 创建文件text, 并且文件中包含内容"Hello Linus Torvalds"
$ touch text1 text2 text3 				# 创建空文件text1, text2, text3(要求text1,text2,text3不存在)
$ vim hello.c 							# 编辑hello.c, 按:wq退出。

查找文件

which

使用which命令来查找可执行程序的路径

bash 复制代码
$ man which
	which - locate a command
格式:
	which [-a] cmd...
选项:
	-a    显示所有匹配的路径    不加 -a 会找到一个之后直接返回打印到屏幕上

常用方式

bash 复制代码
$ which bash # 查看bash的路径
$ which ls tree # 查看命令ls和tree的路径
$ which -a vim # 查看vim的所有路径 (我们可能装了多个版本的vim)

which 是根据 PATH环境变量中的路径依次进行查找的,然后显示第一个匹配项,或者显示全部匹配项

每条之间的分隔为:,依次查找

find

find可以在一个目录中递归的查找符合指定条件的文件。它的功能非常强大。

b 复制代码
$ man find
	find - search for files in a directory hierarchy
格式:
	find [start-point...] 查找条件 # 省略start-point,默认起始点为当前工作目录
常用选项:
	-name pattern	查找文件名符合pattern(正则表达式)的文件
	-type c			查找类型为c的文件:
			b(block): 块设备文件
			c(character): 字符设备文件
			d(directory): 目录
			p(named pipe): 有名管道
			f(file): 普通文件
			l(symbolic link): 符号链接
			s(socket): 套接字
	-size n[cwbkMG] 	(向上查找)
		File uses n units of space, rounding up.
			b: for 512-byte blocks (this is the default if no suffix is used)
            c: for bytes
            w: for two-byte words
            k: for Kibibytes (KiB, units of 1024 bytes)
            M: for Mebibytes (MiB, units of 1024 * 1024 = 1048576 bytes)
            G: for Gibibytes (GiB, units of 1024 * 1024 * 1024 = 1073741824 bytes)
		可以在n前面添加'+'和'-',表示大于和小于。
	-empty			查找空的文件或空的文件夹
	-user username, -uid uid  	根据用户名和用户id查找
	-group groupname, -gid gid	根据组名和组id查找
	-perm mode					根据权限查找
	根据时间查找:
	-amin n, -atime n, -cmin n, -ctime n, -mmin n, -mtime n
		三个时间戳		
		a(access): 文件访问的时间
		c(change): 文件属性发生改变的时间 (用户,组 ,权限)
		m(modify): 文件内容发生改变的时间
		min: 以分钟为单位
		time: 以天为单位
		可以在n前面添加'+'和'-',表示大于和小于。
	组合查找:
		-a(and), -o(or), !(not): 分别表示与、或、非

"+" " - " 号的理解:

常用的方法

bash 复制代码
$ find /usr/include -name "stdio.h" 	# 在/usr/include目录下查找stdio.h文件
$ find . -name "*.c" 					# 在当前工作目录下查找所有以.c结尾的文件
$ find /dev -type b 					# 在/dev目录下查找所有的块设备文件
$ find . -size 5M 						# 在当前工作目录下查找所有大小为5M的文件
$ find . -size +5M						# 在当前工作目录下查找所有大于5M的文件
$ find dir1 dir2 dir3 -empty 			# 在dir1,dir2,dir3目录下查找所有空的文件和空的文件夹
$ find . -user he 						# 在当前工作目录下查找he用户拥有的文件
$ find . -gid 0 						# 在当前工作目录下查找root组(gid=0)拥有的文件
$ find . -perm 664 						# 在当前工作目录下查找权限为664(rw-rw-r--)的文件
$ find . -mtime 1 						# 在当前工作目录下查找在[1, 2)天前内容发生修改的文件 (find会省略小数部分)
$ find . -mtime +2 						# 在当前工作目录下查找在[3, )天前内容发生修改的文件
$ find /dev -type c -a -name "tty*" 	# 在/dev目录下查找以tty开头的字符设备文件
$ find /dev -type b -o -name "tty*"	 	# 在/dev目录下查找块设备文件或者是以tty开头的文件
$ find /dev -type c -a ! -name "tty*" 	# 在/dev目录下查找不以tty开头的字符设备文件

查看文件内容

cat
shell 复制代码
$ man cat
	cat - concatenate files and print on the standard output
格式:
	cat [选项] [file]...
常见选项:
	-n, --number		对每一行进行编号

常见用法

shell 复制代码
$ cat /etc/passwd
$ cat -n /etc/passwd
$ sudo cat /etc/passwd /etc/shadow (已拼接的方式查看) 这里加sudo因为shadow存储的为密码,所以普通用户不能查看

查看文件的前几行

shell 复制代码
$ man head
	head - output the first part of files
格式:
	head [选项] [file]...
常见选项:
	-n, --lines=[-]NUM		显示前NUM行;若在NUM前面添加'-'号,则显示除了后NUM行的所有行

常见用法

shell 复制代码
$ head text1 				# 显示text1的前10行
$ head text1 text2 text3 	# 显示text1,text2,text3的前10行
$ head -n 5 text1 			# 显示text1的前5行
$ head -n -5 text1 			# 显示除了最后5行的所有行
tail

查看文件的后几行

shell 复制代码
$ man tail
	tail - output the last part of files
格式:
	tail [选项] [file]...
常见选项:
	-n, --lines=[+]NUM	显示后NUM行;若在NUM前面添加'+'号,则从第NUM开始显示
	-F					显示后面追加的数据。一般用于查看日志文件。

-F 指令可以用于多窗口操作,查看不会关闭,如果在其他窗口,对文件进行改变,该命令会一直显示文件变化情况。

常见用法

shell 复制代码
$ tail text1 					# 显示text1的后10行
$ tail text1 text2 text3 		# 显示text1,text2,text3的后10行
$ tail -n 5 text1 				# 显示text1的后5行
$ tail -n +5 text1 				# 从第5行开始显示
$ tail -F server.log 			# 显示后10行,并且会显示后面追加的数据
less(more)
shell 复制代码
$ man more
	more - file perusal filter for crt viewing (说人话就是单页浏览)
格式:
	more [选项] file...

提示:less是more的高级版本,若系统中没有less命令,才会考虑使用more

常见用法

shell 复制代码
$ less text1 		# 浏览text1
$ less text1 text2 	# 浏览text1, text2

进入浏览界面后

shell 复制代码
f(forward) 		往后翻一页
b(backward) 	往前翻一页
:n(next) 		查看下一个文件
:p(previous)	查看上一个文件
q(quit) 		退出浏览界面

重定向

cat, head, tail等命令经常和重定向一起使用,比如:tail -n 20 text1 > a.txt。重定向的示意图如下:

默认情况下,stdin(标准输入)是与键盘相互绑定的,stdout stderr 与屏幕绑定。

在讲重定向之前,我们需要引入文件描述符的概念(后面我们会详细讲解这个概念,现在我们只需要知道它是一个非负整数即可)。

一个 > 表示追加重定向 >> 就表示重定向 会将原来的内容进行覆盖

常见用法

shell 复制代码
$ who > users
$ echo "liu yi fei" >> users
$ wc -l < users
$ cat users file1 > text 		# file1不存在
$ cat users file1 2> text 		# file1不存在
$ cat users file1 >& text 		# file1不存在

wc 命令 watch count 查看行数 两条命令的区别

搜索文件内容

grep

grep(globally search for a regular expression)命令可以用于搜索文件内容,它的功能非常强大!grep 命令会按正则表达式去搜索文件,如果文件中某一行匹配指定的正则表达式,grep命令则会显示这一行。

shell 复制代码
$ man grep
	grep - print lines matching a pattern
格式:
	grep [选项] pattern [file]...
常见选项:
	-E, --extended-regexp		使用扩展的正则表达式
	-i, --ignore-case			忽略大小写
	-v, --invert-match			显示不匹配正则表达式的行
	-n, --line-number			显示行号
	-c, --count					不显示匹配的行,显示匹配行的个数

常见用法

shell 复制代码
$ grep -nE "firmament" The_Holy_Bible.txt   # 显示The_Holy_Bible.txt中包含"firmament"的所有行,并显示行号
$ grep -cvE "firmament" The_Holy_Bible.txt  # 统计The_Holy_Bible.txt中不包含"firmament"的行数

正则表达式

正则表达式语法有点复杂,而且不同的工具使用的语法还不尽相同。下面我们介绍一些常用的正则表达式语法规则:

shell 复制代码
1. 基本单位
		基本单位主要包含:字符、转义字符、.(匹配任意一个字符)、集合(比如,[abc],[^abc])、(expr)
2. 基本操作
		操作的对象是基本单位,主要包含两个基本操作:连接和重复
			a. 连接:"ab", "[abc]x", ".txt", "\.txt"
			b. 重复
                +: 重复至少一次(>=1), 比如:"abc+", "[abc]+"
                ?: 重复零次或一次(0|1), 比如:"abc?", "[abc]?"
                *: 重复任意次数(>=0), 比如:"abc*", "[abc]*", ".*"
                {m}: 重复m次
                {m,n}: 重复m到n次([m,n])
                {n, }: 至少重复n次([>=n])
3. 指定基本单位出现的位置
        ^: 行首,比如:"^abc"
        $: 行尾,比如:"xyz$"
        \<: 词首        默认以空白字符分割
        \>: 词尾

(expr) expr 为正则表达式 ()表示一个单位

对 \ . txt 的理解 因为 .在正则表达式中为元字符 ,加\ 进行转义后,变为 普通字符 .

Q: 以f开头,以t结尾的单词的正则表达式如何写?(单词之间以空格分隔)

shell 复制代码
\<f[^ ]*t\>       #中间字符非空格重复任意次数 

命令的组合

|(管道)

grep 命令之所以强大,主要在于它可以和其它命令组合使用。命令的组合主要有以下三种方式:

复制代码
1. cmd1 ; cmd2
		先执行cmd1,再执行cmd2。如:mkdir dir; cd dir
2. cmd1 | cmd2 (管道)
		将上一个命令的输出作为下一个命令的输入。如:history | tail -n 20
3. cmd1 | xargs cmd2
		xargs(extended arguments) 可以将标准输入里面的每一行转换成命令的参数
		xargs往往和管道一起使用,如:cmd1 | xargs cmd2,它把cmd1输出的每一行作为cmd2的参数
	find . -name "*.c" | xargs grep -nE "\<main\("

管道是进程之间进行通信的一种方式,是内存中的,由内核管理的数据结构。

xargs 是将管道搜索到的内容作为命令行参数 可以理解为上面 加一大堆的的.c 文件,如下面第一行所示。

改变文件权限

chmod

chmod 命令可以改变文件和目录的权限。

目录:本质就是一个文件。 这个文件的内容是一个一个目录项(directory entry),在逻辑上,目录项之间是用链表的方式链接起来的。

每个目录项都是由一条单链表连接起来的。

权限对于普通文件和目录文件而言,其含义是不太一样的:

复制代码
普通文件
r: 可读
w: 可写
x: 可执行 (可执行程序和脚本文件需要x权限才能直接运行)
目录
r: 可读 (ls)
w:可写 (在目录下添加和删除文件)
x: 可执行 (cd,读写权限依赖于x权限,所以目录一般都设置了x权限)

目录本质上一个文件 文件里面的内容为一个个目录项,逻辑上链表的形式衔接,读可不可以查看,写修改,x最基本 不能切换到该目录项 如cd操作等

chmod 目录的用法如下:

复制代码
1. 文字设定法 (较少使用)
    chmod [ugoa][+=-][rwx] file/dir
    u: user
    g: group
    o: other
    a: all
    +: 添加权限
    -: 删除权限
    =: 将权限设置为
2. 数字设定法 (常用)
    chmod mode file/dir
    mode: 三位八进制数字

常见用法

复制代码
$ chmod o+w text1
$ chmod u=rwx,g=rx,o=r text1
$ chmod 664 text1

文件创建掩码

umask

文件和目录在创建的时候都有一个默认的权限,该权限是由文件创建掩码 umask 决定的。

我们可以用 umask 命令查看当前的文件创建掩码:

shell 复制代码
$ umask
	0002 # 当前的文件创建掩码为2

创建文件 text 和目录 dir,查看它们的权限:

shell 复制代码
$ ls -l
drwxrwxr-x 2 he he 4096 3月 12 20:55 dir/
-rw-rw-r-- 1 he he 0 3月 13 20:34 text

可见当 umask = 0002 时,目录的默认权限为 775,文件的默认权限为 664

将文件创建掩码 umask 设置为 0023

shelll 复制代码
$ umask 0023

再创建文件 text1 和目录 dir1,查看它们的权限

shell 复制代码
$ ls -l
drwxr-xr-- 2 he he 4096 3月 13 20:40 dir1
-rw-r--r-- 1 he he 0 3月 13 20:40 text1

可见当 umask = 0023 时,目录的默认权限为 754,文件的默认权限为 644

那么文件创建掩码是怎么进行工作的呢?

​ 主要看umask后三位 后三位设置的想去掉的权限 工作原理不是相减,对umask进行按位取反,然后再按位与,文件按位与666(因为文件没有执行权限,cd不进去),目录按位与777(读写执行)

复制代码
目录:777 & (~umask)
文件:666 & (~umask)

链接

ln

我们可以用 ln 命令创建硬链接和符号连接(软链接)。

Inode 磁盘上文件的唯一标识

创建硬链接

shell 复制代码
$ ln text1 h_link
$ ls -li
    268648 -rw-r--r-- 2 he he 0 3月 13 20:40 h_link
    268648 -rw-r--r-- 2 he he 0 3月 13 20:40 text1

​ 可见 text1 和 h_link 是指向同一个文件的,并且硬链接数也由原来的 1 变成了 2。删除 text1 或 h_link 只会减少硬链接数,当链接数为 0 的时候,才会真正删除磁盘上的文件。(使用的是引用计数技术)

shell 复制代码
$ rm text1
$ ls -li
	268648 -rw-r--r-- 1 he he 0 3月 13 20:40 h_link # 硬链接数变为了 1
$ rm h_link

创建符号链接(软链接)

shell 复制代码
$ ln -s text s_link
$ ls -li
    268648 lrwxrwxrwx 1 he he 4 3月 13 21:24 s_link -> text # s_link文件的内容为text,因此大小为4
    264859 -rw-rw-r-- 1 he he 0 3月 13 20:34 text

文件大小为4,存放的就是text4个字符,1111表示为软硬链接的标识,建立一个硬链接就会变为2,就相当于连了几根线在inode上。

可见 text 和 s_link 是指向不同文件的,text 的硬链接数不会发生改变。删除 text 会导致符号链接 s_link 悬空:

bash 复制代码
$ rm text
$ ls -li
	268648 lrwxrwxrwx 1 he he 4 3月 13 21:24 s_link -> text # 颜色会发生改变

硬链接与软链接的原理如图

我们可以将符号链接和 Windows 系统上的快捷方式,或者 C 语言中的指针做类比。

对于大多数命令(rm除外),如果参数是符号链接,其实操作的是符号链接指向的文件(类似指针的解引用操作):

bash 复制代码
$ echo "I love xixi\n" > text
$ cat s_link
	I love xixi
$ rm s_link # 删除符号链接

远程复制

scp

scp 命令可以用于上传和下载文件

复制代码
上传:将本地的文件复制到远程
下载:将远程的文件复制到本地

scp 的用法和 cp 非常类似

复制代码
$ man scp
	scp -- secure copy (remote file copy program)
格式:
	scp [选项] SRC... DEST
	本地路径:可以用绝对路径,也可以用相对路径
	远程路径:用户名@IP:路径
常用选项:
	-r		递归复制整个目录

常见用法

shell 复制代码
$ scp he@IP:~/text1 . 	# 将he用户家目录下的text1文件下载到当前工作目录
$ scp ./file he@IP:~ 	# 将当前工作目录下的file文件上传到he用户的家目录下

打包压缩

tar(text archive)

我们可以用 tar 命令打包和压缩文件。tar 是一个非常有历史的工具,这里我们只介绍它的传统(经典)用法:

复制代码
格式:
tar [主选项+辅选项] 包名 [文件或目录]...
主选项(有且只能选择其中一个):
    c: 创建
    r: 追加
    x: 释放
辅选项:
    f: 指定包文件的名称
    v: 显示详细信息
    z: 使用gzip算法压缩或解压缩包文件

常见用法

shell 复制代码
$ tar cvf package.tar text*
$ tar rvf package.tar The_Holy_Bible.txt
$ tar xvf package.tar
$ tar czvf package.tar.gz *
$ tar xzvf package.tar.gz

别名

alias

有些命令比较长,自然我们就想给这些命令起一个别名,方便以后使用,alias 命令就是用来做这事情的。

复制代码
$ man alias
alias --- define or display aliases
格式:
alias [命令=别名]...

常见用法

复制代码
$ alias # 查看别名
    alias g++11='g++ -std=c++11'
    alias ll='ls -alF'
    alias ls='ls --color=auto'
	...
$ alias h='history' # 设置别名
相关推荐
A小辣椒20 小时前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5203 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩3 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言