Linux(入门篇)

一、计算机基础和Linux基础知识

1.冯诺依曼体系结构

Linux(入门篇)

1946年美籍匈牙利数学家冯·诺依曼于提出存储程序原理,把程序本身当作数据来对待,程序和该程序处理的数据用同样的方式储存。冯·诺依曼体系的要点是:

  • 数字计算机的数制采用二进制,bit位, byte字节1 byte = 8 bit
  • 计算机应按程序顺序执行。
    [En]

    computers should be executed in sequence of programs.*

  • 计算机硬件由五部分组成:算术单元、控制器、存储器、输入设备和输出设备。
    [En]

    computer hardware consists of five parts: arithmetic unit, controller, memory, input device and output device.*

8个二进制位bit(b)称为一个字节byte(B)

(1)二级制和十进制转换

0
2^0 1
2^1 10         2
2^2 100        4
2^3 1000       8
2^4 10000      16
2^5 100000     32
2^6 1000000    64
2^7 10000000   128
2^8            256
2^9            512
2^10           1024

#综上,0的个数等于2的次方数

例:十进制26的二进制计算方法

26=16+8+2

10000   16
01000    8
00010    2
11010

#方法:用2的n次方的数去凑成所要求的二进制数,奇数+1

(2)ibase和obase用法

ibase :设置输入数据的进制

obase :设置输出数据的进制

[root@rocky01 ~]#bc
bc 1.07.1
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software Foundation, Inc.

This is free software with ABSOLUTELY NO WARRANTY.

For details type warranty'.

obase=2
ibase=10
26
11010
</code></pre>
<p><strong>不同进制转换:</strong></p>
<blockquote>
<p>八进制转十进制: echo "obase=10; ibase=8; 377" lbc
二进制转十进制: echo "obase=10; ibase=2; 11111111" |bc
二进制转16进制: echo "obase=16; ibase=2; 11111111" |bc</p>
</blockquote>
<pre><code>[root@rocky01 ~]#echo "obase=10; ibase=8; 377" |bc
255
[root@rocky01 ~]#echo "obase=10; ibase=2; 11111111" |bc
255
[root@rocky01 ~]#echo "obase=16; ibase=2; 11111111" |bc
FF
</code></pre>
<h2>2.摩尔定律</h2>
<blockquote>
<p>由英特尔(Intel)创始人之一戈登·摩尔于1965年提出,当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍</p>
</blockquote>
<h2>3.Linux/Unix 哲学思想、原则、理念</h2>
<blockquote></blockquote>
<ul>
<li>一切都是文件(包括硬件)<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'></em> everything is a file (including hardware)</font>*</details></li>
<li>小型,单一用途的程序</li>
<li>链接程序,共同完成复杂的任务(shell脚本)</li>
<li>避免令人困惑的用户界面</li>
<li>配置数据存储在文本中</li>
</ul>
<h2>4.开源许可证 GPL、BSD、MIT、Mozilla、Apache和LGPL</h2>
<h3>(1)区别</h3>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220726232804394-1201778698.png" /></p>
<h3>(2)查看软件的发行许可(License)</h3>
<pre><code>[root@rocky01 ~]#rpm -qi kernel |grep License
License     : GPLv2 and Redistributable, no modification permitted
[root@rocky01 ~]#
[root@rocky01 ~]#rpm -qi openssh|grep License
License     : BSD
</code></pre>
<h2>5.安装Centos8、Rocky8和Ubuntu20.4</h2>
<h3>(1)Centos8、Rocky8</h3>
<p>(1.1)在启动安装时按Tab键在命令后面添加" net.ifnames=0"可以将网卡名称限定为eth开头</p>
<p>若为戴尔服务器,则添加"net.ifnames=0 biosdevname=0 "</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220726234748617-1458107431.png" /></p>
<p>(1.2)系统默认语言选择:English</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220726234918158-1050534604.png" /></p>
<p>(1.3)时区:Asia/Shanghai</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220726235017540-2028402409.png" /></p>
<p>(1.4)安装方式:Minimal Install (建议选择最小安装,遇到错误去解决后能积累经验)</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220726235053845-1928540071.png" /></p>
<p>(1.5)分区:暂时默认</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220726235327324-1177560990.png" /></p>
<p>(1.6)网络和主机名</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220726235414273-1208938765.png" /></p>
<p>(1.7)设置root用户和密码</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220726235502330-1744630582.png" /></p>
<p>(1.8)创建普通用户</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220726235513326-1287421487.png" /></p>
<p>(1.9)重启安装完成</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220726235552486-858002456.png" /></p>
<h3>(2)Ubuntu</h3>
<p>(2.1)系统默认语言选择:English</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220726235622045-1401375174.png" /></p>
<p>(2.2)安装或升级:选择Continue without updating 安装不更新</p>
<p>(2.3)键盘语言布局:默认English</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220726235813307-518887902.png" /></p>
<p>(2.4)网络配置:开启了DHCP会自动分配一个IP地址</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220726235841269-1516223940.png" /></p>
<p>(2.5)代理配置:默认</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220726235857231-1418170759.png" /></p>
<p>(2.6)镜像地址:<a href="http://mirrors.aliyun.com/ubuntu/" title="http://mirrors.aliyun.com/ubuntu/">http://mirrors.aliyun.com/ubuntu/</a> 使用阿里云的镜像地址,在国内速度快些</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220726235934209-1058461738.png" /></p>
<p>(2.7)分区:暂时默认</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220726235956185-832515926.png" /></p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220727000023472-757179925.png" /></p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220727000029877-1621761105.png" /></p>
<p>(2.8)创建普通用户</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220727000046523-814733630.png" /></p>
<p>(2.9)Enable Ubuntu Advantage:默认</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220727000108753-2064997678.png" /></p>
<p>(2.10)开启SSH</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220727000123948-369472025.png" /></p>
<p>(2.11)Featured Server Snps:默认</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220727000139654-1939616932.png" /></p>
<p>(2.12)安装完成后重启</p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220727000215051-1763360521.png" /></p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220727000224558-102688536.png" /></p>
<h2>6.什么是Shell</h2>
<blockquote>
<p>Shell 是Linux系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。</p>
</blockquote>
<pre><code>#各种Shell
[root@rocky01 ~]#echo ${SHELL}
/bin/bash
[root@rocky01 ~]#cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
</code></pre>
<h2>7.shell中可执行的两类(内外)命令</h2>
<blockquote></blockquote>
<ul>
<li>内部命令:由shell自带的,而且通过某命令形式提供, ,用户登录后自动加载并常驻内存中</li>
<li>外部命令:文件系统路径下有对应的可执行程序文件,命令执行时从磁盘加载到内存中,执行后从内存中删除。<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'></em> external command: there is a corresponding executable program file under the file system path, which is loaded into memory from disk when the command is executed, and deleted from memory after execution.</font>*</details></li>
</ul>
<p>查看是内部还是外部命令</p>
<p><code>type COMMAND</code></p>
<pre><code>[root@rocky01 ~]# type -a echo
echo is a shell builtin   #内部命令
echo is /usr/bin/echo     #外部命令

#综上,echo既是内部命令又是外部命令

