文件系统与文件管理
知识简介
概念
- linux的文件系统可以理解为:由文件和目录组成的树结构。文件系统的最顶层是由根目录开始的,系统使用“/”来表示根目录,在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含(子)目录或文件。如此反复就可以构成一个庞大的文件系统。
- 在Linux系统的文件系统中,有两个特殊的目录,一个是用户所在的工作目录,即当前目录,用“ . ”表示;另一个是当前目录的上级目录,用“ . . ”表示。(若一个目录或文件名是以“点”开始,则表示这个目录或文件是一个隐藏目录或文件;以默认方式査找时(ls 命令),不会显示该目录或文件)
文件的命名与分类
文件系统命名规则
- Linux下文件命名长度不超过255个字节
- Linux下以不同颜色区分文件类型:
红色>>>压缩文件
绿色>>>可执行文件
蓝色>>>目录文件
示例:
灰色>>>其他文件
淡蓝色>>>链接文件
- Linux下文件命名区分大小写,如,file!=File
Linux系统下文件类型
Linux下除通过颜色辨别文件类型外还可通过命令“ll”(小写字母L)来查看文件类型。
以“-”开头为普通文件;
以“l”开头为链接文件;
以“d”开头为目录文件;
以“c”开头为字符设备;
以“p”开头为管道文件。
Linux系统中的重要目录文件
- 在Linux系统有一些十分重要的目录,这些目录用来存放用户自己的文件以及一些常用的可执行文件以及系统配置等。
目录名 | 功能 |
---|---|
/etc | 配置文件目录 |
/dev | 设备文件及特殊文件存储位置 |
/boot | 引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放于此目录 |
/tmp | 临时文件存储位置 |
/usr | 存放系统的应用程序和与命令相关的数据 |
/var | 包括系统运行时要改变的数据。其中包括每个系统是特定的,即不能够与其他计算机共享的目录 |
/proc | 用于输出内核与进程信息相关的虚拟文件系统 |
/bin | 几乎所有用户命令.有些命令在/bin 或/usr/local/bin 中. |
目录切换及其管理
- 在Linux系统中需要频繁切换目录来查看目录下的内容,但是需要怎样确认自己所处目录以及怎样切换目的目录呢。这就需要用到pwd命令,cd命令以及ls命令。
pwd 命令(Print Working Directory)
——显示用户当前所处的工作目录
命令格式 | 功能 |
---|---|
pwd -P | 显示物理路径,不包括链接 |
pwd -L | 显示当前正在工作中的路径 |
示例:
cd 命令(Change Directory)
—— 用来切换工作目录
命令格式 | 功能 |
---|---|
cd ~ | 切换到home目录下 |
cd . . | 切换到上一级目录 |
cd /home/user | 切换到home文件夹下的user目录下 |
ls 命令(list)
——最常见的目录操作命令,其主要功能是显示当前目录下的内容
命令格式 | 功能 |
---|---|
ls -a | 显示所有文件(包括隐藏文件) |
ls -S | 按由大到小的顺序显示 |
ls -X | 按文件扩展名顺序显示 |
ls * | 显示显示所有文件以及子目录下的内容 |
示例:
文件的创建,复制,移动,查看和删除
- 在操作Linux系统时少不了对文件的增加删除和修改,接下来让我们了解一下文件的具体操作。
touch命令
—— 创建新文件
命令格式 | 功能 |
---|---|
-a | 只修改文件的访问时间 |
-c | 仅修改文件的时间参数(3 个时间参数都改变),如果文件不存在,则不建立新文件 |
-d | 后面可以跟欲修订的日期,而不用当前的日期,即把文件的 atime 和 mtime 时间改为指定的时间 |
-m | 只修改文件的数据修改时间 |
-t | 命令后面可以跟欲修订的时间,而不用目前的时间 |
mkdir命令
—— 创建文件夹
命令格式 | 功能 |
---|---|
-m | 选项用于手动配置所创建目录的权限,而不再使用默认权限 |
-p | 选项递归创建所有目录 |
cp命令
——用于复制目录和文件
命令格式 | 功能 |
---|---|
-a | 相当于 -d、-p、-r 选项的集合,这几个选项我们一一介绍 |
-d | 如果源文件为软链接(对硬链接无效),则复制出的目标文件也为软链接 |
-l | 把目标文件建立为源文件的硬链接文件,而不是复制源文件 |
-s | 把目标文件建立为源文件的软链接文件,而不是复制源文件 |
-p | 复制后目标文件保留源文件的属性(包括所有者、所属组、权限和时间) |
-r | 递归复制,用于复制目录 |
-u | 若目标文件比源文件有差异,则使用该选项可以更新目标文件,此选项可用于对文件的升级和备用 |
示例:
mv命令
—— 移动文件和重命名
命令格式 | 功能 |
---|---|
-f | 强制覆盖,如果目标文件已经存在,则不询问,直接强制覆盖 |
-i | 交互移动,如果目标文件已经存在,则询问用户是否覆盖 |
-n | 如果目标文件已经存在,则不会覆盖移动,而且不询问用户 |
-v | 显示文件或目录的移动过程 |
-u | 若目标文件已经存在,但两者相比,源文件更新,则会对目标文件进行升级 |
示例:
rm命令
——删除文件
命令格式 | 功能 |
---|---|
-f | 强制删除(force),和 -i 选项相反,使用 -f,系统将不再询问,而是直接删除目标文件或目录 |
-i | 和 -f 正好相反,在删除文件或目录之前,系统会给出提示信息,使用 -i 可以有效防止不小心删除有用的文件或目录 |
– | – |
-r | 递归删除,主要用于删除目录,可删除指定目录及包含的所有内容,包括所有的子目录和文件 |
示例:
文件的权限管理
知识简介
Linux系统根据用户对文件的权限将系统中的所有用户分为:所有者,同组用户,其他用户三类;并为这三类用户分别设定所需的文件操作权限。
——用户分类:
- “ u ”:——文件拥有者
- “ g ”:——文件属组(文件归属的群组)
- “ o ”:——其他用户
注:当用户输入“ l l ”或者“ ls -l”命令查看文件信息时,可以看到如下信息:drwxrwxr-x
;字符串左数第一位(d)表示文件类型,除去第一位后的左三位表示拥有者的权限(rwx),中三位表示属组成员的权限,后三位表示其他用户的权限
——权限分类:
- “ r ”:——读取权限
- “ w ”:——写入权限
- “ x ”:——执行权限
- “ - ”:——空权限
图示:
权限管理
我们可以使用“ chmod ”命令来对文件的各项权限进行修改。如:“chmod u+x 文件名 ”(也可以用二进制法代替“ u+x ")即可完成对拥有者用户执行权限的增加。 还可以使用“ chgrp ”命令来更换文件的属组。如:“ chgrp -R 新属组 文件名“即可完成属组更改。
注:二进制法即利用二进制形式表示权限,” 777 “即表示” rwxrwxrwx ",“ 421 ”即表示“ r—w---x ”
针对文件的普通权限可以用chmod命令更改,实例如下:
- 首先利用” chmod u+x file1 “命令为文件拥有者添加一个对文件file1的执行权限;然后输入” chmod 0664 file1 “命令用二进制法删除文件拥有者对文件file1的执行权限。
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ ls
file1 file2 file3
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ ll -d file1
-rw-rw-r-- 1 liuyan liuyan 0 2月 28 18:22 file1
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ sudo chmod u+x file1
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ ll -d file1
-rwxrw-r-- 1 liuyan liuyan 0 2月 28 18:22 file1*
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ sudo chmod 0664 file1
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ ll -d file1
-rw-rw-r-- 1 liuyan liuyan 0 2月 28 18:22 file1
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$
利用umask命令更改新建文件或目录的默认权限,实例如下:
注:普通用户umask的值为0002,root用户umask的值为0022,可通过” umask -p 新umask值“更改umask的值。
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ umask
0002
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ umask -p 0022
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ umask
0022
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$
注:新建文件的权限为666-umask(即rw-rw-r–),新建目录的权限为777-umask(即rwxrwxr-x)
Linux文件系统上的特殊权限
——— 为了更方便,高效以及安全的控制文件,而引入了的一组权限。
权限名称 | 作用 | 详解 |
---|---|---|
suid | 作用二进制文件所属者的身份运行 | suid借用文件拥有者(u)权限中的最后一位(x),并用s来表示;当文件拥有者具有执行权限(x)时且该文件拥有特殊权限suid,则用小写字母s来表示即rws,若无执行权限则用大写字母S表示 |
sgid | 作用目录新建文件集成父母的属组 | sgid借用文件群组权限(g)中的最后一位(x),并用s来表示(原理同上) |
sticky | 作用目录此目录下谁创建仅创建者能删除 | sticky借用文件其他用户(o)权限中的最后一位(x),并用t来表示(原理同上) |
Linux下的访问控制权限
为了实现灵活的权限管理,除了文件的所有者,所属组和其它人,可以对更多的用户设置权;故利用可以用setfacl和getfacl命令为多用户或者组的文件和目录赋予访问权限。(设定 ACl 权限,常用命令有 2 个,分别是 setfacl 和 getfacl 命令,前者用于给指定文件或目录设定 ACL 权限,后者用于查看是否配置成功)
getfacl 命令: 用于查看文件或目录当前设定的 ACL 权限信息。基本格式为——getfacl 文件名
setfacl 命令: 用于直接设定用户或群组对指定文件的访问权限
格式 | 功能 |
---|---|
-m | 设定 ACL 权限 |
-x | 删除指定用户或群组的 ACL 权限 |
-b | 删除所有的 ACL 权限 |
-d | 设定默认 ACL 权限,只对目录生效,指目录中新建立的文件拥有此默认权限 |
-R | 递归设定 ACL 权限,指设定的 ACL 权限会对目录下的所有子文件生效 |
-k | 删除默认 ACL 权限 |
用户及其权限管理
在Linux系统上,每个用户都会有一个在内部与之对应的ID号码;群组也一样,每个群组也有一个与之对应ID号码;这些ID号码存储在硬盘上。
- Linux用户可以分为;管理用户,系统用户,普通用户以及登录用户。
- 群组可以分为主要组和附加组,一个用户有且只有一个主组。
- 用户和群组的主要配置文件如下:
文件目录 | 功能 | 内容描述 |
---|---|---|
/etc/passwd | 主要存储用户的属性和信息,即信息数据库 | 用户信息【用户】【密码x表示加密】【-u 用户id】【-g 用户组id】【-c 用户描述信息】【-d 用户家目录】【-s 用户shell解释器】 |
/etc/shadow | 主要存储用户密码及其属性,即密码数据库 | 用户密码信息,用来记录密码策略,【用户名】【密码】【1970年到上一次修改密码时间】【/etc/login.defs 密码多少天内不能修改密码,0表示随时可修改】【/etc/login.defs 密码有效期是多少天,99999表示密码永不更改】【/etc/login.defs 密码到期前7天通知信息】【useradd/mod -f 参数,密码宽限期】【useradd/mod -e 参数 用户失效时间】【保留】 |
/etc/group | 主要存储群组的属性和信息,即群组数据库 | 组信息 【组信息】【组密码】【-g 组id】【-G 所属附加组用户】 |
/etc/gshadow* | 主要存储群组密码及其属性,即群组密码数据库 | 组密码信息,【用户组信息】【用户组密码】【组管理员列表】【组员信息】 |
用户的增删查改
用户增加
——useradd命令
格式 | 功能 |
---|---|
-d | 指定用户的主目录 |
-u | 手工指定用户的 UID |
-g | 指定用户的初始组 |
-p | 指定新帐户的加密密码(需要加密后的) |
-G | 指定用户的附加组 |
-s | 指定用户的登录 Shell |
-m | 建立用户时强制建立用户的家目录 |
-M | 不创建主目录不创建用户的主目录 |
-h | 帮助显示此帮助消息并退出 |
示例:
root@liuyan-virtual-machine:/home# useradd -m aaa
用户删除
——userdel命令
示例:
root@liuyan-virtual-machine:~# userdel -rf bbb
用户修改
——usernod命令
格式 | 功能 |
---|---|
-c | 修改用户的说明信息 |
-e | 修改用户的失效曰期 |
-d | 修改用户的主目录 |
-s | 修改用户的登录 Shell |
-l | 修改用户名称 |
-g | 修改用户的初始组 |
-u | 修改用户的UID |
-G | 修改用户的附加组 |
示例:
root@liuyan-virtual-machine:~# usermod -l bbb aaa
用户查询
id命令
格式 | 功能 |
---|---|
-Z | 只打印进程的安全上下文 |
-g | 打印有效的组ID |
-G | 打印所有组ID |
-u | 打印有效的用户ID |
示例:
root@liuyan-virtual-machine:~# id -u liuyan
群组的增删查改
群组增加
——groupadd命令
格式 | 功能 |
---|---|
-f | 如果组已存在,则强制退出成功,如果GID已经被使用,则取消-g |
-g | 将gid用于新组 |
-h | 帮助显示此帮助消息并退出 |
-r | 创建系统群组 |
示例:
root@liuyan-virtual-machine:~# groupadd aaa
群组删除
——groupdel命令
格式 | 功能 |
---|---|
-f | 强制删除 |
-h | 查看帮助文档 |
示例:
root@liuyan-virtual-machine:~# groupdel aaa
群组成员查询
——groupmems命令
格式 | 功能 |
---|---|
-g | 更改groupname而不是用户的组 |
模块 | 功能 |
– | – |
-a | 向组成员添加用户名 |
-d | 从组成员中删除用户名 |
-h | 显示此帮助消息并退出 |
-p | 清除组中的所有成员 |
-l | 列出组的成员 |
示例:
root@liuyan-virtual-machine:~# groupmems -g aaa -a liuyan
群组修改
——groupmod命令
格式 | 功能 |
---|---|
g | 修改组 ID |
-n | 修改组名 |
示例:
root@liuyan-virtual-machine:~# groupmod aaa bbb
综合示例:
在某目录下创建的新文件自动属于g1组,组g2的成员如:alice能对这些新文件有读写权限,组g3的成员如:tom只能对新文件有读权限,其它用户(不属于g1,g2,g3)不能访问这个文件夹。
- 首先利用groupadd命令创建g1,g2组;创建用户tom,alice并把他们加入到相应的组里同时设置密码。然后进入到目标目录利用getfacl命令查看相关信息。再利用“setfacl -Rm group:g1:rw- 目标文件"命令设置权限。
root@liuyan-virtual-machine:/dev/TTT# groupadd g1
root@liuyan-virtual-machine:/dev/TTT# groupadd g2
root@liuyan-virtual-machine:/dev/TTT# useradd -G g1 -m alice
root@liuyan-virtual-machine:/dev/TTT# useradd -G g2 -m tom
root@liuyan-virtual-machine:/dev/TTT# passwd alice
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
root@liuyan-virtual-machine:/dev/TTT# passwd tom
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
root@liuyan-virtual-machine:/dev/TTT# mkdir ooo
root@liuyan-virtual-machine:/dev/TTT#chmod g+s ./ooo
root@liuyan-virtual-machine:/dev/TTT# ls
ooo
root@liuyan-virtual-machine:/dev/TTT# getfacl ooo
# file: ooo
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
root@liuyan-virtual-machine:/dev/TTT# setfacl -Rm group:g1:rw- ./ooo
root@liuyan-virtual-machine:/dev/TTT# getfacl ooo
# file: ooo
# owner: root
# group: root
user::rwx
group::r-x
group:g1:rw-
mask::rwx
other::r-x
- 这时,切换到alice用户,测试权限。
alice@liuyan-virtual-machine:~$ cd /dev/TTT
alice@liuyan-virtual-machine:/dev/TTT$ ls
ooo
alice@liuyan-virtual-machine:/dev/TTT$ cd ooo
-su: cd: ooo: Permission denied
alice@liuyan-virtual-machine:/dev/TTT$
- 由于未分配该用户执行权限,导致无法访问该文件目录,需要再次利用setfacl命令添加执行权限。(注意该权限不可被继承)
root@liuyan-virtual-machine:/dev/TTT# setfacl -m group:g1:rwx ./ooo
- 再次登入alice用户,查看权限是否只正确,同时利用getfacl命令查看相关信息。
alice@liuyan-virtual-machine:/dev/TTT$ cd ooo
alice@liuyan-virtual-machine:/dev/TTT/ooo$ touch file1
alice@liuyan-virtual-machine:/dev/TTT/ooo$ ls
file1
alice@liuyan-virtual-machine:/dev/TTT/ooo$ getfacl file1
# file: file1
# owner: alice
# group: alice
user::rw-
group::rw-
group:g1:rw-
mask::rw-
other::r--
alice@liuyan-virtual-machine:/dev/TTT/ooo$
- 现在现需要更改tom用户的权限原理同上。
root@liuyan-virtual-machine:/dev/TTT# setfacl -Rm user:tom:r-- ./ooo
- 切换tom用户查看权限是否有误。
alice@liuyan-virtual-machine:/dev/TTT/ooo$ su - tom
Password:
tom@liuyan-virtual-machine:~$ cd /dev/TTT/
tom@liuyan-virtual-machine:/dev/TTT$ ls
ooo
tom@liuyan-virtual-machine:/dev/TTT$ getfacl ./ooo/
# file: ooo/
# owner: root
# group: root
user::rwx
user:tom:r--
group::r-x
group:g1:rwx
mask::rwx
other::r-x
- 同样为tom用户添加执行权限。(不可被继承)
root@liuyan-virtual-machine:/dev/TTT# setfacl -m user:tom:r-x ./ooo
- 最后检查各用户的权限信息。
om@liuyan-virtual-machine:/dev/TTT$ cd ooo/
tom@liuyan-virtual-machine:/dev/TTT/ooo$ ls
file1
tom@liuyan-virtual-machine:/dev/TTT/ooo$ touch file2
touch: cannot touch 'file2': Permission denied
文本管理
在Linux系统中同样需要针对文本的操作,下面主要介绍文本的相关操作。
文本查看
cat 命令
—— 查看文件里的文本内容
格式 | 功能 |
---|---|
-A | 显示所有等信息 |
-b | 数字非空数字非空输出行 |
-e | 等价于-vE |
-E | 每行末尾显示$ |
-n | 所有输出行的编号 |
-s | 压缩空白抑制重复的空输出行 |
-t | 相当于-vT |
-T | 显示选项卡将选项卡字符显示为^I |
-v | 显示非打印使用^和M-符号,除了LFD和TAB |
示例:
liuyan@liuyan-virtual-machine:~$ cat -A 1.txt
对于较长的文本,需要用cat命令配合其他命令来使用,如:more,less,head,tail等命令
more命令
more功能类似 cat ,more命令从前向后读取文件, more会以一页一页的显示方便使用者逐页阅读,按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,而且还有搜寻字串的功能 。
格式 | 功能 |
---|---|
-num | 一次显示的行数 |
-d | 提示使用者,在画面下方显示 [Press space to continue, ‘q’ to quit.] ,如果使用者按错键,则会显示 [Press ‘h’ for instructions.] 而不是 ‘哔’ 声 |
-l | 取消遇见特殊字元 ^L时会暂停的功能 |
-f | 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上) |
-p | 不以卷动的方式显示每一页,而是先清除萤幕后再显示内容 |
-c | 跟 -p 相似,不同的是先显示内容再清除其他旧资料 |
-s | 当遇到有连续两行以上的空白行,就代换为一行的空白行 |
-u | 不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同) |
示例:
liuyan@liuyan-virtual-machine:/dev$ ls |more
less命令
less 命令也是对文件或其它输出进行分页显示的工具。less 的用法比起 more 更加的具有优势。使用 less 时,可以使用 pageup],pagedown]等按键来往前往后翻看文件,更容易用来查看一个文件的内容
进入less命令前:
格式 | 功能 |
---|---|
-b | 设置缓冲区的大小 |
-f | 强迫打开特殊文件,例如外围设备代号、目录和二进制文件 |
-g | 标志最后搜索的关键词 |
-i | 忽略搜索时的大小写 |
-m | 示类似more命令的百分比 |
-N | 显示每行的行号 |
-o | 将less 输出的内容在指定文件中保存起来 |
-Q | 不使用警告音 |
-s | 显示连续空行为一行 |
-S | 行过长时间将超出部分舍弃 |
-x | 将“tab”键显示为规定的数字空格 |
进入less命令后
按键 | 功能 |
---|---|
n | 重复前一个搜索(与 / 或 ? 有关) |
N | 反向重复前一个搜索(与 / 或 ? 有关) |
b | 向后翻一页 |
d | 向后翻半页 |
h | 显示帮助界面 |
Q | 退出less 命令 |
u | 向前滚动半页 |
y | 向前滚动一行 |
pagedown | 向下翻动一页 |
pageup | 向上翻动一页 |
示例:
liuyan@liuyan-virtual-machine:/dev$ ls |less
head命令
head命令用于显示文件的开头的内容。在默认情况下,head命令显示文件的头10行内容
格式 | 功能 |
---|---|
-c | 显示每个文件的前K 字节内容;如果附加"-"参数,则除了每个文件的最后K字节数据外 显示剩余全部内容 |
-n | 显示每个文件的前K 行内容;如果附加"-"参数,则除了每个文件的最后K行外 显示剩余全部内容 |
-q | 不显示包含给定文件名的文件头 |
-v | 总是显示包含给定文件名的文件头 |
示例:
liuyan@liuyan-virtual-machine:/dev$ ls |head -n 1
agpgart
tail命令
用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件
格式 | 功能 |
---|---|
-f | 循环读取 |
-q | 不显示文件名 |
-v | 显示文件名 |
-c | 显示文件最后N字节内容 |
-n | 显示行数 |
示例:
liuyan@liuyan-virtual-machine:/dev$ ls |tail -n 1
zfs
文本抽取
大多情况下我们更希望从某一出文本中筛选出重要内容,这就用到cut(剪切)工具
cut命令
cut命令可以从一个文本文件或者文本流中提取文本列,从而实现数据抽取
格式 | 功能 |
---|---|
-b | 仅显示行中指定直接范围的内容 |
-c | 仅显示行中指定范围的字符 |
-d | 指定字段的分隔符,默认的字段分隔符为“TAB” |
-f | 显示指定字段的内容 |
-n | 与“-b”选项连用,不分割多字节字符 |
示例:
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ df -h|tr -s " "|sort -nr -t " " -k 5|grep /dev/sda1
/dev/sda1 49G 9.2G 38G 20% /
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ df -h|tr -s " "|sort -nr -t " " -k 5|grep /dev/sda1|cut -d " " -f 5
20%
文本分析
针对某一文本内容我们可能需要对其进行排序,比较,统计其出现的次数等,从而更好的对文本内容进行分析,以便寻找里面的信息
sort命令
sort命令可以帮我们依据不同的数据类型进行排序
格式 | 功能 |
---|---|
-b | 忽略每行前面开始出的空格字符 |
-c | 检查文件是否已经按照顺序排序 |
-f | 排序时,忽略大小写字母 |
-M | 将前面3个字母依照月份的缩写进行排序 |
-n | 依照数值的大小排序 |
-o | 将排序后的结果存入指定的文件 |
-r | 以相反的顺序来排序 |
-t | 指定排序时所用的栏位分隔字符 |
-k | 选择以哪个区间进行排序 |
uniq命令
使用uniq命令可以在最左侧报告或忽略文件中的重复行,一般与sort 连用
格式 | 功能 |
---|---|
-c | 在每列旁边显示该行重复出现的次数 |
-d | 仅显示重复出现的行列 |
-f | 忽略比较指定的栏位 |
-s | 忽略比较指定的字符 |
-u | 仅显示出一次的行列 |
-w | 指定要比较的字符 |
-n | 前n个字段和每个字段前的空白一起被忽略 |
tr命令
tr命令可以对来自标准输入的字符进行替换、压缩和删除
格式 | 功能 |
---|---|
-c | 取代所有不属于第一字符集的字符 |
-d | 删除所有属于第一字符集的字符 |
-s | 把连续重复的字符以单独一个字符表示 |
-t | 先删除第一字符集较第二字符集多出的字符 |
综合示例:
案例一:
找出ifconfig “网卡名”命令结果中本机的IPv4地址
1.输入ifconfg命令查看本机IP地址,我们可以看到目标IP地址在第二行
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.79.131 netmask 255.255.255.0 broadcast 192.168.79.255
inet6 fe80::81a:a8bd:29cd:b06c prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:1a:6b:07 txqueuelen 1000 (Ethernet)
RX packets 357 bytes 45624 (45.6 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 275 bytes 30555 (30.5 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 198 bytes 15868 (15.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 198 bytes 15868 (15.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 通过管道配合tr命令压缩信息之间的空格
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig|tr -s " "
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.79.131 netmask 255.255.255.0 broadcast 192.168.79.255
inet6 fe80::81a:a8bd:29cd:b06c prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:1a:6b:07 txqueuelen 1000 (Ethernet)
RX packets 379 bytes 47582 (47.5 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 283 bytes 31441 (31.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 202 bytes 16192 (16.1 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 202 bytes 16192 (16.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 再利用sort命令按照字母对显示信息排序,这时目标信息在第四行
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig|tr -s " "|sort -n -t "t" -k 3
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:0c:29:1a:6b:07 txqueuelen 1000 (Ethernet)
inet 127.0.0.1 netmask 255.0.0.0
inet 192.168.79.131 netmask 255.255.255.0 broadcast 192.168.79.255
inet6 ::1 prefixlen 128 scopeid 0x10<host>
inet6 fe80::81a:a8bd:29cd:b06c prefixlen 64 scopeid 0x20<link>
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
loop txqueuelen 1000 (Local Loopback)
RX errors 0 dropped 0 overruns 0 frame 0
RX errors 0 dropped 0 overruns 0 frame 0
RX packets 221 bytes 17953 (17.9 KB)
RX packets 466 bytes 55914 (55.9 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
TX packets 221 bytes 17953 (17.9 KB)
TX packets 340 bytes 40387 (40.3 KB)
- 若想提取目标信息我们需要将提取范围缩小,这时利用head命令提取出信息前四行
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig|tr -s " "|sort -n -t "t" -k 3|head -n 4
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether 00:0c:29:1a:6b:07 txqueuelen 1000 (Ethernet)
inet 127.0.0.1 netmask 255.0.0.0
inet 192.168.79.131 netmask 255.255.255.0 broadcast 192.168.79.255
- 然后通过tail命令成功提取目标信息
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig|tr -s " "|sort -n -t "t" -k 3|head -n 6|tail -n 1
inet 192.168.79.131 netmask 255.255.255.0 broadcast 192.168.79.255
- 这时我们需要将目标IP分离,利用cut命令将多余信息分离即可
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ ifconfig|tr -s " "|sort -n -t "t" -k 3|head -n 6|tail -n 1|cut -d " " -f 3
192.168.79.131
案例二:
查出/tmp的权限,以数字方式显示
- 通过stat命令显示文件全部信息,这时我们可以看到目标信息位于第四行(1777)
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp
File: /tmp
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d Inode: 1966081 Links: 14
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-02-26 15:15:09.420093913 +0800
Modify: 2020-02-29 16:37:47.031618619 +0800
Change: 2020-02-29 16:37:47.031618619 +0800
Birth: -
- 首先将显示信息压缩方便进一步操作
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp|tr -s " "
File: /tmp
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d Inode: 1966081 Links: 14
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-02-26 15:15:09.420093913 +0800
Modify: 2020-02-29 16:37:47.031618619 +0800
Change: 2020-02-29 16:37:47.031618619 +0800
Birth: -
- 进一步提取前四行信息,缩小范围
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp|tr -s " "|head -n 4
File: /tmp
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 801h/2049d Inode: 1966081 Links: 14
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
- 通过cut命令剪切目标信息做最后提取
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp|tr -s " "|head -n 4|tail -n 1
Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( 0/ root)
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp|tr -s " "|head -n 4|tail -n 1|cut -d "/" -f 1
Access: (1777
liuyan@liuyan-virtual-machine:~/Desktop/Text/shell$ stat /tmp|tr -s " "|head -n 4|tail -n 1|cut -d "/" -f 1|cut -d "(" -f 2
1777
文本三剑客
grep命令
很多时候,我们并不需要显示出文件的全部内容,而是从文件中找出指定信息,这时,我们可以使用 grep 命令。
grep 命令用于查找内容包含指定模式(即正则表达式)的文件,如果发现某文件的内容符合所指定的模式样式,预设 grep 指令会把含有模式样式的那一列显示出来
注:正则表达式由一类特殊的字符 或文本组成,有些字符(元字符)并不表示其字面内容,而是表示控制或通配功能。
参数格式 | 功能 |
---|---|
-e | 开启正则表达式 |
-i | 忽略大小写 |
-v | 反过来(invert),只打印没有匹配的,而匹配的反而不打印 |
-n | 显示行号 |
-w | 被匹配的文本只能是单词,而不能是单词中的某一部分,如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker |
-c | 显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到 |
-o | 只显示被模式匹配到的字符串 |
-A # | 显示匹配到的字符串所在的行及其后n行,after |
-B # | 显示匹配到的字符串所在的行及其前n行,before |
-C # | 显示匹配到的字符串所在的行及其前后各n行,context |
示例:
-n 显示行号
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep -n /bin
1:root:x:0:0:root:/root:/bin/bash
3:bin:x:2:2:bin:/bin:/usr/sbin/nologin
5:sync:x:4:65534:sync:/bin:/bin/sync
12:proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
30:speech-dispatcher:x:111:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/false
-c 统计匹配行数
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep -c /bin
10
-o 显示匹配内容
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep -o /bin
/bin
/bin
/bin
正则表达式
相关简介
正则表达式由一类特殊的字符 或文本组成,有些字符(元字符)并不表示其字面内容,而是表示控制或通配功能。
字符通配
模式 | 功能 |
---|---|
. | 匹配任意单个字符 |
[ ] | 匹配指定范围内的任意单个字符 |
[^] | 匹配指定范围外的任意单个字符 |
[:alnum:] | 字母和数字 |
[:alpha:] | 代表任何英文大小写字符,亦即A-Z, a-z |
[:lower:] | 小写字母[:upper:] 大写字母 |
[:blank:] | 空白字符(空格和制表符) |
[:space:] | 水平和垂直的空白字符(比[:blank:]包含的范围广) |
[:cntrl:] | 不可打印的控制字符(退格、删除、警铃…) |
[:digit:] | 十进制数字[:xdigit:]十六进制数字 |
[:graph:] | 可打印的非空白字符 |
[:print:] | 可打印字符 |
[:punct:] | 标点符号 |
示例:
. 匹配任意单个字符
liuyan@liuyan-virtual-machine:~$ netstat -ant|grep -o 192.1.
192.16
192.16
192.16
[:alnum:] 字母和数字
liuyan@liuyan-virtual-machine:~$ netstat -ant|grep -o [[:alnum:]]
A
c
1
[:lower:] 小写字母[:upper:] 大写字母
liuyan@liuyan-virtual-machine:~$ netstat -ant|grep -o [[:lower:]]
c
t
i
[:digit:] 十进制数字[:xdigit:]十六进制数字
liuyan@liuyan-virtual-machine:~$ netstat -ant|grep -o [[:digit:]]
0
0
1
2
7
综合示例:
liuyan@liuyan-virtual-machine:~$ netstat -ant|grep [[:lower:]][[:lower:]][[:alnum:]][[:digit:]]
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:631 :::* L
次数通配
字符 | 功能 |
---|---|
* | 匹配前面的字符任意次,包括0次(贪婪模式:尽可能长的匹配) |
.* | 任意长度的任意字符 |
? | 匹配其前面的字符0或1次 |
± | 匹配其前面的字符至少1次 |
{n} | 匹配前面的字符n次 |
{m,n} | 匹配前面的字符至少m次,至多n次 |
{,n} | 匹配前面的字符至多n次 |
{n,} | 匹配前面的字符至少n次 |
示例:
{n}-------匹配前面的字符n次
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ cat ff
telephonenumber is 13356487956
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ cat ff|grep -o 1[[:digit:]]\\{10\\}
18695250179
{m,n}----匹配前面的字符至少m次,至多n次
liuyan@liuyan-virtual-machine:~$ netstat -ant|grep -o [[:digit:]]\\{1\,3\\}\\.[[:digit:]]\\{1\,3\\}\\.[[:digit:]]\\{1\,3\\}\\.[[:digit:]]\\{1\,3\\}
127.0.0.53
0.0.0.0
0.0.0.0
0.0.0.0
127.0.0.1
0.0.0.0
位置锚定
字符 | 功能 |
---|---|
^ | 行首锚定,用于模式的最左侧 |
$ | 行尾锚定,用于模式的最右侧 |
^PATTERN$ | 用于模式匹配整行 |
^$ | 空行 |
^[[:space:]]*$ | 空白行 |
< 或\b | 词首锚定,用于单词模式的左侧 |
> 或\b | 词尾锚定;用于单词模式的右侧 |
<PATTERN> | 匹配整个单词 |
示例:
^ 行首锚定,用于模式的最左侧
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ cat ff|grep 1[[:digit:]]\\{10\\}
telephonenumber is 13356487956
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ cat ff|grep -o ^tel[[:lower:]]\\{1\,\\}
telephonenumber
$ 行尾锚定,用于模式的最右侧
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ cat ff|grep 1[[:digit:]]\\{10\\}
telephonenumber is 13356487956
liuyan@liuyan-virtual-machine:~/Desktop/Text/practice$ cat ff|grep -o [[:digit:]]\\{1\,\\}$
13356487956
综合案例
- 显示某目录下某文件中以大小s开头的行
首先输入cat命令查看相关信息
liuyan@liuyan-virtual-machine:~$ cat /proc/meminfo
MemTotal: 4002280 kB
MemFree: 527556 kB
MemAvailable: 1396708 kB
Buffers: 68360 kB
Cached: 1044216 kB
SwapCached: 0 kB
Active: 2171800 kB
然后利用管道+grep命令过滤主要信息
liuyan@liuyan-virtual-machine:~$ cat /proc/meminfo |grep -e ^S -e ^s
SwapCached: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Shmem: 79768 kB
Slab:
- 显示/etc/passwd文件中不以/bin/bash结尾的行
首先输入cat命令查看目标信息
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
然后通过管道利用grep命令过滤以/bin/bash结尾的信息
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep /bin/bash$
root:x:0:0:root:/root:/bin/bash
liuyan:x:1000:1000:liuyan,,,:/home/liuyan:/bin/bash
最后加入-v命令逆置过滤结果即可
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep -v /bin/bash$
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
- 找出/etc/passwd中的两位或三位数
首先输入cat命令通过管道利用grep命令过滤含有两三位数的信息
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep [[:digit:]]\\{2\,3\\}
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
然后通过-o命令将数字提取即可
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep -o [[:digit:]]\\{2\,3\\}
655
34
60
12
10
- 显示Ubuntu上所有系统用户的用户名和UID
首先输入cat命令查看信息
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
然后铜鼓管道加grep命令筛选用户名
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep ^[[:lower:]]\\{1\,\\}:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
利用正则表达式筛选用户名和Uid,最后利用-o命令提取即可
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep -o -e ^[[:lower:]]\\{1\,\\}: -e :[[:digit:]]\\{1\,\\}:
root:
:0:
daemon:
:1:
bin:
:2:
sys:
- 找出/etc/passwd用户名同shell名的行
首先利用cat命令查看所属信息,然后通过管道利用grep命令过滤出用户名
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep -o -e ^[[:lower:]]\\{1\,\\}
root
daemon
bin
sys
sync
games
man
lp
然后利用正则表达式过滤出bash,再利用-o命令提取即可
liuyan@liuyan-virtual-machine:~$ cat /etc/passwd|grep -o -e ^[[:lower:]]\\{1\,\\} -e /[[:lower:]]\\{1\,\\}$
root
/bash
daemon
/nologin
bin
/nologin
sys
/nologin
最后利用tr命令压缩空格,并赋值给数组后输出
liuyan@liuyan-virtual-machine:~$ a=$(cat /etc/passwd|grep -o -e ^[[:lower:]]\\{1\,\\} -e /[[:lower:]]\\{1\,\\}$|tr -s " ")
liuyan@liuyan-virtual-machine:~$ echo ${a}
root /bash daemon /nologin bin /nologin sys /nologin sync /sync games /nologin man /nologin lp /nologin mail /nologin news /nologin uucp /nologin proxy /nologin
- 利用df和grep,取出磁盘各分区利用率,并从大到小排序
利用df命令查看硬件使用数据
liuyan@liuyan-virtual-machine:~$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 391M 2.0M 389M 1% /run
/dev/sda1 49G 9.3G 38G 20% /
tmpfs 2.0G 89M 1.9G 5% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
然后通过管道过滤百分比数字,再利用sort命令排序即可
liuyan@liuyan-virtual-machine:~$ df -h|grep [[:digit:]]\\{1\,3\\}%|sort -n
/dev/loop0 35M 35M 0 100% /snap/gtk-common-themes/818
/dev/loop10 92M 92M 0 100% /snap/core/8689
/dev/loop11 13M 13M 0 100% /snap/gnome-characters/139
/dev/loop1 2.3M 2.3M 0 100% /snap/gnome-calculator/260
/dev/loop12 4.3M 4.3M 0 100% /snap/gnome-calculator/544