Linux基本指令(包含vim,用户,文件等方面)超详细
文章目录
- Linux 基本指令
- 前序
- Vim
- 编辑器分为两种
- 设计理念
- 模式
- 转化指令解释
- Normal模式
- 移动光标(motion 核心)
- 常用指令
- 动作(action)
- 常用指令
- 将动作与移动进行组合
- 查找(正则表达式)
- 替换(substitude)
- 文本对象
- action + textobj
- 文本对象与motion的区别
- 多窗口
- 对文件的操作
- 常用指令
- 视图模式(visual)
- 批量注释
- Linux模型(体系结构)
- 用户子系统命令
- linux用户
- 命令
- 常用命令
- 查看帮助手册
- 文件子系统
- 常见目录
- 与目录有关的指令
- 查看当前工作目录(pwd)
- 改变当前工作目录(cd)
- 创建目录(mkdir)
- 删除空目录(rmdir)
- 通配符
- 查看目录内容(ls)
- 查看目录项的详细信息
- 以树状结构显示目录内容(tree)
- 复制文件或目录(cp)
- 文件和目录的移动或重命名(mv)
- 删除文件和目录(rm)
- 文件相关指令
- 创建文件
- 查找文件
- which
- find
- 查看文件内容
- cat
- head
- tail
- less(more)
- 重定向
- 搜索文件内容
- grep
- 正则表达式
- 命令的组合
- |(管道)
- 改变文件权限
- chmod
- 文件创建掩码
- umask
- 链接
- ln
- 远程复制
- scp
- 打包压缩
- tar(text archive)
- 别名
- alias
Linux 基本指令
前序
如果使用虚拟机
在关机之前要先将虚拟机关闭
- shutdown
- -h --halt
- Halt the machine(停止系统并关闭电源 加 now 会马上关机如果在服务器等环境中只是停止系统运行,不会直接切断电源)
- -p --poweroff
- Power-off the machine(默认)
- -r --reboot
- Reboot the machine(重启计算机)
- -c
- Cancle a pending shutdown(取消关机)
- -h --halt
Vim
编辑器分为两种
-
所见及所得(编辑模式)
-
多模式(在不同模式下,可以左不同的事情)
设计理念
- 组合
- 例如在 Vim 中,“d” 表示删除,“j” 移动到下一行,组合 “dj” 表示删除当前行和下一
行;“^” 代表行首,故组合 “d^” 表示删除到行首;“ " 代表行尾, " d " 代表行尾,"d "代表行尾,"d” 表示删除到
行尾。而且我们还可以指定命令重复的次数:“dd” 表示删除光标所在行,“2dd” 或
“d2d” 表示连续删除两行,效果和 “dj” 一致。
- 例如在 Vim 中,“d” 表示删除,“j” 移动到下一行,组合 “dj” 表示删除当前行和下一
- 简单,快捷
模式
Vim 有多种模式,最常用的是:普通(命令)模式、插入(编辑)模式和视图模式。这些模式之间可以相互转换,如下图所示:
-
普通模式(Normal)
-
视觉模式(又叫视图模式)
-
插入模式
转化指令解释
- 普通模式转插入模式
- i (insert) : 在光标前面插入
- a(after) : 在光标后面插入
- I(大写) :在行首插入
- A :在行尾插入
- o(open) : 在下面另起一行插入
- O : 在上面另起一行插入
- 普通模式转视觉模式
- v ( visual) :行选
- [ctrl + v ] (v-Block) : 竖选
Normal模式
Normal 又叫命令模式,就是用来执行命令的模式。
- 命令
- 短命令
- i a o等命令
- 底部命令(长命令)
- :wq[enter]
- 短命令
移动光标(motion 核心)
常用指令
-
h :向左移动
-
j : 向下移动
-
k:向上移动
-
i : 向右移动
-
[n] - : 向上移动 n 行
-
[n] + : 向下移动 n 行
-
:[n] ([n]G):移动到第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],[n]s/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
- -m – create -home
-
例子
-
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选项?
本质是修改目录的元数据(如路径、名称),而非复制内容。目录作为一个整体(包含其下所有文件和子目录的结构)直接被 “搬迁”,无需递归遍历内部内容(类似文件重命名,只是对象是目录)
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)命令可以删除文件和目录
$ man rm
rm - remove files or directories
格式:
rm [选项] FILE...
常用选项:
-f, --force
忽略不存在的文件,永远不提示
-i
在每次删除前,都提示用户是否删除
-r, -R, --recursive
递归删除
常用方式
$ 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下创建文件的方式有很多,常用的是以下三种方式:
$ 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命令来查找可执行程序的路径
$ man whichwhich - locate a command
格式:which [-a] cmd...
选项:-a 显示所有匹配的路径 不加 -a 会找到一个之后直接返回打印到屏幕上
常用方式
$ which bash # 查看bash的路径
$ which ls tree # 查看命令ls和tree的路径
$ which -a vim # 查看vim的所有路径 (我们可能装了多个版本的vim)
which 是根据 PATH环境变量中的路径依次进行查找的,然后显示第一个匹配项,或者显示全部匹配项
每条之间的分隔为:,依次查找
find
find可以在一个目录中递归的查找符合指定条件的文件。它的功能非常强大。
$ man findfind - 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 bytesw: for two-byte wordsk: 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): 分别表示与、或、非
“+” " - " 号的理解:
常用的方法
$ 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
$ man catcat - concatenate files and print on the standard output
格式:cat [选项] [file]...
常见选项:-n, --number 对每一行进行编号
常见用法
$ cat /etc/passwd
$ cat -n /etc/passwd
$ sudo cat /etc/passwd /etc/shadow (已拼接的方式查看) 这里加sudo因为shadow存储的为密码,所以普通用户不能查看
head
查看文件的前几行
$ man headhead - output the first part of files
格式:head [选项] [file]...
常见选项:-n, --lines=[-]NUM 显示前NUM行;若在NUM前面添加'-'号,则显示除了后NUM行的所有行
常见用法
$ head text1 # 显示text1的前10行
$ head text1 text2 text3 # 显示text1,text2,text3的前10行
$ head -n 5 text1 # 显示text1的前5行
$ head -n -5 text1 # 显示除了最后5行的所有行
tail
查看文件的后几行
$ man tailtail - output the last part of files
格式:tail [选项] [file]...
常见选项:-n, --lines=[+]NUM 显示后NUM行;若在NUM前面添加'+'号,则从第NUM开始显示-F 显示后面追加的数据。一般用于查看日志文件。
-F 指令可以用于多窗口操作,查看不会关闭,如果在其他窗口,对文件进行改变,该命令会一直显示文件变化情况。
常见用法
$ 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)
$ man moremore - file perusal filter for crt viewing (说人话就是单页浏览)
格式:more [选项] file...
提示:less是more的高级版本,若系统中没有less命令,才会考虑使用more
常见用法
$ less text1 # 浏览text1
$ less text1 text2 # 浏览text1, text2
进入浏览界面后
f(forward) 往后翻一页
b(backward) 往前翻一页
:n(next) 查看下一个文件
:p(previous) 查看上一个文件
q(quit) 退出浏览界面
重定向
cat, head, tail等命令经常和重定向一起使用,比如:tail -n 20 text1 > a.txt。重定向的示意图如下:
默认情况下,stdin(标准输入)是与键盘相互绑定的,stdout stderr 与屏幕绑定。
在讲重定向之前,我们需要引入文件描述符的概念(后面我们会详细讲解这个概念,现在我们只需要知道它是一个非负整数即可)。
一个 > 表示追加重定向 >> 就表示重定向 会将原来的内容进行覆盖
常见用法
$ 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命令则会显示这一行。
$ man grepgrep - print lines matching a pattern
格式:grep [选项] pattern [file]...
常见选项:-E, --extended-regexp 使用扩展的正则表达式-i, --ignore-case 忽略大小写-v, --invert-match 显示不匹配正则表达式的行-n, --line-number 显示行号-c, --count 不显示匹配的行,显示匹配行的个数
常见用法
$ grep -nE "firmament" The_Holy_Bible.txt # 显示The_Holy_Bible.txt中包含"firmament"的所有行,并显示行号
$ grep -cvE "firmament" The_Holy_Bible.txt # 统计The_Holy_Bible.txt中不包含"firmament"的行数
正则表达式
正则表达式语法有点复杂,而且不同的工具使用的语法还不尽相同。下面我们介绍一些常用的正则表达式语法规则:
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结尾的单词的正则表达式如何写?(单词之间以空格分隔)
\<f[^ ]*t\> #中间字符非空格重复任意次数
命令的组合
|(管道)
grep 命令之所以强大,主要在于它可以和其它命令组合使用。命令的组合主要有以下三种方式:
1. cmd1 ; cmd2先执行cmd1,再执行cmd2。如:mkdir dir; cd dir
2. cmd1 | cmd2 (管道)将上一个命令的输出作为下一个命令的输入。如:history | tail -n 20
3. cmd1 | xargs cmd2xargs(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/diru: userg: groupo: othera: all+: 添加权限-: 删除权限=: 将权限设置为
2. 数字设定法 (常用)chmod mode file/dirmode: 三位八进制数字
常见用法
$ chmod o+w text1
$ chmod u=rwx,g=rx,o=r text1
$ chmod 664 text1
文件创建掩码
umask
文件和目录在创建的时候都有一个默认的权限,该权限是由文件创建掩码 umask 决定的。
我们可以用 umask 命令查看当前的文件创建掩码:
$ umask0002 # 当前的文件创建掩码为2
创建文件 text 和目录 dir,查看它们的权限:
$ 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
$ umask 0023
再创建文件 text1 和目录 dir1,查看它们的权限
$ 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 磁盘上文件的唯一标识
创建硬链接
$ ln text1 h_link
$ ls -li268648 -rw-r--r-- 2 he he 0 3月 13 20:40 h_link268648 -rw-r--r-- 2 he he 0 3月 13 20:40 text1
可见 text1 和 h_link 是指向同一个文件的,并且硬链接数也由原来的 1 变成了 2。删除 text1 或 h_link 只会减少硬链接数,当链接数为 0 的时候,才会真正删除磁盘上的文件。(使用的是引用计数技术)
$ rm text1
$ ls -li268648 -rw-r--r-- 1 he he 0 3月 13 20:40 h_link # 硬链接数变为了 1
$ rm h_link
创建符号链接(软链接)
$ ln -s text s_link
$ ls -li268648 lrwxrwxrwx 1 he he 4 3月 13 21:24 s_link -> text # s_link文件的内容为text,因此大小为4264859 -rw-rw-r-- 1 he he 0 3月 13 20:34 text
文件大小为4,存放的就是text4个字符,1111表示为软硬链接的标识,建立一个硬链接就会变为2,就相当于连了几根线在inode上。

可见 text 和 s_link 是指向不同文件的,text 的硬链接数不会发生改变。删除 text 会导致符号链接 s_link 悬空:
$ rm text
$ ls -li268648 lrwxrwxrwx 1 he he 4 3月 13 21:24 s_link -> text # 颜色会发生改变
硬链接与软链接的原理如图
我们可以将符号链接和 Windows 系统上的快捷方式,或者 C 语言中的指针做类比。
对于大多数命令(rm除外),如果参数是符号链接,其实操作的是符号链接指向的文件(类似指针的解引用操作):
$ echo "I love xixi\n" > text
$ cat s_linkI love xixi
$ rm s_link # 删除符号链接
远程复制
scp
scp 命令可以用于上传和下载文件
上传:将本地的文件复制到远程
下载:将远程的文件复制到本地
scp 的用法和 cp 非常类似
$ man scpscp -- secure copy (remote file copy program)
格式:scp [选项] SRC... DEST本地路径:可以用绝对路径,也可以用相对路径远程路径:用户名@IP:路径
常用选项:-r 递归复制整个目录
常见用法
$ 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算法压缩或解压缩包文件
常见用法
$ 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' # 设置别名