[root@rocky01 ~]# type -a who
who is /usr/bin/who       #外部命令
</code></pre>
<h3>hash缓存表</h3>
<blockquote>
<p>系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后会将这条命令的路径记录到hash表中,当再次使用该命令时,shell解释器首先会查看hash表,存在将执行之,如果不存在,将会去PATH路径下寻找,利用hash缓存表可大大提高命令的调用速率
命令常见用法</p>
</blockquote>
<ul>
<li>hash 显示hash缓存</li>
<li>hash -l 显示hash缓存,可作为输入使用</li>
<li>hash -p path name 将命令全路径path起别名为name</li>
<li>hash -t name 打印缓存中name的路径</li>
<li>hash -d name 清除name缓存</li>
<li>hash -r 清除缓存</li>
</ul>
<h2>8.文件系统目录结构</h2>
<h3>(1)结构</h3>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220727025628521-897659339.png" /></p>
<blockquote>
<p>文件和目录被组织成一个单根倒置树结构
文件系统在根目录下启动,并由“/”表示<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>The file system starts under the root directory and is represented by "/"</font></em></details>
根文件系统(rootfs):root filesystem
标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL
以 . 开头的文件为隐藏文件
路径分隔的 /
文件名最长255个字节
文件名(包括路径)最长为4095个字节<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>The file name, including the path, is up to 4095 bytes</font></em></details>
蓝色-->目录 绿色-->可执行文件 红色-->压缩文件 浅蓝色-->链接文件 灰色-->其他文件
除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用</p>
</blockquote>
<h3>(2)常用目录功能</h3>
<blockquote></blockquote>
<ul>
<li>/bin:所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序</li>
<li>/sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序</li>
<li>/boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放于此目录</li>
<li>/dev:设备文件及特殊文件存储位置</li>
<li>/etc:配置文件目录</li>
<li>/home:普通用户家目录</li>
<li>/lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)</li>
<li>/lib64:专用于x86_64系统上的辅助共享库文件存放位置</li>
<li>/media:便携式移动设备挂载点</li>
<li>/mnt:临时文件系统挂载点</li>
<li>/opt:第三方应用程序的安装位置</li>
<li>/proc:用于输出内核与进程信息相关的虚拟文件系统</li>
<li>/sys:用于输出当前系统上硬件设备相关信息虚拟文件系统</li>
<li>/root:管理员的家目录</li>
<li>/run:目前在系统中运行的一些临时文件</li>
<li>/srv:系统上运行的服务用到的数据</li>
<li>/tmp:临时文件存储位置</li>
<li>/usr: universal shared, read-only data
├── bin: 保证系统拥有完整功能而提供的应用程序
├── sbin:
├── lib:32位使用
├── lib64:只存在64位系统
├── include: C程序的头文件(header files)
├── share:结构化独立的数据,例如doc, man等
├── local:第三方应用程序的安装位置</li>
<li>/var:variable data files
├── cache: 应用程序缓存数据目录
├── lib: 应用程序状态信息数据
├── local:专用于为/usr/local下的应用程序存储可变数据
├── lock: 锁文件
├── log: 日志目录及文件
├── opt: 专用于为/opt下的应用程序存储可变数据
├── run: 运行中的进程相关数据,通常用于存储进程pid文件
├── spool: 应用程序数据池
├── tmp: 保存系统两次重启之间产生的临时数据</li>
</ul>
<h2>9.Linux下的文件类型</h2>
<blockquote></blockquote>
<ul>
<li>
<ul>
<li>普通文件</li>
</ul>
</li>
<li>d 目录文件directory</li>
<li>l 符号链接文件link</li>
<li>b 块设备block</li>
<li>c 字符设备character</li>
<li>p 管道文件pipe</li>
<li>s 套接字文件socket</li>
</ul>
<h2>10.文件元数据和节点表结构</h2>
<h3>(1)inode 表结构</h3>
<blockquote>
<p>每个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)。这此元数据是存放在inode(index node)表中。inode 表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息
每一个inode表记录对应的保存了以下信息:</p>
</blockquote>
<ul>
<li>inode number 节点号</li>
<li>文件类型</li>
<li>权限</li>
<li>UID</li>
<li>GID</li>
<li>链接数(指向该文件名的路径名数)<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'></em> number of links (number of path names pointing to this file name)</font>*</details></li>
<li>文件的大小和不同的时间戳<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'></em> the size and different timestamps of the file</font>*</details></li>
<li>阻止指向磁盘上文件的指针<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'></em> Block pointers to files on disk</font>*</details></li>
<li>有关文件的其他数据</li>
</ul>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220727145506584-632971766.png" /></p>
<blockquote>
<p><strong>指针</strong>
磁盘是一种块文件,以块的方式来存储数据,每块通常都是4K,</p>
</blockquote>
<ul>
<li>直接指针
直接指针直接指向存放的位置,直接指针只有12个,12x4K=48K,可以表达48K的数据一个文件假如是1K或者哪怕是一个字节,也要分配一块4k的空间来存储这个文件,一个文件假如是10k,分配3块空间来存放,就有3个指针来指向存放的3个块</li>
<li>间接指针
指针不是直接指向数据存储的位置,而是指向指针块,指针块也是4K大小,一个指针放4个字节,一个指针块可以放1024个指针,4Kx1024=4M ,可以表达4M的数据超过48K低于4M,就可以用间接指针来表示</li>
<li>双重间接指针一个间接指针块指向另一个间接指针块矩阵4Kx1024x1024=4G,可以表达4G的数据</li>
<li>三重间接指针
4Kx1024x1024x1024=4T,可以表达4T的数据</li>
</ul>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220727145712232-1809897293.png" /></p>
<h3>(2)硬链接</h3>
<blockquote>
<p>硬链接本质上就给一个文件起一个新的名称,实质是同一个文件
硬链接特性</p>
</blockquote>
<ul>
<li>创建硬链接将向相应目录添加更多条目以引用该文件<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'></em> creating a hard link will add additional entries to the corresponding directory to reference the file</font>*</details></li>
<li>对应于同一文件系统上的物理文件<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'></em> corresponds to a physical file on the same file system</font>*</details></li>
<li>每个目录引用相同的inode号</li>
<li>创建时链接数递增</li>
<li>删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文件被删除</li>
<li>不能跨越驱动器或分区</li>
<li>不支持对目录创建硬链接</li>
</ul>
<p>格式</p>
<p><code>ln filename [linkname ]</code></p>
<h3>(3)软链接或符号链接</h3>
<blockquote>
<p>一个符号链接指向另一个文件,就像 windows 中快捷方式,软链接文件和原文件本质上不是同一个文件
软链接特点</p>
</blockquote>
<ul>
<li>符号链接的内容是它引用的文件的名称<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'></em> the content of a symbolic link is the name of the file it references</font>*</details></li>
<li>可以对目录创建软链接</li>
<li>可以跨分区的文件实现</li>
<li>指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数</li>
<li>在创建软链接时, 如果源文件使用相对路径,是相对于软链接文件的路径,而非相对于当前工作目录,但是软链接的路径如果是相对路径,则是相对于当前工作目录</li>
</ul>
<p>格式</p>
<p><code>ln -s filename [linkname]</code></p>
<h3>(4)硬链接和软链接的区别</h3>
<p>硬链接 软链接 本质 本质是同一个文件 本质不是同一个文件 跨设备 不支持 支持 inode(节点) 相同 不同 链接数 创建新的硬链接,链接数增加;删除硬链接,链接数减少 创建或删除,链接数不会变化 文件夹 不支持 支持 相对路径 原始文件相对路径是相对于当前工作目录 原始文件的相对路径是相对于链接文件的相对路径 删除源文件 只是链接数减一,但链接文件的访问不受影响 链接文件将无法访问 文件类型 和源文件相同 链接文件,和源文件无关 文件大小 和源文件相同 源文件的路径长度</p>
<blockquote>
<p>ls -i 打印每个文件的索引号
索引号inode相同的本质上是同一个文件(前提是同一个逻辑卷)</p>
</blockquote>
<pre><code>[root@rocky01 ~]# echo abc > f1.txt
[root@rocky01 ~]#
[root@rocky01 ~]# ln f1.txt f2.txt
[root@rocky01 ~]# ln -s f1.txt f3.txt
[root@rocky01 ~]#
[root@rocky01 ~]# ls -li
total 8
201327634 -rw-r--r--. 2 root root 4 Jul 27 15:28 f1.txt
201327634 -rw-r--r--. 2 root root 4 Jul 27 15:28 f2.txt
201327862 lrwxrwxrwx. 1 root root 6 Jul 27 15:28 f3.txt -> f1.txt
</code></pre>
<h2>11.用户、组和权限</h2>
<h3>(1)用户</h3>
<blockquote>
<p>Linux中每个用户是通过 User Id (UID)来唯一标识的</p>
</blockquote>
<ul>
<li>管理员:root, 0</li>
<li>普通用户:1-60000 自动分配</li>
</ul>
<p>*
  - 系统用户:1-499 (CentOS 6以前), 1-999 (CentOS 7以后)
  - 对守护进程获取资源进行权限分配
  - 登录用户:500+ (CentOS6以前), 1000+(CentOS7以后)
  - 给用户进行交互式登录使用</p>
<h3>(2)用户组</h3>
<blockquote>
<p>Linux中可以将一个或多个用户加入用户组中,用户组是通过Group ID(GID) 来唯一标识的。</p>
</blockquote>
<ul>
<li>管理员组:root, 0</li>
<li>普通组:</li>
</ul>
<p>*
  - 系统组:1-499(CentOS 6以前), 1-999(CentOS7以后), 对守护进程获取资源进行权限分配
  - 普通组:500+(CentOS 6以前), 1000+(CentOS7以后), 给用户使用</p>
<h3>(3)用户和组的关系</h3>
<blockquote></blockquote>
<ul>
<li>用户的主要组(primary group):用户必须属于一个且只有一个主组,默认创建用户时会自动创建和用户名同名的组,做为用户的主要组,由于此组中只有一个用户,又称为私有组</li>
<li>用户的附加组(supplementary group): 一个用户可以属于零个或多个辅助组,附属组</li>
</ul>
<p>例:</p>
<pre><code>[root@rocky01 ~]# id postfix
uid=89(postfix) gid=89(postfix) groups=89(postfix),12(mail)
</code></pre>
<h2>12.磁盘分区</h2>
<h3>(1)为什么要分区</h3>
<blockquote></blockquote>
<ul>
<li>优化I/O性能</li>
<li>实现磁盘空间配额限制</li>
<li>提高修复速度</li>
<li>隔离系统和程序</li>
<li>安装多个OS</li>
<li>采用不同文件系统</li>
</ul>
<h3>(2)分区方式</h3>
<p>两种分区方式:MBR,GPT</p>
<h4>(2.1)MBR分区</h4>
<p>使用32位表示扇区数,分区不超过2T</p>
<blockquote>
<p>MBR分区中一块硬盘最多有4个主分区,也可以3主分区+1扩展(N个逻辑分区)
MBR分区:主和扩展分区对应的1--4,/dev/sda3,逻辑分区从5开始,/dev/sda5</p>
</blockquote>
<h4>(2.2)GPT分区</h4>
<p>支持128个分区,使用64位,支持8Z( 512Byte/block )64Z ( 4096Byte/block)</p>
<h2>13.文件系统</h2>
<blockquote>
<p>Linux 常用文件系统</p>
</blockquote>
<ul>
<li>ext2:Extended file system 适用于那些分区容量不是太大,更新也不频繁的情况,例如 /boot 分区</li>
<li>ext3:是 ext2 的改进版本,其支持日志功能,能够帮助系统从非正常关机导致的异常中恢复</li>
<li>ext4:是 ext 文件系统的最新版。提供了很多新的特性,包括纳秒级时间戳、创建和使用巨型文件(16TB)、最大1EB的文件系统,以及速度的提升</li>
<li>xfs:SGI,支持最大8EB的文件系统</li>
<li>swap</li>
<li>iso9660 光盘</li>
<li>btrfs(Oracle)</li>
</ul>
<h2>14.RAID</h2>
<h3>(1)什么是RAID</h3>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220728204447135-1141017574.png" /></p>
<blockquote>
<p>"RAID"一词是由David Patterson, Garth A. Gibson, Randy Katz 于1987年在加州大学伯克利分校发明的。在1988年6月SIGMOD会议上提交的论文"A Case for Redundant Arrays of Inexpensive Disks""中提出,当时性能最好的大型机不断增长的个人电脑市场开发的一系列廉价驱动器的性能所击败。尽管故障与驱动器数量的比例会上升,但通过配置冗余,阵列的可靠性可能远远超过任何大型单个驱动器的可靠性
<strong>独立硬盘冗余阵列</strong>( <strong>RAID</strong>, <strong>R</strong>edundant <strong>A</strong>rray of <strong>I</strong>ndependent <strong>D</strong>isks),旧称 <strong>廉价磁盘冗余阵列</strong>( <strong>R</strong>edundant <strong>A</strong>rray of <strong>I</strong>nexpensive <strong>D</strong>isks),简称 <strong>磁盘阵列</strong>。利用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵列组,目的为提升性能或数据冗余,或是两者同时提升。
RAID 层级不同,数据会以多种模式分散于各个硬盘,RAID 层级的命名会以 RAID 开头并带数字,例如:RAID 0、RAID 1、RAID 5、RAID 6、RAID 7、RAID 01、RAID 10、RAID 50、RAID 60。每种等级都有其理论上的优缺点,不同的等级在两个目标间获取平衡,分别是增加数据可靠性以及增加存储器(群)读写性能。
简单来说,RAID把多个硬盘组合成为一个逻辑硬盘,因此,操作系统只会把它当作一个实体硬盘。RAID常被用在服务器电脑上,并且常使用完全相同的硬盘作为组合。由于硬盘价格的不断下降与RAID功能更加有效地与主板集成,它也成为普通用户的一个选择,特别是需要大容量存储空间的工作,如:视频与音频制作</p>
</blockquote>
<h3>(1)RAID-0</h3>
<blockquote>
<p>条带卷 2+ (最低磁盘个数) 空间利用率100% 读写速度快,不容错</p>
</blockquote>
<h3>(2)RAID-1</h3>
<blockquote>
<p>镜像卷 2 50% 读写速度一般,容错</p>
</blockquote>
<h3>(3)RAID5</h3>
<blockquote>
<p>带奇偶校验的条带卷 3+ (n-1)/n 读写速度块,容错,允许坏一块盘</p>
</blockquote>
<h3>(4)RAID6</h3>
<blockquote>
<p>带奇偶校验的条带集,双校验 4+ (n-2)/n 读写快,容错,允许坏两块</p>
</blockquote>
<h3>(5)RAID10</h3>
<blockquote>
<p>RAID1的安全+RAID0的高速 4 50% 读写速度快,容错</p>
</blockquote>
<h3>(6)实现软RAID</h3>
<blockquote>
<p>mdadm工具:为软RAID提供管理界面,为空余磁盘添加冗余,结合内核中的md(multi devices)
RAID设备可命名为/dev/md0、/dev/md1、/dev/md2、/dev/md3等
常用选项说明:</p>
</blockquote>
<ul>
<li>模式:</li>
<li>创建:-C</li>
<li>装配:-A</li>
<li>监控:-F</li>
<li>管理:-f, -r, -a
*
*</li>
<li>-C: 创建模式</li>
<li>-n #: 使用#个块设备来创建此RAID</li>
<li>-l #:指明要创建的RAID的级别</li>
<li>-a {yes|no}:自动创建目标RAID设备的设备文件</li>
<li>-c CHUNK_SIZE: 指明块大小,单位k</li>
<li>-x #: 指明空闲盘的个数</li>
<li>-D:显示raid的详细信息</li>
<li>mdadm -D /dev/md#</li>
<li>管理模式:</li>
<li>-f: 标记指定磁盘为损坏</li>
<li>-a: 添加磁盘</li>
<li>-r: 移除磁盘</li>
<li>观察md的状态: cat /proc/mdstat</li>
</ul>
<p>范例</p>
<pre><code>#使用mdadm创建并定义RAID设备
[root@rocky01 ~]# mdadm -C /dev/md0 -a yes -l 5 -n 3 -x 1 /dev/sd{b,c,d,e}1

#用文件系统对每个RAID设备进行格式化
[root@rocky01 ~]# mkfs.xfs /dev/md0

#使用mdadm检查RAID设备的状况
[root@rocky01 ~]# mdadm --detail|D /dev/md0

#增加新的成员
[root@rocky01 ~]# mdadm -G /dev/md0 -n4  -a /dev/sdf1

#模拟磁盘故障
[root@rocky01 ~]# mdadm /dev/md0  -f /dev/sda1

#移除磁盘
[root@rocky01 ~]# mdadm   /dev/md0 -r /dev/sda1

#在备用驱动器上重建分区
[root@rocky01 ~]# mdadm /dev/md0  -a /dev/sda1

#系统日志信息
[root@rocky01 ~]# cat /proc/mdstat
</code></pre>
<p>二、Linux基础命令</p>
<h2>1. <strong>apt</strong></h2>
<p>命令 功能 apt remove 会删除软件包而保留软件的配置文件 apt purge 会同时清除软件包和软件的配置文件</p>
<h2>2.查看当前终端设备</h2>
<blockquote>
<p>VMware同时按Ctrl+Alt+F12345... 可切换新的终端设备</p>
</blockquote>
<h3>(1)tty</h3>
<pre><code>#远程终端查看
[root@rocky01 ~]#tty
/dev/pts/0

#VMware上查看
[root@rocky01 ~]#tty
/dev/tty1
</code></pre>
<h4>tty1输入的得到的输出显示到tty2</h4>
<pre><code>#打开两个终端,使用tty命名分别查看它们的id,如/dev/pts/1   /dev/pts/2
#然后在/dev/pts/1中输入echo "info" > /dev/pts/2
</code></pre>
<h3>(2)who</h3>
<pre><code>root@ubuntu01:~# who
rye      tty1         2022-07-12 11:58
root     pts/0        2022-07-12 13:19 (10.0.0.1)
</code></pre>
<h2>3.设置主机名</h2>
<blockquote>
<p>注:主机名不支持使用下划线,但支持横线,可使用字母,横线或数字组合</p>
</blockquote>
<pre><code>#临时生效
[root@rocky01 ~]# hostname NAME

#持久生效,支持CentOS7以上和Ubuntu18.04以上版本
[root@rocky01 ~]# hostnamectl set-hostname NAME
[root@rocky01 ~]# cat /etc/hostname
rocky01

#CentOS6版本,需要文件修改和hostname命令修改
[root@centos6 ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=centos6
[root@centos6 ~]# hostname centos6
</code></pre>
<h2>4.命令提示符 prompt (PS1)</h2>
<pre><code>PS1="\[\e[1;33m\][\u@\h \W]\\$ \[\e[0m\]"
PS1="\[\e[1;33m\][\u@\h\[\e[0m\] \[\e[33m\]\W\[\e[1;33m\]]\\$ \[\e[0m\]"  #自用
</code></pre>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220727003309733-225556733.png" /></p>
<p>提示符格式说明</p>
<blockquote></blockquote>
<ul>
<li>\e 或 \033 控制符</li>
<li>\u 当前用户</li>
<li>\h 主机名简称</li>
<li>\H 主机名</li>
<li>\w 当前工作目录</li>
<li>\W 当前工作目录基名</li>
<li>\t 24小时时间格式</li>
<li>\T 12小时时间格式</li>
<li>! 命令历史数</li>
<li>
<h1>开机后命令历史数</h1>
</li>
</ul>
<p>范例:</p>
<pre><code>[root@rocky01 ~]# PS1="\[\e[1;33m\][\t-\u@\h \W\!-\#]\\$ \[\e[0m\]"
[00:45:34-root@rocky01 ~243-25]#

注:
243  !命令历史数
25   #开机后命令历史数
</code></pre>
<h2>5.别名alias</h2>
<blockquote>
<p>定义别名NAME,其相当于执行命令VALUE <code>alias NAME='VALUE'</code></p>
</blockquote>
<pre><code>#显示当前shell进程所有可用的命令别名
[root@rocky01 ~]# alias
alias cdnet='cd /etc/sysconfig/network-scripts'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias xzegrep='xzegrep --color=auto'
alias xzfgrep='xzfgrep --color=auto'
alias xzgrep='xzgrep --color=auto'
alias zegrep='zegrep --color=auto'
alias zfgrep='zfgrep --color=auto'
alias zgrep='zgrep --color=auto'
</code></pre>
<p>创建别名 alias NAME='VALUE'</p>
<pre><code>[root@rocky01 ~]# alias cdnet='cd /etc/sysconfig/network-scripts'
[root@rocky01 ~]# cdnet
[root@rocky01 network-scripts]# pwd
/etc/sysconfig/network-scripts
</code></pre>
<p>撤销别名 unalias NAME</p>
<pre><code>[root@rocky01 ~]# unalias ls #撤销单个别名
[root@rocky01 ~]# unalias -a #撤销所有别名
</code></pre>
<p>如果要执行原始命令,请使用<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>If you want to execute the original command, use the</font></em></details></p>
<blockquote>
<p><code>\ALIASNAME</code><br> <code>"ALIASNAME"</code><br> <code>'ALIASNAME'</code></p>
</blockquote>
<pre><code>[root@rocky01 ~]# cp 1 /opt/
cp: overwrite '/opt/1'? y

[root@rocky01 ~]# \cp 1 /opt/
[root@rocky01 ~]# 'cp' 1 /opt/
[root@rocky01 ~]# "cp" 1 /opt/
</code></pre>
<h2>6.查看硬件信息</h2>
<h3>(1)查看CPU</h3>
<pre><code>[root@rocky01 ~]# lscpu
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              2
On-line CPU(s) list: 0,1
...

[root@rocky01 ~]# cat /proc/cpuinfo
processor   : 0
vendor_id   : AuthenticAMD
cpu family  : 23
model       : 96
model name  : AMD Ryzen 5 4600H with Radeon Graphics
...

</code></pre>
<h3>(2)查看内存</h3>
<pre><code>[root@rocky01 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:          1.7Gi       275Mi       873Mi       8.0Mi       636Mi       1.3Gi
Swap:         2.0Gi        40Mi       2.0Gi

[root@rocky01 ~]# cat /proc/meminfo
MemTotal:        1828236 kB
MemFree:          894484 kB
MemAvailable:    1350024 kB
Buffers:            4800 kB
Cached:           505376 kB
...

</code></pre>
<h3>(3)查看硬盘和分区情况</h3>
<pre><code>[root@rocky01 ~]# lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda           8:0    0  200G  0 disk
├─sda1        8:1    0    1G  0 part /boot
└─sda2        8:2    0  199G  0 part
  ├─rl-root 253:0    0   70G  0 lvm  /
  ├─rl-swap 253:1    0    2G  0 lvm  [SWAP]
  └─rl-home 253:2    0  127G  0 lvm  /home
sr0          11:0    1 1024M  0 rom

[root@rocky01 ~]# cat /proc/partitions
major minor  #blocks  name

   8        0  209715200 sda
   8        1    1048576 sda1
   8        2  208665600 sda2
  11        0    1048575 sr0
 253        0   73400320 dm-0
 253        1    2125824 dm-1
 253        2  133136384 dm-2
</code></pre>
<h3>(4)查看系统架构</h3>
<pre><code>[root@rocky01 ~]# arch
x86_64
</code></pre>
<h3>(5)查看内核版本</h3>
<pre><code>[root@rocky01 ~]# uname -r
4.18.0-372.9.1.el8.x86_64
</code></pre>
<h3>(6)查看操作系统发行版本</h3>
<p>Centos8、Rocky8</p>
<pre><code>[root@rocky01 ~]# cat /etc/os-release
NAME="Rocky Linux"
VERSION="8.6 (Green Obsidian)"
ID="rocky"
ID_LIKE="rhel centos fedora"
VERSION_ID="8.6"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Rocky Linux 8.6 (Green Obsidian)"
ANSI_COLOR="0;32"
CPE_NAME="cpe:/o:rocky:rocky:8:GA"
HOME_URL="https://rockylinux.org/"
BUG_REPORT_URL="https://bugs.rockylinux.org/"
ROCKY_SUPPORT_PRODUCT="Rocky Linux"
ROCKY_SUPPORT_PRODUCT_VERSION="8"
REDHAT_SUPPORT_PRODUCT="Rocky Linux"
REDHAT_SUPPORT_PRODUCT_VERSION="8"
</code></pre>
<p>Ubuntu</p>
<pre><code>[root@ubuntu2004 ~]#cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.4 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.4 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

[root@ubuntu2004 ~]#cat /etc/issue
Ubuntu 20.04.4 LTS \n \l
</code></pre>
<h2>7.日期和时间</h2>
<h3>date</h3>
<pre><code>[root@rocky01 ~]# date +"%F %T "
2022-07-12 14:11:02
[root@rocky01 ~]# echo  +"%F %T "
2022-07-12 14:11:13
</code></pre>
<h3>cal</h3>
<pre><code>[root@rocky01 ~]# cal
      July 2022
Su Mo Tu We Th Fr Sa
                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 26 27 28 29 30
31
</code></pre>
<h3>修改时区</h3>
<pre><code>[root@ubuntu2004 ~]# timedatectl set-timezone Asia/Shanghai
</code></pre>
<h2>8.欢迎信息提示issue、motd文件</h2>
<blockquote>
<p>/etc/issuc 登录之前显示
/etc/motd 登录之后显示</p>
</blockquote>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220727020051640-781834674.png" /></p>
<h2>9.echo基本用法</h2>
<blockquote>
<p>常用选项:</p>
</blockquote>
<ul>
<li><strong>-E (默认)不支持 \ 解释功能</strong></li>
<li><strong>-n 不自动换行</strong></li>
<li>*<em>-e 启用 \ 字符的解释功能</em></li>
</ul>
<p>启用命令选项-e,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出</p>
<ul>
<li>\a 发出警告声</li>
<li>\b 退格键</li>
<li>\c 最后不加上换行符号</li>
<li>\e escape,相当于\033</li>
<li>\n 换行</li>
</ul>
<p>显示颜色:</p>
<p><code>"\033[字符背景颜色;字体颜色m字符串\033[0m"</code></p>
<p><code>"\e[字符背景颜色;字体颜色m字符串\e[0m"</code></p>
<p><img alt="Linux(入门篇)" src="https://johngo-pic.oss-cn-beijing.aliyuncs.com/articles/20230526/2927659-20220727021002146-1896115330.png" /></p>
<p>显示变量:</p>
<pre><code>[root@rocky01 ~]# a=1
[root@rocky01 ~]# echo "$a"    #用变量值替换,弱引用
1
[root@rocky01 ~]# echo '$a'    #变量不会替换,强引用
$a
</code></pre>
<h2>10.命令行扩展和被括起来的集合</h2>
<h3>(1)" " 、' ' 、<code></code> 三者区别</h3>
<pre><code>[root@rocky01 ~]# echo "echo $HOSTNAME"
echo rocky01
[root@rocky01 ~]# echo 'echo $HOSTNAME'
echo $HOSTNAME
[root@rocky01 ~]# echo  $HOSTNAME
rocky01
</code></pre>
<blockquote>
<h1>结论:</h1>
<p>单引号:强引号,六亲不认,变量和命令不认,被认为是普通字符串;<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>Single quotation marks: strong quotes, six relatives do not recognize, variables and commands are not recognized, are regarded as ordinary strings; 'the stupidest'</font></em></details>
双引号:弱引用,认不出命令,能识别变量;“半傻不好”<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>Double quotation marks: weak reference, can not recognize commands, can identify variables; "semi-silly is not good"</font></em></details>
反向单引号:里面的内容必须是能执行的命令并且有输出信息,变量和命令都识别,并且会将反向单引号的内容当成命令进行执行后,再交给调用反向单引号的命令继续;<code>最聪明</code></p>
</blockquote>
<h3>(2)括号扩展:{ }</h3>
<blockquote>
<p>{ } 可以实现打印重复字符串的简化形式</p>
</blockquote>
<pre><code>[root@rocky01 ~]# echo {1..3}
1 2 3

[root@rocky01 ~]# echo {a..c}
a b c

[root@rocky01 ~]# echo file{1..3}{a..c}
file1a file1b file1c file2a file2b file2c file3a file3b file3c
</code></pre>
<h2>11.history命令行历史</h2>
<blockquote>
<p>常用选项:</p>
</blockquote>
<ul>
<li>-c 清空命令历史</li>
<li>-d offset 删除历史中指定的第offset个命令</li>
<li>n 显示最近的n条历史(例:histtory 10)</li>
</ul>
<p>显示时间和用户:</p>
<pre><code>[root@rocky01 ~]# HISTTIMEFORMAT="%F %T  "

[root@rocky01 ~]# history |tail -n 3
  363  2022-07-27 02:29:18 root HISTTIMEFORMAT="%F %T  "
  364  2022-07-27 02:29:20 root history
  365  2022-07-27 02:29:49 root history |tail -n 3
</code></pre>
<h2>12.调用命令行历史</h2>
<blockquote></blockquote>
<ul>
<li><strong>!! 、Ctrl+P 重复上一个命令</strong></li>
<li><strong>!n 执行history命令输出对应序号n的命令
</strong></li>
<li><strong>!$ 表示前一个命令中最后一个参数</strong></li>
<li><strong>Alt + . 使用上一条命令的最后一个参数</strong></li>
<li>*<em>Esc + . 使用上一条命令的最后一个参数</em></li>
</ul>
<pre><code>[root@rocky01 ~]# cat /etc/motd
I am motd!

[root@rocky01 ~]# !!

cat /etc/motd
I am motd!

[root@rocky01 ~]# history |tail -n 2
  375  2022-07-27 02:33:14 root cat /etc/motd
  376  2022-07-27 02:33:43 root history |tail -n 2
[root@rocky01 ~]#
[root@rocky01 ~]# !375
cat /etc/motd
I am motd!

[root@rocky01 ~]# ll !$
ll /etc/motd
-rw-r--r--. 1 root root 11 Jul 27 01:58 /etc/motd
</code></pre>
<h2>13.bash的快捷键</h2>
<blockquote></blockquote>
<ul>
<li>Ctrl + l 清屏,相当于clear命令</li>
<li>Ctrl + o 执行当前命令,并重新显示本命令</li>
<li>Ctrl + s 阻止屏幕输出,锁定</li>
<li>Ctrl + q 允许屏幕输出,解锁</li>
<li>Ctrl + c 终止命令</li>
<li>Ctrl + z 挂起命令</li>
<li>Ctrl + a 光标移到命令行首,相当于Home</li>
<li>Ctrl + e 光标移到命令行尾,相当于End</li>
<li>Ctrl + d 删除光标处的一个字符</li>
<li>Ctrl + u 从光标处删除至命令行首</li>
<li>Ctrl + k 从光标处删除至命令行尾</li>
</ul>
<h2>14.whatis显示命令的简短描述</h2>
<blockquote>
<p>此工具在系统刚安装后,不可立即使用,需要制作数据库后才可使用
man -f 等同于 whatis</p>
</blockquote>
<pre><code>#CentOS 7 版本以后
[root@rocky01 ~]# mandb

#CentOS 6 版本之前
[root@centos6 ~]# makewhatis
</code></pre>
<pre><code>[root@rocky01 ~]# man 5 passwd
No manual entry for passwd in section 5     # 默认是没有提供配置文件的帮助信息的,必须安装man-pages这个包
[root@rocky01 ~]# yum install -y man-pages

[root@rocky01 ~]# whatis passwd
openssl-passwd (1ssl) - compute password hashes
passwd (1)           - update user's authentication tokens
passwd (5)           - password file

[root@rocky01 ~]# man -f passwd
openssl-passwd (1ssl) - compute password hashes
passwd (1)           - update user's authentication tokens
passwd (5)           - password file
</code></pre>
<h2>15.man提供命令帮助的文件</h2>
<blockquote>
<p>man 帮助段落说明
序号 名称 含义 1 NAME 名称及简要说明 2 SYNOPSIS 用法格式说明 3 DESCRIPTION 详细说明 4 AUTHOR 作者 5 REPORTING BUGS 报告的错误信息 6 COPYRIGHT 版本信息 7 SEE ALSO 其它帮助参考</p>
</blockquote>
<ul>
<li>< > 必选内容</li>
<li>[ ] 可选内容</li>
<li>... 同一内容可出现多次</li>
<li>{ } 分组</li>
</ul>
<h2>16.pwd显示当前工作目录</h2>
<blockquote>
<p>每个shell和系统进程都有一个当前的工作目录</p>
</blockquote>
<ul>
<li>-P 显示真实物理路径</li>
<li>-L 显示链接路径(默认)</li>
</ul>
<pre><code>[root@rocky01 ~]# ll /sbin
lrwxrwxrwx. 1 root root 8 Oct 11  2021 /sbin -> usr/sbin
[root@rocky01 ~]# cd /sbin
[root@rocky01 sbin]# pwd -P
/usr/sbin
[root@rocky01 sbin]# pwd
/sbin
</code></pre>
<h2>17.绝对和相对路径</h2>
<blockquote>
<p>绝对路径:以正斜杠/ 即根目录开始、完整的文件的位置路径、可用于任何想指定一个文件名的时候
相对路径:不以斜杠开头。一般来说,它指的是相对于当前工作目录的路径。在特殊情况下,它是相对于目录的,文件名可以指定为缩写形式。<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>Relative path: does not start with a slash. In general, it refers to the path relative to the current working directory. In special situations, it is relative to a directory, and a file name can be specified as a short form.</font></em></details></p>
</blockquote>
<h3>(1)basename</h3>
<p>基名称,仅文件名,而不是路径<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>Base name, only the file name, not the path</font></em></details></p>
<pre><code>[root@rocky01 sbin]# basename /etc/sysconfig/network-scripts/ifcfg-eth0
ifcfg-eth0
</code></pre>
<h3>(2)dirname</h3>
<p>目录名,只有路径,而不是文件名<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>Directory name, only the path, not the file name</font></em></details></p>
<pre><code>[root@rocky01 sbin]# dirname /etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts
</code></pre>
<h2>18.ls列出目录内容</h2>
<blockquote>
<p>常用选项:</p>
</blockquote>
<ul>
<li>-a 包含隐藏文件</li>
<li>-l 显示额外的信息</li>
<li>-R 目录递归</li>
<li>-ld 目录和符号链接信息</li>
<li>-i 打印每个文件的索引号</li>
<li>-1 文件分行显示</li>
<li>-S 按从大到小排序</li>
<li>-t 按mtime排序</li>
<li>-u 配合-t选项,显示并按atime从新到旧排序</li>
<li>-U 按目录存放顺序显示</li>
<li>-X 按文件后缀排序</li>
<li>-F 对不同类型文件显示时附加不同的符号:*/=>@|</li>
<li>-C 文件多时,以多列的方式显示文件,默认是一列(标准输出)</li>
</ul>
<blockquote>
<p>说明
ls 查看不同后缀文件时的颜色由 /etc/DIR_COLORS 和变量$LS_COLORS定义
ls -l 看到文件的大小,不一定是实际文件真正占用空间的大小</p>
</blockquote>
<h2>19.stat 查看文件状态</h2>
<blockquote>
<p>每个文件有三个时间戳:</p>
</blockquote>
<ul>
<li>Access time 访问时间,atime,读取文件内容</li>
<li>Modify time 修改时间,mtime,改变文件内容(数据)</li>
<li>Change time 改变时间,ctime,元数据发生改变</li>
</ul>
<pre><code>[root@rocky01 ~]#stat /etc/passwd
  File: /etc/passwd
  Size: 2504        Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d    Inode: 134924395   Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:passwd_file_t:s0
Access: 2022-07-19 18:12:04.427008996 +0800
Modify: 2022-07-12 07:39:20.510971037 +0800
Change: 2022-07-12 07:39:20.511971037 +0800
 Birth: 2022-07-12 07:39:20.510971037 +0800
</code></pre>
<h2>20.file检查文件的类型</h2>
<pre><code>[root@rocky01 ~]#file linux.txt
linux.txt: ASCII text

[root@rocky01 ~]#file win.txt
win.txt: ASCII text, with CRLF line terminators
</code></pre>
<p>修改文件类型:vim打开目标文件</p>
<pre><code>:set ff=unix
:set ff=dos
</code></pre>
<h2>21.常见通配符</h2>
<p>*</p>
<p>匹配零个或多个字符,但不匹配“。开头的文件,即隐藏文件<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>Match zero or more characters, but not "." The file at the beginning, that is, hidden file</font></em></details>
?</p>
<p>匹配任何单个字符,一个汉字也算一个字符</p>
<p>[0-9]</p>
<p>匹配数字范围</p>
<p>[a-z]</p>
<p>一个字母
[peng]</p>
<p>匹配列表中的任何字符<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>Match any character in the list</font></em></details>
[^peng]</p>
<p>匹配列表中除所有字符之外的其他字符<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>Matches characters other than all characters in the list</font></em></details></p>
<p>[:digit:]</p>
<p>任意数字,相当于0-9</p>
<p>[:lower:]</p>
<p>任意小写字母,表示 a-z</p>
<p>[:upper:]</p>
<p>任意大写字母,表示 A-Z</p>
<p><strong>范例: [ ] 和 { }</strong></p>
<pre><code>[root@rocky01 ~]# touch f{1..3}
[root@rocky01 ~]# ls
f1  f2  f3
[root@rocky01 ~]#
[root@rocky01 ~]# ls f{1..5}
ls: cannot access 'f4': No such file or directory
ls: cannot access 'f5': No such file or directory
f1  f2  f3
[root@rocky01 ~]#
[root@rocky01 ~]# ls f[1-5]
f1  f2  f3
</code></pre>
<h2>22.touch创建空文件和刷新时间</h2>
<blockquote>
<p>选项说明</p>
</blockquote>
<ul>
<li>-a 仅改变 atime和ctime</li>
<li>-m 仅改变 mtime和ctime</li>
<li>-t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的时间戳</li>
<li>-c 如果文件不存在,则不予创建</li>
</ul>
<h2>23.cp复制文件和目录</h2>
<blockquote>
<p>常用选项</p>
</blockquote>
<ul>
<li>-i 如果目标已存在,覆盖前提示是否覆盖</li>
<li>-n 不覆盖</li>
<li>-r,-R 递归复制目录及内部的所有内容</li>
<li>-b 目标存在,覆盖前先备份,默认形式为filename~,只保留最近一次的备份</li>
<li>-a 存档,常用于备份功能</li>
<li>-v 详细</li>
</ul>
<p>范例:</p>
<p>将/etc/目录下所有文件,备份到/data独立的子目录下,并要求子目录格式为 backupYYYY-mm-dd,备份过程可见,要求保留原有权限</p>
<pre><code>[root@rocky01 ~]# cp -av /etc/ /data/backup +%F
'/etc/' -> '/data/backup2022-07-27'
'/etc/dnf' -> '/data/backup2022-07-27/dnf'
'/etc/dnf/dnf.conf' -> '/data/backup2022-07-27/dnf/dnf.conf'
...省略...

</code></pre>
<h2>24.mv移动和重命名文件</h2>
<blockquote>
<p>常用选项</p>
</blockquote>
<ul>
<li>-i 交互式</li>
<li>-f 强制</li>
<li>-b 目标存在,覆盖前先备份</li>
<li>*<em>-t (mv -t dir file 表示将file移动到dir)</em></li>
</ul>
<h2>25.rm删除文件</h2>
<blockquote>
<p>常用选项:</p>
</blockquote>
<ul>
<li>-i 交互式</li>
<li>-f 强制删除</li>
<li>-r 递归</li>
<li>--no-preserve-root 删除/</li>
</ul>
<h3>防止文件被删除chattr</h3>
<p>-a 文件是否只能添加,修改,而不能删除</p>
<pre><code>chattr +a filename
</code></pre>
<h2>26.目录操作</h2>
<h3>(1)tree 显示目录数</h3>
<blockquote>
<p>常见选项:</p>
</blockquote>
<ul>
<li>-d: 只显示目录</li>
<li>-L level:指定显示的层级数目</li>
<li>-P pattern: 只显示由指定wild-card pattern匹配到的路径</li>
</ul>
<h3>(2)mkdir 创建目录</h3>
<blockquote>
<p>常见选项:</p>
</blockquote>
<ul>
<li>-p: 存在于不报错,且可自动创建所需的各目录</li>
<li>-v: 显示详细信息</li>
<li>-m MODE: 创建目录时直接指定权限</li>
</ul>
<h3>(3)rmdir 删除空目录</h3>
<blockquote>
<p>常见选项:</p>
</blockquote>
<ul>
<li>-p 递归删除父空目录</li>
<li>-v 显示详细信息</li>
</ul>
<p>注意:rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树</p>
<h2>27.IO重定向</h2>
<p>Linux给程序提供三种 I/O 设备</p>
<p>文件描述符 设备文件名 设备描述 <strong>0</strong> stdin 标准输入 <strong>1</strong> stdout 标准输出 <strong>2</strong> stderr 标准错误输出</p>
<p>操作符号 描述
<strong>1> 或 ></strong></p>
<p>把STDOUT重定向到文件
<strong>2></strong></p>
<p>把STDERR重定向到文件
<strong>&></strong></p>
<p>重定向标准输出和错误<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>Redirect both standard output and errors</font></em></details>
<strong>>></strong></p>
<p>将标准输出重定向附加到文件<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>Append standard output redirect to file</font></em></details>
<strong>2>></strong></p>
<p>将标准错误重定向附加到文件<details><summary><em><font color='gray'>[En]</font></em></summary><em><font color='gray'>Append standard error redirect to file</font></em></details></p>
<p>范例:</p>
<p><strong>(1)清除大文件</strong></p>
<pre><code>[root@rocky01 data]# cat /dev/null > /data/big.log
</code></pre>
<p><strong>(2)将标准输出和错误都重定向到同一个文件</strong></p>
<pre><code>方法一:
[root@rocky01 ~]# ls /data /xxx > /data/all.log 2>&1
方法二:
[root@rocky01 ~]# ls /data /xxx 2> /data/all.log 1>&2
方法三:
[root@rocky01 ~]# ls /data/ /xxx &> /data/all.log

[root@rocky01 ~]# cat /data/all.log
ls: cannot access '/xxx': No such file or directory
/data/:
all.log
test.txt
</code></pre>
<h2>28.高级重定向</h2>
<h3>(1)cmd <<< "string"</h3>
<blockquote>
<h1>cmd <<< 'string' 将string的内容作为cmd的输入 (注:只能字符串)</h1>
</blockquote>
<pre><code>[root@rocky01 ~]# bc <<< -s+ 10 55< code></>

(2)cmd1 <

cmd1 <

[root@rocky01 ~]# bc < <(seq 1 14 55 63 64 -s+ 10) #查看是否会生成临时文件 [root@rocky01 ~]# ll <(seq lr-x------. root jul 19:55 dev fd -> 'pipe:[300474]'</(seq>

29.tr 转换和删除字符

常用选项:

  • -d 删除所有属于第一个字符集的字符
  • -s 把连续重复的字符以单独一个字符表示,即去重
  • -t 将第一个字符集对应字符转化为第二字符集对应的字符

范例:

[root@rocky01 ~]# echo 12345 |tr -d 25
134

[root@rocky01 ~]# echo aaabbbccccdffgg |tr -s abcf
abcdfgg

[root@rocky01 ~]# echo abcdef |tr 'a-z' 'A-Z'
ABCDEF

30.用户和组管理命令

用户管理命令

  • useradd
  • usermod
  • userdel

组帐号维护命令

  • groupadd
  • groupmod
  • groupdel

(1)useradd 创建新的用户

常用选项

  • -u UID
  • -o 配合-u 选项,不检查UID的唯一性
  • -g GID 指明用户所属基本组,可为组名,也可以GID
  • -c “COMMENT” 用户的注释信息
  • -d HOME_DIR 以指定的路径(不存在)为家目录
  • -s SHELL 指明用户的默认shell程序,可用列表在/etc/shells文件中
  • -G GROUP1[,GROUP2,…] 为用户指明附加组,组须事先存在
  • -N 不创建私用组做主组,使用users组做主组
  • -r 创建系统用户 CentOS 6之前: ID

useradd 命令默认值设定由/etc/default/useradd定义

[root@rocky01 ~]# cat /etc/default/useradd
useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

(2)usermod 修改用户属性

(3)userdel 删除用户

常见选项

  • -f, –force 强制
  • -r, –remove 删除用户家目录和邮箱

(4)id 查看用户的UID,GID等信息

(5)su: 切换用户身份,并且以指定用户的身份执行命令

切换用户的方式:
su UserName:非登录式切换,即不会读取目标用户的配置文件,不改变当前工作目录,即不完全切换
su – UserName:登录式切换,会读取目标用户的配置文件,切换至自已的家目录,即完全切换
说明:root su至其他用户无须密码;非root用户切换时需要密码
注意:su 切换新用户后,使用 exit 退回至旧的用户身份,而不要再用 su 切换至旧用户,否则会生成很多的bash子进程,环境可能会混乱。

[root@rocky01 ~]# su rye
[rye@rocky01 root]$ exit
exit
[root@rocky01 ~]#

(6)passwd 修改用户密码

(7)chage 修改用户密码策略

(8)groupadd 创建组

(9)groupmod 组属性修改

(10)groupdel 删除组

(11)补充:/etc/passwd文件解读

#&#x6587;&#x4EF6;&#x5185;&#x5BB9;
[root@rocky01 ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...&#x7701;&#x7565;...

Willoneday:x:1001:1001::/home/Willoneday:/bin/bash
nginx:x:994:992:Nginx web server:/var/lib/nginx:/sbin/nologin

#&#x89E3;&#x8BFB;
&#x6BCF;&#x884C;&#x7528;&#x6237;&#x4FE1;&#x606F;&#x90FD;&#x4EE5; "&#xFF1A;" &#x4F5C;&#x4E3A;&#x5206;&#x9694;&#x7B26;&#xFF0C;&#x5212;&#x5206;&#x4E3A; 7 &#x4E2A;&#x5B57;&#x6BB5;&#xFF0C;&#x6BCF;&#x4E2A;&#x5B57;&#x6BB5;&#x6240;&#x8868;&#x793A;&#x7684;&#x542B;&#x4E49;&#x5982;&#x4E0B;&#xFF1A;
&#x7528;&#x6237;&#x540D;&#xFF1A;&#x5BC6;&#x7801;&#xFF1A;UID&#xFF08;&#x7528;&#x6237;ID&#xFF09;&#xFF1A;GID&#xFF08;&#x7EC4;ID&#xFF09;&#xFF1A;&#x63CF;&#x8FF0;&#x6027;&#x4FE1;&#x606F;&#xFF1A;&#x4E3B;&#x76EE;&#x5F55;&#xFF1A;&#x9ED8;&#x8BA4;Shell

#&#x5BC6;&#x7801;
"x" &#x8868;&#x793A;&#x6B64;&#x7528;&#x6237;&#x8BBE;&#x6709;&#x5BC6;&#x7801;&#xFF0C;&#x4F46;&#x4E0D;&#x662F;&#x771F;&#x6B63;&#x7684;&#x5BC6;&#x7801;&#xFF0C;&#x771F;&#x6B63;&#x7684;&#x5BC6;&#x7801;&#x4FDD;&#x5B58;&#x5728; /etc/shadow &#x6587;&#x4EF6;&#x4E2D;

(12) 补充:/etc/shadow文件解读

[root@rocky01 ~]# cat /etc/shadow
root:$6$K.SYYULWCxfswVvK$UOMarkx3VoVPigR5FVSkSTm5g9fS8vPW2RMDn.D7Uh9fmQv6HxKukzBq3uDgBjPpTa7/Q2/60CzDcf83rxUqz1::0:99999:7:::
bin:*:18700:0:99999:7:::
...&#x7701;&#x7565;...

Willoneday:!!:19211:0:99999:7:::
nginx:!!:19211::::::

#&#x89E3;&#x8BFB;
&#x6BCF;&#x884C;&#x7528;&#x6237;&#x4FE1;&#x606F;&#x90FD;&#x4EE5; "&#xFF1A;" &#x4F5C;&#x4E3A;&#x5206;&#x9694;&#x7B26;&#xFF0C;&#x5212;&#x5206;&#x4E3A; 9 &#x4E2A;&#x5B57;&#x6BB5;&#xFF0C;&#x6BCF;&#x4E2A;&#x5B57;&#x6BB5;&#x6240;&#x8868;&#x793A;&#x7684;&#x542B;&#x4E49;&#x5982;&#x4E0B;&#xFF1A;
###&#x7528;&#x6237;&#x540D;&#xFF1A;&#x52A0;&#x5BC6;&#x5BC6;&#x7801;&#xFF1A;&#x6700;&#x540E;&#x4E00;&#x6B21;&#x4FEE;&#x6539;&#x65F6;&#x95F4;&#xFF1A;&#x6700;&#x5C0F;&#x4FEE;&#x6539;&#x65F6;&#x95F4;&#x95F4;&#x9694;&#xFF1A;&#x5BC6;&#x7801;&#x6709;&#x6548;&#x671F;&#xFF1A;&#x5BC6;&#x7801;&#x9700;&#x8981;&#x53D8;&#x66F4;&#x524D;&#x7684;&#x8B66;&#x544A;&#x5929;&#x6570;&#xFF1A;&#x5BC6;&#x7801;&#x8FC7;&#x671F;&#x540E;&#x7684;&#x5BBD;&#x9650;&#x65F6;&#x95F4;&#xFF1A;&#x8D26;&#x53F7;&#x5931;&#x6548;&#x65F6;&#x95F4;&#xFF1A;&#x4FDD;&#x7559;&#x5B57;&#x6BB5;###

#&#x52A0;&#x5BC6;&#x5BC6;&#x7801;
&#x8FD9;&#x91CC;&#x4FDD;&#x5B58;&#x7684;&#x662F;&#x771F;&#x6B63;&#x52A0;&#x5BC6;&#x7684;&#x5BC6;&#x7801;&#x3002;&#x76EE;&#x524D; Linux &#x7684;&#x5BC6;&#x7801;&#x91C7;&#x7528;&#x7684;&#x662F; SHA512 &#x6563;&#x5217;&#x52A0;&#x5BC6;&#x7B97;&#x6CD5;&#xFF0C;&#x539F;&#x6765;&#x91C7;&#x7528;&#x7684;&#x662F; MD5 &#x6216; DES &#x52A0;&#x5BC6;&#x7B97;&#x6CD5;&#x3002;
&#x6CE8;&#x610F;&#xFF0C;&#x8FD9;&#x4E32;&#x5BC6;&#x7801;&#x4EA7;&#x751F;&#x7684;&#x4E71;&#x7801;&#x4E0D;&#x80FD;&#x624B;&#x5DE5;&#x4FEE;&#x6539;&#xFF0C;&#x5982;&#x679C;&#x624B;&#x5DE5;&#x4FEE;&#x6539;&#xFF0C;&#x7CFB;&#x7EDF;&#x5C06;&#x65E0;&#x6CD5;&#x8BC6;&#x522B;&#x5BC6;&#x7801;&#xFF0C;&#x5BFC;&#x81F4;&#x5BC6;&#x7801;&#x5931;&#x6548;&#x3002;
&#x5F88;&#x591A;&#x8F6F;&#x4EF6;&#x900F;&#x8FC7;&#x8FD9;&#x4E2A;&#x529F;&#x80FD;&#xFF0C;&#x5728;&#x5BC6;&#x7801;&#x4E32;&#x524D;&#x52A0;&#x4E0A; "!"&#x3001;"*" &#x6216; "x" &#x4F7F;&#x5BC6;&#x7801;&#x6682;&#x65F6;&#x5931;&#x6548;&#x3002;
&#x6240;&#x6709;&#x4F2A;&#x7528;&#x6237;&#x7684;&#x5BC6;&#x7801;&#x90FD;&#x662F; "!!" &#x6216; "*"&#xFF0C;&#x4EE3;&#x8868;&#x6CA1;&#x6709;&#x5BC6;&#x7801;&#x662F;&#x4E0D;&#x80FD;&#x767B;&#x5F55;&#x7684;&#x3002;
&#x5F53;&#x7136;&#xFF0C;&#x65B0;&#x521B;&#x5EFA;&#x7684;&#x7528;&#x6237;&#x5982;&#x679C;&#x4E0D;&#x8BBE;&#x5B9A;&#x5BC6;&#x7801;&#xFF0C;&#x90A3;&#x4E48;&#x5B83;&#x7684;&#x5BC6;&#x7801;&#x9879;&#x4E5F;&#x662F; "!!"&#xFF0C;&#x4EE3;&#x8868;&#x8FD9;&#x4E2A;&#x7528;&#x6237;&#x6CA1;&#x6709;&#x5BC6;&#x7801;&#xFF0C;&#x4E0D;&#x80FD;&#x767B;&#x5F55;&#x3002;

#&#x6700;&#x540E;&#x4E00;&#x6B21;&#x4FEE;&#x6539;&#x65F6;&#x95F4;
Linux &#x8BA1;&#x7B97;&#x65E5;&#x671F;&#x7684;&#x65F6;&#x95F4;&#x662F;&#x4EE5;  1970 &#x5E74; 1 &#x6708; 1 &#x65E5;&#x4F5C;&#x4E3A; 1 &#x4E0D;&#x65AD;&#x7D2F;&#x52A0;&#x5F97;&#x5230;&#x7684;&#x65F6;&#x95F4;&#xFF0C;&#x5230; 1971 &#x5E74; 1 &#x6708; 1 &#x65E5;&#xFF0C;&#x5219;&#x4E3A; 366 &#x5929;&#x3002;
&#x8FD9;&#x91CC;&#x663E;&#x793A; 19211 &#x5929;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x6B64; Willoneday &#x8D26;&#x53F7;&#x5728; 1970 &#x5E74; 1 &#x6708; 1 &#x65E5;&#x4E4B;&#x540E;&#x7684;&#x7B2C; 19211 &#x5929;&#x4FEE;&#x6539;&#x7684; root &#x7528;&#x6237;&#x5BC6;&#x7801;&#x3002;

#&#x6700;&#x5C0F;&#x4FEE;&#x6539;&#x65F6;&#x95F4;&#x95F4;&#x9694;
&#x6700;&#x5C0F;&#x4FEE;&#x6539;&#x95F4;&#x9694;&#x65F6;&#x95F4;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x8BE5;&#x5B57;&#x6BB5;&#x89C4;&#x5B9A;&#x4E86;&#x4ECE;&#x7B2C; 3 &#x5B57;&#x6BB5;&#xFF08;&#x6700;&#x540E;&#x4E00;&#x6B21;&#x4FEE;&#x6539;&#x5BC6;&#x7801;&#x7684;&#x65E5;&#x671F;&#xFF09;&#x8D77;&#xFF0C;&#x591A;&#x957F;&#x65F6;&#x95F4;&#x4E4B;&#x5185;&#x4E0D;&#x80FD;&#x4FEE;&#x6539;&#x5BC6;&#x7801;&#x3002;
&#x5982;&#x679C;&#x662F; 0&#xFF0C;&#x5219;&#x5BC6;&#x7801;&#x53EF;&#x4EE5;&#x968F;&#x65F6;&#x4FEE;&#x6539;&#xFF1B;&#x5982;&#x679C;&#x662F; 10&#xFF0C;&#x5219;&#x4EE3;&#x8868;&#x5BC6;&#x7801;&#x4FEE;&#x6539;&#x540E; 10 &#x5929;&#x4E4B;&#x5185;&#x4E0D;&#x80FD;&#x518D;&#x6B21;&#x4FEE;&#x6539;&#x5BC6;&#x7801;&#x3002;

#&#x4FDD;&#x7559;&#x5B57;&#x6BB5;
&#x8FD9;&#x4E2A;&#x5B57;&#x6BB5;&#x76EE;&#x524D;&#x6CA1;&#x6709;&#x4F7F;&#x7528;&#xFF0C;&#x7B49;&#x5F85;&#x65B0;&#x529F;&#x80FD;&#x7684;&#x52A0;&#x5165;&#x3002;

31.文件权限管理

(1)chown 设置文件的所有者

chown 命令可以修改文件的属主,也可以修改文件属组

[root@rocky01 ~]# ll 1.txt
-rw-r--r--. 1 root root 0 Jul 27 16:20 1.txt

[root@rocky01 ~]# chown rye:rye 1.txt
[root@rocky01 ~]# ll 1.txt
-rw-r--r--. 1 rye rye 0 Jul 27 16:20 1.txt

(2)chgrp 设置文件的属组信息

chgrp 命令可以只修改文件的属组

[root@rocky01 ~]# ll
total 0
-rw-r--r--. 1 rye rye 0 Jul 27 16:20 1.txt
[root@rocky01 ~]# chgrp root 1.txt
[root@rocky01 ~]# ll
total 0
-rw-r--r--. 1 rye root 0 Jul 27 16:20 1.txt

#&#x6D4B;&#x8BD5;&#x80FD;&#x5426;&#x6539;&#x5C5E;&#x4E3B;
[root@rocky01 ~]# chgrp root:root 1.txt
chgrp: invalid group: &#x2018;root:root&#x2019;
&#x7ED3;&#x8BBA;&#xFF1A;chgrp &#x547D;&#x4EE4;&#x53EF;&#x4EE5;&#x53EA;&#x4FEE;&#x6539;&#x6587;&#x4EF6;&#x7684;&#x5C5E;&#x7EC4;

(3)chmod 修改文件权限

Linux(入门篇)

32.umask

umask的值可以用来保留在创建文件权限

实现方式:

  • 新建文件的默认权限: 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数不变
  • 新建目录的默认权限: 777-umask

非特权用户umask默认值是 002
root的umask 默认值是 022

范例:

临时性修改文件权限为000:

&#x65B9;&#x6CD5;&#x4E00;&#xFF1A;
[root@rocky01 ~]#touch a.txt; chmod 000 a.txt
[root@rocky01 ~]#ll a.txt

&#x65B9;&#x6CD5;&#x4E09;&#xFF1A;
[root@rocky01 ~]#(umask 777; touch a.txt)
[root@rocky01 ~]#ll a.txt
> 4 5 6
> d e f

(5)vimfidd 比较文件的区别

相当于vim -d

Linux(入门篇)

43.正则表达式

由一类特殊字符和文本字符编写的模式,其中一些字符(元字符)不代表字符的字面含义,但控制或通配符函数类似于增强的通配符函数,但与通配符不同,通配符函数用于处理文件名,而正则表达式处理文本内容中的字符。

[En]

A pattern written by a class of special characters and text characters, some of which (metacharacters) do not represent the literal meaning of the characters, but the control or wildcard function is similar to the enhanced wildcard function, but unlike wildcards, the wildcard function is used to process file names, while regular expressions deal with characters in text content.

正则表达式分两类:
基本正则表达式:BRE Basic Regular Expressions
扩展正则表达式:ERE Extended Regular Expressions

(1)基本正则表达式

(1.1)字符匹配

  • . 匹配任意单个字符(除了\n),可以是一个汉字或其它国家的文字
  • [ ] 匹配指定范围内的任意单个字符,示例:[peng] [0-9] [a-z] [a-zA-Z]
  • [^] 匹配指定范围外的任意单个字符,示例:[^peng]
  • [:alnum:] 字母和数字
  • [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
  • [:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
  • [:upper:] 大写字母
  • [:blank:] 空白字符(空格和制表符)

(1.2)匹配次数

在要指定的字符数之后使用,以指定前面的字符将出现的次数

[En]

Used after the number of characters to be specified, to specify the number of times the preceding character will appear

    • 匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配

  • .* #任意长度的任意字符
  • \? #匹配其前面的字符出现0次或1次,即:可有可无
  • + #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
  • {n} #匹配前面的字符n次
  • {m,n} #匹配前面的字符至少m次,至多n次
  • {,n} #匹配前面的字符至多n次,
  • {n,} #匹配前面的字符至少n次

(1.3)位置锚定

位置锚定可用于定位它出现的位置。

[En]

Position anchoring can be used to locate the location where it appears.

  • ^ #行首锚定, 用于模式的最左侧
  • $ #行尾锚定,用于模式的最右侧
  • ^PATTERN$ #用于模式匹配整行
  • ^$ #空行
  • ^[[:space:]]*$ #空白行
  • \< 或 \b #词首锚定,用于单词模式的左侧
  • > 或 \b #词尾锚定,用于单词模式的右侧
  • \

注意: 单词是由字母,数字,下划线组成

范例:排除掉空行和#开头的行 '^[^#]'

[root@rocky01 ~]# grep '^[^#]' /etc/fstab
/dev/mapper/rl-root     /                       xfs     defaults        0 0
UUID=e52d90cb-d346-4305-9c4b-87bd670d4f4c /boot                   xfs     defaults        0 0
/dev/mapper/rl-home     /home                   xfs     defaults        0 0
/dev/sr0               /media                   iso9660 defaults        0 0

(1.4)分组 ( )

分组:( ) 将多个字符捆绑在一起,当作一个整体处理

后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, …

\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
注意: \0 表示正则表达式匹配的所有字符

(1.5)或者 |

  • a\|b #a或b
  • C\|cat #C或cat
  • (C\|c)at #Cat或cat

(2)扩展正则表达式

(2.1)字符匹配

  • . 任意单个字符
  • [peng] 指定范围的字符
  • [^peng] 不在指定范围的字符
  • [:alnum:] 字母和数字
  • [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
  • [:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
  • [:upper:] 大写字母

(2.2)次数匹配

    • 匹配前面字符任意次
  • ? 0或1次
    • 1次或多次
  • {n} 匹配n次
  • {m,n} 至少m,至多n次

(2.3)位置锚定

  • ^ 行首
  • $ 行尾
  • \

(2.4)分组、或者

( ) 分组
后向引用:\1, \2, … 注意: \0 表示正则表达式匹配的所有字符

| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat

44.文本处理三剑客

(1)grep

作用:文本搜索工具,根据用户指定的”模式”对目标文本逐行进行匹配检查;打印匹配到的行
模式:由正则表达式字符和文本字符编写的过滤条件

[En]

Patterns: filtering conditions written by regular expression characters and text characters

常见选项

  • –color=auto 对匹配到的文本着色显示
  • -m # 匹配#次后停止
  • -v 显示不被pattern匹配到的行,即取反
  • -i 忽略字符大小写
  • -n 显示匹配的行号
  • -c 统计匹配的行数
  • -o 仅显示匹配到的字符串
  • -q 静默模式,不输出任何信息
  • -e 实现多个选项间的逻辑or关系
  • -w 匹配整个单词
  • -E 使用ERE,相当于egrep
  • -F 不支持正则表达式,相当于fgrep
  • -P 支持Perl格式的正则表达式
  • -f file 根据模式文件处理
  • -r 递归目录,但不处理软链接
  • -R 递归目录,但处理软链接

(2)sed

sed 即 Stream EDitor,和 vi 不同,sed是行编辑器
Sed是从文件或管道中读取一行,处理一行,输出一行;再读取一行,再处理一行,再输出一行,直到最后一行。每当处理一行时,把当前处理的行存储在临时缓冲区中,称为模式空间(Pattern Space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。一次处理一行的设计模式使得sed性能很高,sed在读取大文件时不会出现卡顿的现象。如果使用vi命令打开几十M上百M的文件,明显会出现有卡顿的现象,这是因为vi命令打开文件是一次性将文件加载到内存,然后再打开。Sed就避免了这种情况,一行一行的处理,打开速度非常快,执行速度也很快

常用选项:

  • -n 不输出模式空间内容到屏幕,即不自动打印
  • -e 多点编辑
  • -f FILE 从指定文件中读取编辑脚本
  • -r, -E 使用扩展正则表达式
  • -i.bak 备份文件并原处编辑
  • -s 将多个文件视为独立文件,而不是单个连续的长文件流

说明:

  • -ir 不支持
  • -i -r 支持
  • -ri 支持
  • -ni 危险选项,会清空文件

查找替代:

  • s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s###
  • 替换修饰符:

*
– g 行内全局替换
– p 显示替换成功的行
– w /PATH/FILE 将替换成功的行保存至文件中
– I,i 忽略大小写

(3)awk

awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出,GNU/Linux发布的AWK目前由自由软件基金会(FSF)进行开发和维护,通常也称它为 GNU AWK

格式:

awk [options] 'program' var=value file&#x2026;
awk [options] -f programfile var=value file&#x2026;

说明:
program通常是被放在单引号中,并可以由三种部分组成

  • BEGIN语句块
  • 模式匹配的通用语句块
  • END语句块

常见选项:

  • -F “分隔符” 指明输入时用到的字段分隔符,默认的分隔符是若干个连续空白符
  • *-v var=value 变量赋值
    Program格式:

  • pattern{action statements;..}

  • pattern:决定动作语句何时触发及触发事件,比如:BEGIN,END,正则表达式等
  • action statements:对数据进行处理,放在{}内指明,常见:print, printf

分割符、域和记录

  • 由分隔符分隔的字段(列column,域fifield)标记 $1,$2…$n称为域标识,$0为所有域,注意:和shell中变量$符含义不同
  • 文件的每一行称为记录record
  • 如果省略action,则默认执行 print $0 的操作

范例:取出网站访问量最大的前3个IP

[root@Willoneday ~]# awk '{print $1}' nginx.access.log-20220728 |sort |uniq -c |sort -nr |head -3
 &#xA0; 5498 122.51.38.20
 &#xA0; 2161 117.157.173.214
 &#xA0;  953 211.159.177.120

范例:取出分区利用率

#&#x65B9;&#x6CD5;&#x4E00;
[root@rocky01 ~]# df | awk -F " +|%" '{print $5}'
Use
0
0
1
0
4
21
1
0

#&#x65B9;&#x6CD5;&#x4E8C;&#xFF1A;&#x4F7F;&#x7528;&#x6B63;&#x5219;&#x8868;&#x8FBE;&#x5F0F;
[root@rocky01 ~]# df | awk -F "[ %]+" '{print $5}'
Use
0
0
1
0
4
21
1
0

范例:取nginx的访问日志的中IP和时间

[root@rocky01 ~]# awk -F '[[ ]' '{print $1,$5}'
/apps/nginx/logs/nginx.access.log|head -3
58.87.87.99 09/Jun/2020:03:42:43
128.14.209.154 09/Jun/2020:03:42:43
64.90.40.100 09/Jun/2020:03:43:11

范例:取IP地址

#&#x65B9;&#x6CD5;&#x4E00;
[root@rocky01 ~]# hostname -I |cat -A
10.0.0.128 $
[root@rocky01 ~]# hostname -I |awk '{print $1}' |cat -A
10.0.0.128$

#&#x65B9;&#x6CD5;&#x4E8C;
[root@rocky01 ~]# ifconfig eth0 |sed -n '2p' |awk '{print $2}' |cat -A
10.0.0.128$

面试题:文件test.txt 如下格式,请提取”.baidu.com”前面的主机名部分并写入到回到该文件中

#&#x683C;&#x5F0F;&#x5982;&#x4E0B;
[root@rocky01 ~]# cat test.txt
1 www.baidu.com
2 sss.baidu.com
3 fsd.baidu.com
4 341.baidu.com
5 oga.baidu.com

#&#x64CD;&#x4F5C;
[root@rocky01 ~]# awk -F "[ .]" '{print $2}' test.txt >> test.txt
[root@rocky01 ~]# cat test.txt
1 www.baidu.com
2 sss.baidu.com
3 fsd.baidu.com
4 341.baidu.com
5 oga.baidu.com
www
sss
fsd
341
oga

(3.1)awk 变量

awk中的变量分为:内置和自定义变量

(3.1.1)常见的内置变量

FS:输入字段分隔符,默认为空白字符,功能相当于 -F。-F 和 FS变量功能一样,同时使用会 -F 优先级高
OFS:输出字段分隔符,默认为空白字符
RS:输入记录record分隔符,指定输入时的换行符
ORS:输出记录分隔符,输出时用指定符号代替换行符
NF:统计字段数量
NR:记录的编号
FNR:各文件分别计数,记录的编号
FILENAME:当前文件名

范例:用法
#FS&#xFF1A;&#x8F93;&#x5165;&#x5B57;&#x6BB5;&#x5206;&#x9694;&#x7B26;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;&#x7A7A;&#x767D;&#x5B57;&#x7B26;,&#x529F;&#x80FD;&#x76F8;&#x5F53;&#x4E8E; -F
[root@rocky01 ~]# awk -v FS=":" '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2

[root@rocky01 ~]# awk -v FS=":" '{print $1FS$3}' /etc/passwd
root:0
bin:1
daemon:2

#OFS&#xFF1A;&#x8F93;&#x51FA;&#x5B57;&#x6BB5;&#x5206;&#x9694;&#x7B26;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;&#x7A7A;&#x767D;&#x5B57;&#x7B26;
[root@rocky01 ~]# awk -v FS=":" -v OFS=":" '{print $1,$3,$7}'  /etc/passwd|head -n3
root:0:/bin/bash
bin:1:/sbin/nologin
daemon:2:/sbin/nologin

#RS&#xFF1A;&#x8F93;&#x5165;&#x8BB0;&#x5F55;record&#x5206;&#x9694;&#x7B26;&#xFF0C;&#x6307;&#x5B9A;&#x8F93;&#x5165;&#x65F6;&#x7684;&#x6362;&#x884C;&#x7B26;
[root@rocky01 ~]# cat test.txt
1 2 3;a b c;A B C
[root@rocky01 ~]# awk -v RS=";" '{print $1}' test.txt
1
a
A

#ORS&#xFF1A;&#x8F93;&#x51FA;&#x8BB0;&#x5F55;&#x5206;&#x9694;&#x7B26;&#xFF0C;&#x8F93;&#x51FA;&#x65F6;&#x7528;&#x6307;&#x5B9A;&#x7B26;&#x53F7;&#x4EE3;&#x66FF;&#x6362;&#x884C;&#x7B26;
[root@rocky01 ~]# awk -v RS=";" -v ORS="***" '{print $1}' test.txt
1***a***A***

#NF&#xFF1A;&#x7EDF;&#x8BA1;&#x5B57;&#x6BB5;&#x6570;&#x91CF;
[root@rocky01 ~]# cat /etc/issue
\S
Kernel \r on an \m

[root@rocky01 ~]# awk '{print NF}' /etc/issue
1
5
0

#NR&#xFF1A;&#x8BB0;&#x5F55;&#x7684;&#x7F16;&#x53F7;
[root@rocky01 ~]# awk '{print NR,$0}' /etc/issue /etc/hosts
1 \S
2 Kernel \r on an \m
3
4 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
5 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

#FNR&#xFF1A;&#x5404;&#x6587;&#x4EF6;&#x5206;&#x522B;&#x8BA1;&#x6570;&#xFF0C;&#x8BB0;&#x5F55;&#x7684;&#x7F16;&#x53F7;
[root@rocky01 ~]# awk '{print FNR,$0}' /etc/issue /etc/hosts
1 \S
2 Kernel \r on an \m
3
1 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
2 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

#FILENAME&#xFF1A;&#x5F53;&#x524D;&#x6587;&#x4EF6;&#x540D;
[root@rocky01 ~]# awk '{print FNR,FILENAME}' /etc/issue /etc/hosts
1 /etc/issue
2 /etc/issue
3 /etc/issue
1 /etc/hosts
2 /etc/hosts
(3.1.2)自定义变量

自定义变量是区分字符大小写的,使用下面方式进行赋值

  • -v var=value
  • 在program中直接定义
范例
[root@rocky01 ~]# awk -v name="Willoneday" 'BEGIN{print name}'
Willoneday

[root@rocky01 ~]# awk -v name="Willoneday" 'BEGIN{print name;name="Dream";print name}'
Willoneday
Dream

(3.2)动作 printf

printf 可以实现格式化输出

格式: printf &#x201C;FORMAT&#x201D;, item1, item2, ...

说明:

  • 必须指定FORMAT
  • 不会自动换行,需要显式给出换行控制符 \n
  • FORMAT中需要分别为后面每个item指定格式符

格式符:与item一一对应

  • %s:显示字符串
  • %d, %i:显示十进制整数
  • %f:显示为浮点数
  • %e, %E:显示科学计数法数值
  • %c:显示字符的ASCII码
  • %g, %G:以科学计数法或浮点形式显示数值
  • %u:无符号整数
  • %%:显示%自身

修饰符

  • [.#] 第一个数字控制显示的宽度;第二个#表示小数点后精度,如:%3.1f

    • 左对齐(默认右对齐) 如:%-15s
    • 显示数值的正负符号 如:%+d
范例:printf
#printf
[root@rocky01 ~]# awk -F ":" '{printf "Username: %-25sUID:%d\n",$1,$3}' /etc/passwd
Username: root                     UID:0
Username: bin                      UID:1
Username: daemon                   UID:2
Username: adm                      UID:3
Username: lp                       UID:4
Username: sync                     UID:5
范例:操作符
#&#x64CD;&#x4F5C;&#x7B26;
[root@rocky01 ~]# awk 'BEGIN{i=0;print i++,i}'
0 1

#&#x6BD4;&#x8F83;&#x64CD;&#x4F5C;&#x7B26;&#xFF1A;
[root@rocky01 ~]# cat /etc/issue
\S
Kernel \r on an \m

[root@rocky01 ~]# awk 'NR==2{print $1}' /etc/issue
Kernel
范例:取偶
[root@rocky01 ~]# seq 10 |awk 'NR%2==0'
2
4
6
8
10
范例:条件表达式(三目表达式)
[root@rocky01 ~]# awk -v score=85 'BEGIN{score>=80?result="good":result="bad";print result}'
good
[root@rocky01 ~]# awk -v score=75 'BEGIN{score>=80?result="good":result="bad";print result}'
bad

(3.3)模式PATTERN

PATTERN:根据pattern条件,过滤匹配的行,再做处理

  • 如果未指定空模式,则匹配每行
    [En]

    if empty pattern is not specified, match each line*

  • /regular expression/: 仅处理能够模式匹配到的行,需要用 / / 括起来
  • relational expression: 关系表达式,结果为”真”才会被处理 真:结果为非0值,非空字符串 假:结果为空字符串或0值
  • line ranges:行范围
  • BEGIN/END模式 BEGIN{}:仅在开始处理文件中的文本之前执行一次 END{}:仅在文本处理完成之后执行一次
范例:/ /
[root@rocky01 ~]# awk '/^UUID/{print $1}' /etc/fstabUUID=df2eadb3-7a9d-4a50-9c86-da809c813e29[root@rocky01 ~]# awk '!/^UUID/{print $1}' /etc/fstab##########/dev/mapper/rl-root/dev/mapper/rl-home/dev/mapper/rl-swap
范例:关系表达式1
[root@rocky01 ~]# seq 5|awk '0'[root@rocky01 ~]# seq 5|awk '1'12345[root@rocky01 ~]# seq 5|awk '!1'[root@rocky01 ~]# seq 5|awk '"0"'12345
范例:关系表达式2(面试题)
[root@rocky01 ~]# seq 10 |awk 'i=!i'13579[root@rocky01 ~]# seq 10 |awk -v i=1 'i=!i'246810
范例:行范围
[root@rocky01 ~]# seq 10 |awk 'NR>=3 && NR<=6' 3 4 5 6 [root@rocky01 ~]# awk ' ^bin , ^adm etc passwd bin:x:1:1:bin: bin: sbin nologin daemon:x:2:2:daemon: sbin: adm:x:3:4:adm: var adm: nologin< code></=6'>
范例:BEGIN/END模式

`
[root@rocky01 ~]# awk -F “:” ‘BEGIN{printf “——————————– \n%-20s|%10s|\n——————————–\n”,”username”,”uid”}{printf “%-20s|%10d|\n——————————–\n”,$1,$3}’ /etc/passwd
root | 0|
daemon | 2|

Original: https://www.cnblogs.com/Willoneday/p/16523011.html
Author: 会不会有那么一天
Title: Linux(入门篇)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/522994/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球