Linux(入门篇),冯·诺依曼体系的要点


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

1.冯诺依曼体系结构

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

  • 数字计算机的数制采用二进制,bit位, byte字节1 byte = 8 bit
  • 计算机应该按照程序顺序执行
  • 计算机硬件由运算器控制器存储器输入设备输出设备五大部分组成

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

不同进制转换:

八进制转十进制: echo "obase=10; ibase=8; 377" lbc

二进制转十进制: echo "obase=10; ibase=2; 11111111" |bc

二进制转16进制: echo "obase=16; ibase=2; 11111111"  |bc

[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

 


2.摩尔定律

由英特尔(Intel)创始人之一戈登·摩尔于1965年提出,当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍

 


3.Linux/Unix 哲学思想、原则、理念

  • 一切都是一个文件(包括硬件)
  • 小型,单一用途的程序
  • 链接程序,共同完成复杂的任务(shell脚本)
  • 避免令人困惑的用户界面
  • 配置数据存储在文本中

 


4.开源许可证 GPL、BSD、MIT、Mozilla、Apache和LGPL

(1)区别

(2)查看软件的发行许可(License)

[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

 


5.安装Centos8、Rocky8和Ubuntu20.4

(1)Centos8、Rocky8

(1.1)在启动安装时按Tab键在命令后面添加" net.ifnames=0 "可以将网卡名称限定为eth开头

若为戴尔服务器,则添加"net.ifnames=0 biosdevname=0 "

(1.2)系统默认语言选择:English

(1.3)时区:Asia/Shanghai

(1.4)安装方式:Minimal Install   (建议选择最小安装,遇到错误去解决后能积累经验)

(1.5)分区:暂时默认

(1.6)网络和主机名

(1.7)设置root用户和密码

(1.8)创建普通用户

(1.9)重启安装完成

 

(2)Ubuntu

(2.1)系统默认语言选择:English

(2.2)安装或升级:选择Continue without updating 安装不更新

 

(2.3)键盘语言布局:默认English

(2.4)网络配置:开启了DHCP会自动分配一个IP地址

(2.5)代理配置:默认

(2.6)镜像地址:http://mirrors.aliyun.com/ubuntu/    使用阿里云的镜像地址,在国内速度快些

(2.7)分区:暂时默认

(2.8)创建普通用户

(2.9)Enable Ubuntu Advantage:默认

(2.10)开启SSH

(2.11)Featured Server Snps:默认

(2.12)安装完成后重启

 


6.什么是Shell

Shell 是Linux系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。

#各种Shell
[root@rocky01 ~]#echo ${SHELL}
/bin/bash
[root@rocky01 ~]#cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

 


7.shell中可执行的两类(内外)命令

  • 内部命令:由shell自带的,而且通过某命令形式提供, ,用户登录后自动加载并常驻内存中
  • 外部命令:在文件系统路径下有对应的可执行程序文件,当执行命令时才从磁盘加载至内存中,执行完毕后从内存中删除

查看是内部还是外部命令

type COMMAND

[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       #外部命令

hash缓存表

系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后会将这条命令的路径记录到hash表中,当再次使用该命令时,shell解释器首先会查看hash表,存在将执行之,如果不存在,将会去PATH路径下寻找,利用hash缓存表可大大提高命令的调用速率

命令常见用法

  • hash 显示hash缓存
  • hash -l 显示hash缓存,可作为输入使用
  • hash -p path name 将命令全路径path起别名为name
  • hash -t name 打印缓存中name的路径
  • hash -d name 清除name缓存
  • hash -r 清除缓存

 


8.文件系统目录结构

(1)结构

文件和目录被组织成一个单根倒置树结构

文件系统从根目录下开始,用“/”表示

根文件系统(rootfs):root filesystem

标准Linux文件系统(如:ext4),文件名称大小写敏感,例如:MAIL, Mail, mail, mAiL

以 . 开头的文件为隐藏文件

路径分隔的 /

文件名最长255个字节

包括路径在内文件名称最长4095个字节

蓝色-->目录 绿色-->可执行文件 红色-->压缩文件 浅蓝色-->链接文件 灰色-->其他文件

除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用

(2)常用目录功能

  • /bin:所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
  • /sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
  • /boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放于此目录
  • /dev:设备文件及特殊文件存储位置
  • /etc:配置文件目录
  • /home:普通用户家目录
  • /lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
  • /lib64:专用于x86_64系统上的辅助共享库文件存放位置
  • /media:便携式移动设备挂载点
  • /mnt:临时文件系统挂载点
  • /opt:第三方应用程序的安装位置
  • /proc:用于输出内核与进程信息相关的虚拟文件系统
  • /sys:用于输出当前系统上硬件设备相关信息虚拟文件系统
  • /root:管理员的家目录
  • /run:目前在系统中运行的一些临时文件
  • /srv:系统上运行的服务用到的数据
  • /tmp:临时文件存储位置
  • /usr: universal shared, read-only data
    ├── bin: 保证系统拥有完整功能而提供的应用程序
    ├── sbin:
    ├── lib:32位使用
    ├── lib64:只存在64位系统
    ├── include: C程序的头文件(header files)
    ├── share:结构化独立的数据,例如doc, man等
    ├── local:第三方应用程序的安装位置
  • /var:variable data files
    ├── cache: 应用程序缓存数据目录
    ├── lib: 应用程序状态信息数据
    ├── local:专用于为/usr/local下的应用程序存储可变数据
    ├── lock: 锁文件
    ├── log: 日志目录及文件
    ├── opt: 专用于为/opt下的应用程序存储可变数据
    ├── run: 运行中的进程相关数据,通常用于存储进程pid文件
    ├── spool: 应用程序数据池
    ├── tmp: 保存系统两次重启之间产生的临时数据

 


9.Linux下的文件类型

  • - 普通文件
  • d 目录文件directory
  • l 符号链接文件link
  • b 块设备block
  • c 字符设备character
  • p 管道文件pipe
  • s 套接字文件socket

 


10.文件元数据和节点表结构

(1)inode 表结构

每个文件的属性信息,比如:文件的大小,时间,类型等,称为文件的元数据(meta data)。这此元数据是存放在inode(index node)表中。inode 表中有很多条记录组成,第一条记录对应的存放了一个文件的元数据信息

每一个inode表记录对应的保存了以下信息:

  • inode number 节点号
  • 文件类型
  • 权限
  • UID
  • GID
  • 链接数(指向这个文件名路径名称个数)
  • 该文件的大小和不同的时间戳
  • 指向磁盘上文件的数据块指针
  • 有关文件的其他数据

指针

磁盘是一种块文件,以块的方式来存储数据,每块通常都是4K,

  • 直接指针
    直接指针直接指向存放的位置,直接指针只有12个,12x4K=48K,可以表达48K的数据一个文件假如是1K或者哪怕是一个字节,也要分配一块4k的空间来存储这个文件,一个文件假如是10k,分配3块空间来存放,就有3个指针来指向存放的3个块
  • 间接指针
    指针不是直接指向数据存储的位置,而是指向指针块,指针块也是4K大小,一个指针放4个字节,一个指针块可以放1024个指针,4Kx1024=4M ,可以表达4M的数据超过48K低于4M,就可以用间接指针来表示
  • 双重间接指针一个间接指针块指向另一个间接指针块矩阵4Kx1024x1024=4G,可以表达4G的数据
  • 三重间接指针
    4Kx1024x1024x1024=4T,可以表达4T的数据

(2)硬链接

硬链接本质上就给一个文件起一个新的名称,实质是同一个文件

硬链接特性

  • 创建硬链接会在对应的目录中增加额外的记录项以引用文件
  • 对应于同一文件系统上一个物理文件
  • 每个目录引用相同的inode号
  • 创建时链接数递增
  • 删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文件被删除
  • 不能跨越驱动器或分区
  • 不支持对目录创建硬链接

格式

ln filename [linkname ]

(3)软链接或符号链接

一个符号链接指向另一个文件,就像 windows 中快捷方式,软链接文件和原文件本质上不是同一个文件

软链接特点

  • 一个符号链接的内容是它引用文件的名称
  • 可以对目录创建软链接
  • 可以跨分区的文件实现
  • 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数
  • 在创建软链接时, 如果源文件使用相对路径,是相对于软链接文件的路径,而非相对于当前工作目录,但是软链接的路径如果是相对路径,则是相对于当前工作目录

 格式

ln -s filename [linkname]

(4)硬链接和软链接的区别

  硬链接 软链接
本质 本质是同一个文件 本质不是同一个文件
跨设备 不支持 支持
inode(节点) 相同 不同
链接数 创建新的硬链接,链接数增加;删除硬链接,链接数减少 创建或删除,链接数不会变化
文件夹 不支持 支持
相对路径 原始文件相对路径是相对于当前工作目录 原始文件的相对路径是相对于链接文件的相对路径
删除源文件 只是链接数减一,但链接文件的访问不受影响 链接文件将无法访问
文件类型 和源文件相同 链接文件,和源文件无关
文件大小 和源文件相同 源文件的路径长度

 ls -i 打印每个文件的索引号

索引号inode相同的本质上是同一个文件(前提是同一个逻辑卷)

[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

 


11.用户、组和权限

(1)用户

 Linux中每个用户是通过 User Id (UID)来唯一标识的

  • 管理员:root, 0
  • 普通用户:1-60000 自动分配
    • 系统用户:1-499 (CentOS 6以前), 1-999 (CentOS 7以后)
    • 对守护进程获取资源进行权限分配
    • 登录用户:500+ (CentOS6以前), 1000+(CentOS7以后)
    • 给用户进行交互式登录使用

(2)用户组

Linux中可以将一个或多个用户加入用户组中,用户组是通过Group ID(GID) 来唯一标识的。

  • 管理员组:root, 0
  • 普通组:
    • 系统组:1-499(CentOS 6以前), 1-999(CentOS7以后), 对守护进程获取资源进行权限分配
    • 普通组:500+(CentOS 6以前), 1000+(CentOS7以后), 给用户使用

(3)用户和组的关系

  • 用户的主要组(primary group):用户必须属于一个且只有一个主组,默认创建用户时会自动创建和用户名同名的组,做为用户的主要组,由于此组中只有一个用户,又称为私有组
  • 用户的附加组(supplementary group): 一个用户可以属于零个或多个辅助组,附属组

例:

[root@rocky01 ~]# id postfix
uid=89(postfix) gid=89(postfix) groups=89(postfix),12(mail)

 


12.磁盘分区

(1)为什么要分区

  • 优化I/O性能
  • 实现磁盘空间配额限制
  • 提高修复速度
  • 隔离系统和程序
  • 安装多个OS
  • 采用不同文件系统

(2)分区方式

两种分区方式:MBR,GPT

(2.1)MBR分区

使用32位表示扇区数,分区不超过2T

MBR分区中一块硬盘最多有4个主分区,也可以3主分区+1扩展(N个逻辑分区)

MBR分区:主和扩展分区对应的1--4,/dev/sda3,逻辑分区从5开始,/dev/sda5

(2.2)GPT分区

支持128个分区,使用64位,支持8Z( 512Byte/block )64Z ( 4096Byte/block)

 


13.文件系统

Linux 常用文件系统

  • ext2:Extended file system 适用于那些分区容量不是太大,更新也不频繁的情况,例如 /boot 分区
  • ext3:是 ext2 的改进版本,其支持日志功能,能够帮助系统从非正常关机导致的异常中恢复
  • ext4:是 ext 文件系统的最新版。提供了很多新的特性,包括纳秒级时间戳、创建和使用巨型文件(16TB)、最大1EB的文件系统,以及速度的提升
  • xfs:SGI,支持最大8EB的文件系统
  • swap
  • iso9660 光盘
  • btrfs(Oracle)

 


14.RAID

(1)什么是RAID

"RAID"一词是由David Patterson, Garth A. Gibson, Randy Katz 于1987年在加州大学伯克利分校发明的。在1988年6月SIGMOD会议上提交的论文"A Case for Redundant Arrays of Inexpensive Disks”"中提出,当时性能最好的大型机不断增长的个人电脑市场开发的一系列廉价驱动器的性能所击败。尽管故障与驱动器数量的比例会上升,但通过配置冗余,阵列的可靠性可能远远超过任何大型单个驱动器的可靠性

独立硬盘冗余阵列RAID, Redundant Array of Independent Disks),旧称廉价磁盘冗余阵列 Redundant Array of Inexpensive Disks),简称磁盘阵列。利用虚拟化存储技术把多个硬盘组合起来,成为一个或多个硬盘阵列组,目的为提升性能或数据冗余,或是两者同时提升。

RAID 层级不同,数据会以多种模式分散于各个硬盘,RAID 层级的命名会以 RAID 开头并带数字,例如:RAID 0、RAID 1、RAID 5、RAID 6、RAID 7、RAID 01、RAID 10、RAID 50、RAID 60。每种等级都有其理论上的优缺点,不同的等级在两个目标间获取平衡,分别是增加数据可靠性以及增加存储器(群)读写性能。

简单来说,RAID把多个硬盘组合成为一个逻辑硬盘,因此,操作系统只会把它当作一个实体硬盘。RAID常被用在服务器电脑上,并且常使用完全相同的硬盘作为组合。由于硬盘价格的不断下降与RAID功能更加有效地与主板集成,它也成为普通用户的一个选择,特别是需要大容量存储空间的工作,如:视频与音频制作

(1)RAID-0

条带卷 2+ (最低磁盘个数) 空间利用率100% 读写速度快,不容错

(2)RAID-1

镜像卷 2 50% 读写速度一般,容错

(3)RAID5

带奇偶校验的条带卷 3+ (n-1)/n 读写速度块,容错,允许坏一块盘

(4)RAID6

带奇偶校验的条带集,双校验 4+ (n-2)/n 读写快,容错,允许坏两块

(5)RAID10

RAID1的安全+RAID0的高速 4 50% 读写速度快,容错

 

                 

(6)实现软RAID

mdadm工具:为软RAID提供管理界面,为空余磁盘添加冗余,结合内核中的md(multi devices)

RAID设备可命名为/dev/md0、/dev/md1、/dev/md2、/dev/md3等

常用选项说明:

  • 模式:
    • 创建:-C
    • 装配:-A
    • 监控:-F
    • 管理:-f, -r, -a
  • <raiddevice>: /dev/md#
  • <component-devices>: 任意块设备
  • -C: 创建模式
    • -n #: 使用#个块设备来创建此RAID
    • -l #:指明要创建的RAID的级别
    • -a {yes|no}:自动创建目标RAID设备的设备文件
    • -c CHUNK_SIZE: 指明块大小,单位k
    • -x #: 指明空闲盘的个数
  • -D:显示raid的详细信息
    • mdadm -D /dev/md#
  • 管理模式:
    • -f: 标记指定磁盘为损坏
    • -a: 添加磁盘
    • -r: 移除磁盘
  • 观察md的状态: cat /proc/mdstat

范例

#使用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

 

 


二、Linux基础命令

1.apt

命令 功能
apt remove 会删除软件包而保留软件的配置文件
apt purge 会同时清除软件包和软件的配置文件

 


2.查看当前终端设备

VMware同时按Ctrl+Alt+F12345... 可切换新的终端设备

(1)tty

#远程终端查看
[root@rocky01 ~]#tty
/dev/pts/0

#VMware上查看
[root@rocky01 ~]#tty
/dev/tty1

tty1输入的得到的输出显示到tty2

#打开两个终端,使用tty命名分别查看它们的id,如/dev/pts/1   /dev/pts/2 
#然后在/dev/pts/1中输入echo "info" > /dev/pts/2

(2)who

root@ubuntu01:~# who
rye      tty1         2022-07-12 11:58
root     pts/0        2022-07-12 13:19 (10.0.0.1)

 


3.设置主机名

注:主机名不支持使用下划线,但支持横线,可使用字母,横线或数字组合

#临时生效
[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

 


4.命令提示符 prompt (PS1)

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\]"  #自用

提示符格式说明

  • \e 或 \033 控制符
  • \u 当前用户
  • \h 主机名简称
  • \H 主机名
  • \w 当前工作目录
  • \W 当前工作目录基名
  • \t 24小时时间格式
  • \T 12小时时间格式
  • ! 命令历史数
  • # 开机后命令历史数

范例:

[root@rocky01 ~]# PS1="\[\e[1;33m\][\t-\u@\h \W\!-\#]\\$ \[\e[0m\]"
[00:45:34-root@rocky01 ~243-25]#

注:
243  !命令历史数
25   #开机后命令历史数

 


5.别名alias

定义别名NAME,其相当于执行命令VALUE

alias NAME='VALUE'

#显示当前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'

创建别名 alias NAME='VALUE'

[root@rocky01 ~]# alias cdnet='cd /etc/sysconfig/network-scripts'
[root@rocky01 ~]# cdnet
[root@rocky01 network-scripts]# pwd
/etc/sysconfig/network-scripts

撤销别名 unalias NAME

[root@rocky01 ~]# unalias ls #撤销单个别名
[root@rocky01 ~]# unalias -a #撤销所有别名

如果要执行原命令,可使用

\ALIASNAME
"ALIASNAME"
'ALIASNAME'

[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/

 


6.查看硬件信息

(1)查看CPU

[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
...

(2)查看内存

[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
...

(3)查看硬盘和分区情况

[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

(4)查看系统架构

[root@rocky01 ~]# arch
x86_64

(5)查看内核版本

[root@rocky01 ~]# uname -r
4.18.0-372.9.1.el8.x86_64

(6)查看操作系统发行版本

Centos8、Rocky8

[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"

Ubuntu

[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

 


7.日期和时间

date

[root@rocky01 ~]# date +"%F %T "
2022-07-12 14:11:02
[root@rocky01 ~]# echo `date +"%F %T "`
2022-07-12 14:11:13

cal

[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

修改时区

[root@ubuntu2004 ~]# timedatectl set-timezone Asia/Shanghai

 


8.欢迎信息提示issue、motd文件

/etc/issuc 登录之前显示

/etc/motd 登录之后显示

 


9.echo基本用法

常用选项:

  • -E (默认)不支持 \ 解释功能
  • -n 不自动换行
  • -e 启用 \ 字符的解释功能

 

启用命令选项-e,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出

  • \a 发出警告声
  • \b 退格键
  • \c 最后不加上换行符号
  • \e escape,相当于\033
  • \n 换行

显示颜色:

"\033[字符背景颜色;字体颜色m字符串\033[0m"

"\e[字符背景颜色;字体颜色m字符串\e[0m"

显示变量:

[root@rocky01 ~]# a=1
[root@rocky01 ~]# echo "$a"    #用变量值替换,弱引用
1
[root@rocky01 ~]# echo '$a'    #变量不会替换,强引用
$a

 


10.命令行扩展和被括起来的集合

(1)" " 、' ' 、` ` 三者区别

[root@rocky01 ~]# echo "echo $HOSTNAME"
echo rocky01
[root@rocky01 ~]# echo 'echo $HOSTNAME'
echo $HOSTNAME
[root@rocky01 ~]# echo `echo $HOSTNAME`
rocky01

#结论:

单引号:强引用,六亲不认,变量和命令都不识别,都当成了普通的字符串;'最傻'

双引号:弱引用,不能识别命令,可以识别变量;"半傻不精"

反向单引号:里面的内容必须是能执行的命令并且有输出信息,变量和命令都识别,并且会将反向单引号的内容当成命令进行执行后,再交给调用反向单引号的命令继续;`最聪明`

(2)括号扩展:{ }

{ } 可以实现打印重复字符串的简化形式

[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

 


11.history命令行历史

常用选项:

  • -c 清空命令历史
  • -d offset 删除历史中指定的第offset个命令
  • n 显示最近的n条历史(例:histtory 10)

显示时间和用户:

[root@rocky01 ~]# HISTTIMEFORMAT="%F %T `whoami` "

[root@rocky01 ~]# history |tail -n 3
  363  2022-07-27 02:29:18 root HISTTIMEFORMAT="%F %T `whoami` "
  364  2022-07-27 02:29:20 root history
  365  2022-07-27 02:29:49 root history |tail -n 3

 


12.调用命令行历史

  • !! 、Ctrl+P  重复上一个命令
  • !n  执行history命令输出对应序号n的命令
  • !$ 表示前一个命令中最后一个参数
  • Alt + . 使用上一条命令的最后一个参数
  • Esc + . 使用上一条命令的最后一个参数
[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

 


13.bash的快捷键

  • Ctrl + l 清屏,相当于clear命令
  • Ctrl + o 执行当前命令,并重新显示本命令
  • Ctrl + s 阻止屏幕输出,锁定
  • Ctrl + q 允许屏幕输出,解锁
  • Ctrl + c 终止命令
  • Ctrl + z 挂起命令
  • Ctrl + a 光标移到命令行首,相当于Home
  • Ctrl + e 光标移到命令行尾,相当于End
  • Ctrl + d 删除光标处的一个字符
  • Ctrl + u 从光标处删除至命令行首
  • Ctrl + k 从光标处删除至命令行尾

 


14.whatis显示命令的简短描述

此工具在系统刚安装后,不可立即使用,需要制作数据库后才可使用

man -f 等同于 whatis

#CentOS 7 版本以后
[root@rocky01 ~]# mandb

#CentOS 6 版本之前
[root@centos6 ~]# makewhatis
[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

 


15.man提供命令帮助的文件

man 帮助段落说明

序号 名称 含义
1 NAME 名称及简要说明
2 SYNOPSIS 用法格式说明
3 DESCRIPTION 详细说明
4 AUTHOR 作者
5 REPORTING BUGS 报告的错误信息
6 COPYRIGHT 版本信息
7 SEE ALSO 其它帮助参考
  • < > 必选内容
  • [ ] 可选内容
  • ... 同一内容可出现多次
  • { } 分组

 


16.pwd显示当前工作目录

每个shell和系统进程都有一个当前的工作目录

  • -P 显示真实物理路径
  • -L 显示链接路径(默认)
[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

 


17.绝对和相对路径

绝对路径:以正斜杠/ 即根目录开始、完整的文件的位置路径、可用于任何想指定一个文件名的时候

相对路径:不以斜线开始,一般情况下,是指相对于当前工作目录的路径,特殊场景下,是相对于某目录的位置,可以作为一个简短的形式指定一个文件名

(1)basename

基名,只取文件名,不要路径

[root@rocky01 sbin]# basename /etc/sysconfig/network-scripts/ifcfg-eth0
ifcfg-eth0

(2)dirname

目录名,只取路径,不要文件名

[root@rocky01 sbin]# dirname /etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts

 


18.ls列出目录内容

常用选项:

  • -a 包含隐藏文件
  • -l 显示额外的信息
  • -R 目录递归
  • -ld 目录和符号链接信息
  • -i 打印每个文件的索引号
  • -1 文件分行显示
  • -S 按从大到小排序
  • -t 按mtime排序
  • -u 配合-t选项,显示并按atime从新到旧排序
  • -U 按目录存放顺序显示
  • -X 按文件后缀排序
  • -F 对不同类型文件显示时附加不同的符号:*/=>@|
  • -C 文件多时,以多列的方式显示文件,默认是一列(标准输出)

说明

ls 查看不同后缀文件时的颜色由 /etc/DIR_COLORS 和变量$LS_COLORS定义

ls -l 看到文件的大小,不一定是实际文件真正占用空间的大小

 


19.stat 查看文件状态

每个文件有三个时间戳:

  • Access time 访问时间,atime,读取文件内容
  • Modify time 修改时间,mtime,改变文件内容(数据)
  • Change time 改变时间,ctime,元数据发生改变
[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

 


20.file检查文件的类型

[root@rocky01 ~]#file linux.txt
linux.txt: ASCII text

[root@rocky01 ~]#file win.txt
win.txt: ASCII text, with CRLF line terminators

修改文件类型:vim打开目标文件

:set ff=unix
:set ff=dos

 


21.常见通配符

*

匹配零个或多个字符,但不匹配 "." 开头的文件,即隐藏文件

匹配任何单个字符,一个汉字也算一个字符

[0-9]

匹配数字范围

[a-z]

一个字母

[peng]

匹配列表中的任何的一个字符

[^peng]

匹配列表中的所有字符以外的字符

[:digit:]

任意数字,相当于0-9

[:lower:]

任意小写字母,表示 a-z

[:upper:]

任意大写字母,表示 A-Z

范例: [ ] 和 { }

[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

 


22.touch创建空文件和刷新时间

选项说明

  • -a 仅改变 atime和ctime
  • -m 仅改变 mtime和ctime
  • -t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的时间戳
  • -c 如果文件不存在,则不予创建

 


23.cp复制文件和目录

常用选项

  • -i 如果目标已存在,覆盖前提示是否覆盖
  • -n 不覆盖
  • -r,-R 递归复制目录及内部的所有内容
  • -b 目标存在,覆盖前先备份,默认形式为filename~,只保留最近一次的备份
  • -a 存档,常用于备份功能
  • -v 详细

范例:

将/etc/目录下所有文件,备份到/data独立的子目录下,并要求子目录格式为 backupYYYY-mm-dd,备份过程可见,要求保留原有权限

[root@rocky01 ~]# cp -av /etc/ /data/backup`date +%F`
'/etc/' -> '/data/backup2022-07-27'
'/etc/dnf' -> '/data/backup2022-07-27/dnf'
'/etc/dnf/dnf.conf' -> '/data/backup2022-07-27/dnf/dnf.conf'
...省略...

 


24.mv移动和重命名文件

 常用选项

  • -i 交互式
  • -f 强制
  • -b 目标存在,覆盖前先备份
  • -t  (mv -t dir file 表示将file移动到dir)

 


25.rm删除文件

常用选项:

  • -i 交互式
  • -f 强制删除
  • -r 递归
  • --no-preserve-root 删除/

防止文件被删除chattr

-a 文件是否只能添加,修改,而不能删除

chattr +a filename

 


26.目录操作

(1)tree 显示目录数

常见选项:

  • -d: 只显示目录
  • -L level:指定显示的层级数目
  • -P pattern: 只显示由指定wild-card pattern匹配到的路径

(2)mkdir 创建目录

常见选项:

  • -p: 存在于不报错,且可自动创建所需的各目录
  • -v: 显示详细信息
  • -m MODE: 创建目录时直接指定权限

(3)rmdir 删除空目录

常见选项:

  • -p 递归删除父空目录
  • -v 显示详细信息

注意:rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树

 


27.IO重定向

Linux给程序提供三种 I/O 设备

文件描述符 设备文件名 设备描述
0 stdin 标准输入
1 stdout 标准输出
2 stderr 标准错误输出
操作符号 描述
1> 或 > 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把标准输出和错误都重定向
>> 追加标准输出重定向至文件
2>> 追加标准错误重定向至文件

范例:

(1)清除大文件

[root@rocky01 data]# cat /dev/null > /data/big.log

(2)将标准输出和错误都重定向到同一个文件

方法一:
[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

 


28.高级重定向

(1)cmd <<< "string"

# cmd <<< 'string' 将string的内容作为cmd的输入  (注:只能字符串)

[root@rocky01 ~]# bc <<<`seq -s+ 10`
55

(2)cmd1 < <(cmd2)

cmd1 < <(cmd2)  将cmd2的输出作为cmd1的输入(输入会写入一个临时文件,中间通过临时文件传递)  作用等同于 "cmd2 | cmd1"

[root@rocky01 ~]# bc < <(seq -s+ 10)
55

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

 


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<500,CentOS7 以后: ID<1000
  • -m 创建家目录,用于系统用户
  • -M 不创建家目录,用于非系统用户
  • -p 指定加密的密码

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文件解读

#文件内容
[root@rocky01 ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...省略...
Willoneday:x:1001:1001::/home/Willoneday:/bin/bash
nginx:x:994:992:Nginx web server:/var/lib/nginx:/sbin/nologin

#解读
每行用户信息都以 ":" 作为分隔符,划分为 7 个字段,每个字段所表示的含义如下:
用户名:密码:UID(用户ID):GID(组ID):描述性信息:主目录:默认Shell

#密码
"x" 表示此用户设有密码,但不是真正的密码,真正的密码保存在 /etc/shadow 文件中

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

[root@rocky01 ~]# cat /etc/shadow
root:$6$K.SYYULWCxfswVvK$UOMarkx3VoVPigR5FVSkSTm5g9fS8vPW2RMDn.D7Uh9fmQv6HxKukzBq3uDgBjPpTa7/Q2/60CzDcf83rxUqz1::0:99999:7:::
bin:*:18700:0:99999:7:::
...省略...
Willoneday:!!:19211:0:99999:7:::
nginx:!!:19211::::::

#解读
每行用户信息都以 ":" 作为分隔符,划分为 9 个字段,每个字段所表示的含义如下:
###用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段###

#加密密码
这里保存的是真正加密的密码。目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES 加密算法。
注意,这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。
很多软件透过这个功能,在密码串前加上 "!"、"*" 或 "x" 使密码暂时失效。
所有伪用户的密码都是 "!!" 或 "*",代表没有密码是不能登录的。
当然,新创建的用户如果不设定密码,那么它的密码项也是 "!!",代表这个用户没有密码,不能登录。

#最后一次修改时间
Linux 计算日期的时间是以  1970 年 1 月 1 日作为 1 不断累加得到的时间,到 1971 年 1 月 1 日,则为 366 天。
这里显示 19211 天,也就是说,此 Willoneday 账号在 1970 年 1 月 1 日之后的第 19211 天修改的 root 用户密码。

#最小修改时间间隔
最小修改间隔时间,也就是说,该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。
如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。

#保留字段
这个字段目前没有使用,等待新功能的加入。

 


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

#测试能否改属主
[root@rocky01 ~]# chgrp root:root 1.txt
chgrp: invalid group: ‘root:root’
结论:chgrp 命令可以只修改文件的属组

(3)chmod 修改文件权限

 


32.umask

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

实现方式:

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

非特权用户umask默认值是 002

root的umask 默认值是 022

范例:

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

方法一:
[root@rocky01 ~]#touch a.txt; chmod 000 a.txt
[root@rocky01 ~]#ll a.txt
----------. 1 root root 0 Jul 15 20:30 a.txt

方法二:
[root@rocky01 ~]#umask 777; touch a.txt; umask 022;
[root@rocky01 ~]#ll a.txt 
----------. 1 root root 0 Jul 15 20:32 a.txt

方法三:
[root@rocky01 ~]#(umask 777; touch a.txt) 
[root@rocky01 ~]#ll a.txt 
----------. 1 root root 0 Jul 15 20:33 a.txt

 


33.vim

 命令模式 --> 插入模式

  • i    insert,在光标所在处输入
  • I    在当前光标所在行的行首输入
  • a    append,在光标所在处后面输入
  • A    在当前光标所在行的行尾输入
  • o    在当前光标所在行的下方打开一个新行
  • O    在当前光标所在行的上方打开一个新行

扩展命令模式基本命令

  • w                  写(存)磁盘文件
  • wq                写入并退出
  • x                   写入并退出
  • X                   加密
  • q                   退出
  • q!                  不存盘退出
  • r  filename    读文件内容到当前
  • w  filename   将当前文件内容写入另一个文件
  • !command    执行命令
  • r!command   读入命令的输出

(1)定制vim的工作特性

扩展命令模式的配置只是对当前vim进程有效,可将配置存放在文件中持久保存

配置文件:

/etc/vimrc #全局
~/.vimrc #个人

(1.1)行号

显示:set number,简写 set nu
取消显示:set nonumber, 简写 set nonu

(1.2)忽略字符的大小写

启用:set ignorecase,简写 set ic
不忽略:set noic

(1.3)自动缩进

启用:set autoindent,简写 set ai
禁用:set noai

(1.4)复制保留格式

启用:set paste
禁用:set nopaste

(1.5)显示Tab ^I和换行符 和$(不可见字符)

启用:set list
禁用:set nolist

(1.6)文件格

启用windows格式:set fileformat=dos
启用unix格式:set fileformat=unix
简写 set ff=dos|unix

1.7)Tab 用空格代替

启用:set expandtab   默认为8个空格代替Tab
禁用:set noexpandtab
简写:set et

(1.8)Tab用指定空格的个数代替

启用:set tabstop=# 指定#个空格代替Tab
简写:set ts=4

(1.9)设置缩进宽度

#向右缩进 命令模式>>
#向左缩进 命令模式<<
#设置缩进为4个字符
set shiftwidth=4

(1.10)设置光标所在行的标识线

启用:set cursorline,简写 set cul
禁用:set nocursorline

(1.11)加密

启用: set key=password
禁用: set key=

(2)命令模式

命令模式,又称为Normal模式,功能强大,只是此模式输入指令并在屏幕上显示,所以需要记忆大量的快捷按键才能更好的使用

(2.1)保存退出

ZZ 保存退出
ZQ 不保存退出

(2.2)行首行尾跳转

^ 跳转至行首的第一个非空白字符
0 跳转至行首
$ 跳转至行尾

(2.3)行间移动

:#    跳转至由第#行
G      最后一行
1G, gg 第一行

(2.4)字符编辑

x  剪切光标处的字符
#x 剪切光标处起始的#个字符
xp 交换光标所在处的字符及其后面字符的位置
~  转换大小写

(2.5)替换命令(replace)

r 只替换光标所在处的一个字符
R 切换成REPLACE模式(在末行出现-- REPLACE -- 提示),按ESC回到命令模式

(2.6)删除命令(delete)

d^   删除到非空行首
d0   删除到行首
dd  剪切光标所在的行
#dd  删除光标开始的行到第#行
D    从当前光标位置一直删除到行尾,等同于d$
d$   删除到行尾

(2.7)复制命令(yank)

yy:复制行
#yy 复制多行
Y:复制整行

(2.8)粘贴命令(paste)

小p 缓冲区存的如果为整行,则粘贴当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面
大P 缓冲区存的如果为整行,则粘贴当前光标所在行的上方;否则,则粘贴至当前光标所在处的前面

(2.9)查找

/查找关键字:从当前光标所在处向文件尾部查找
?查找关键字:从当前光标所在处向文件首部查找
n:与命令同方向
N:与命令反方向

(2.10)撤消更改

u 撤销最近的更改,相当于windows中ctrl+z
#u 撤销之前多次更改
U 撤消光标落在这行后所有此行的更改

. 重复前一个操作
#. 重复前一个操作#次

(3)可视化模式

在末行有”-- VISUAL -- “指示,表示在可视化模式

允许选择的文本块

  • v 面向字符,-- VISUAL --
  • V 面向整行,-- VISUAL LINE --
  • ctrl-v 面向块,-- VISUAL BLOCK --

可视化键可用于与移动键结合使用

w ) } 箭头等

突出显示的文字可被删除,复制,变更,过滤,搜索,替换等

范例:在文件指定行的行首插入#

1、先将光标移动到指定的第一行的行首
2、输入ctrl+v 进入可视化模式
3、向下移动光标,选中希望操作的每一行的第一个字符
4、输入大写字母 I 切换至插入模式
5、输入 # 
6、按 ESC 键

范例二:在指定的块位置插入相同的内容

1、光标定位到要操作的地方
2、输入ctrl+v 进入可视化模式,选取这一列操作多少行
3、输入大写字母 I 切换至插入模式
4、输入要插入的内容
5、按 ESC 键

(4)扩展命令模式

按“:”进入Ex模式 ,创建一个命令提示符: 处于底部的屏幕左侧

(4.1)保存退出

w  写(存)磁盘文件
wq 写入并退出
x  写入并退出
X  加密
q  退出
q!不存盘退出,即使更改都将丢失

(4.2)读文件内容到当前文件中

r filename

(4.3)将当前文件内容写入另一个文件

w filename

(4.4)执行命令

!command

(4.5)读入命令的输出

r!command

 


34.cat 查看文本文件内容

常见选项

  • -E:显示行结束符$
  • -A:显示所有控制符
  • -n:对显示出的每一行进行编号
  • -b:非空行编号
  • -s:压缩连续的空行成一行

 


35.tac逆向显示文本内容

36.rev将同一行的内容逆向显示

[root@rocky01 ~]# cat 1.txt
1 2 3
a b c
A B C
[root@rocky01 ~]# tac 1.txt
A B C
a b c
1 2 3
[root@rocky01 ~]# rev 1.txt
3 2 1
c b a
C B A

 


37.hexdump查看非文本文件内容

[root@rocky01 ~]# hexdump -C -n 512 /dev/sda
00000000  eb 63 90 10 8e d0 bc 00  b0 b8 00 00 8e d8 8e c0  |.c..............|
00000010  fb be 00 7c bf 00 06 b9  00 02 f3 a4 ea 21 06 00  |...|.........!..|
00000020  00 be be 07 38 04 75 0b  83 c6 10 81 fe fe 07 75  |....8.u........u|
...省略...

 


38.分页查看文件内容

(1)more

(2)less

 


39.显示文本前面或后面的行内容

(1)head

显示文件或标准输入的前面行

常用选项:

  • -c # 指定获取前#字节
  • -n # 指定获取前#行,#如果为负数,表示从文件头取到倒数第#前
  • -#    同上
[root@rocky01 ~]# echo a我b | head -c4
a我[root@rocky01 ~]# 

(2)tail

显示文件或标准输入的倒数行

常用选项:

  • -c #  指定获取后#字节
  • -n #  指定获取后#行,如果#是负数,表示从第#行开始到文件结束
  • -#     同上
  • -f      跟踪显示文件fd新追加的内容,常用日志监控,相当于 --follow=descriptor,当文件删除再新建同名文件,将无法继续跟踪文件
  • -F     跟踪文件名,相当于--follow=name --retry,当文件删除再新建同名文件,将可以继续跟踪文件

 


40.cut 按列抽取文本 

常用选项

  • -d DELIMITER: 指明分隔符,默认tab
  • -f FILEDS:
    • #: 第#个字段,例如:3
    • #,#[,#]:离散的多个字段,例如:1,3,6
    • #-#:连续的多个字段, 例如:1-6
    • 混合使用:1-3,7
  • -c 按字符切割
  • --output-delimiter=STRING指定输出分隔符

 


41.rename:批量修改文件名

[root@rocky01 ~]# ls
0.txt  1.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt
[root@rocky01 ~]# rename txt sh *.txt
[root@rocky01 ~]# ls
0.sh  1.sh  2.sh  3.sh  4.sh  5.sh  6.sh  7.sh  8.sh  9.sh

 


42.分析文本的工具

(1)wc 文本数据统计

常用选项

  • -l 只计数行数
  • -w 只计数单词总数
  • -c 只计数字节总数
  • -m 只计数字符总数
  • -L 显示文件中最长行的长度
[root@rocky01 ~]# cat 1.txt
1 2 3
a b c
A B C
[root@rocky01 ~]# wc 1.txt
3      9         18        1.txt
行数   单词书    字节数    文件名

(2)sort 文本排序

把整理过的文本显示在标准输出,不改变原始文件

常用选项

  • -r 执行反方向(由上至下)整理
  • -R 随机排序
  • -n 执行按数字大小整理
  • -h 人类可读排序,如: 2K 1G
  • -f 选项忽略(fold)字符串中的字符大小写
  • -u 选项(独特,unique),合并重复项,即去重
  • -t c 选项使用c做为字段界定符
  • -k # 选项按照使用c字符分隔的 # 列来整理能够使用多次

(3)uniq 去重

常见选项

  • -c: 显示每行重复出现的次数
  • -d: 仅显示重复过的行
  • -u: 仅显示不曾重复的行

范例:取两个文件的相同和不同的行

[root@centos8 data]#cat test1.txt
a
b
1
c
[root@centos8 data]#cat test2.txt
b
e
f
c
1
2

#取文件的共同行
[root@centos8 data]#cat test1.txt test2.txt | sort |uniq -d
1
b
c

#取文件的不同行
[root@centos8 data]#cat test1.txt test2.txt | sort |uniq -u
2
a
e
f

(4)diff 比较两个文件之间的区别

[root@rocky01 ~]# cat 1.txt
7 8 9
a b c
A B C
[root@rocky01 ~]# cat 2.txt
4 5 6
d e f
A B C

[root@rocky01 ~]# diff 1.txt 2.txt
1,2c1,2
< 7 8 9
< a b c
---
> 4 5 6
> d e f

(5)vimfidd 比较文件的区别

相当于vim -d

 


43.正则表达式

由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符

正则表达式分两类:

基本正则表达式: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)匹配次数

用在要指定次数的字符后面,用于指定前面的字符要出现的次数

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

(1.3)位置锚定

位置锚定可以用于定位出现的位置

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

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

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

[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)位置锚定

  • ^ 行首
  • $ 行尾
  • \<, \b 语首
  • \>, \b 语尾

(2.4)分组、或者

( ) 分组

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

 

| 或者

a|b #a或b

C|cat #C或cat

(C|c)at #Cat或cat

 


44.文本处理三剑客

(1)grep

作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行

模式:由正则表达式字符及文本字符所编写的过滤条件

常见选项

  • --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…
awk [options] -f programfile var=value file…

说明:

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
   5498 122.51.38.20
   2161 117.157.173.214
    953 211.159.177.120

范例:取出分区利用率

#方法一
[root@rocky01 ~]# df | awk -F " +|%" '{print $5}'
Use
0
0
1
0
4
21
1
0

#方法二:使用正则表达式
[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地址

#方法一
[root@rocky01 ~]# hostname -I |cat -A
10.0.0.128 $
[root@rocky01 ~]# hostname -I |awk '{print $1}' |cat -A
10.0.0.128$

#方法二
[root@rocky01 ~]# ifconfig eth0 |sed -n '2p' |awk '{print $2}' |cat -A
10.0.0.128$

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

#格式如下
[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

#操作
[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:输入字段分隔符,默认为空白字符,功能相当于 -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:输出字段分隔符,默认为空白字符
[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:输入记录record分隔符,指定输入时的换行符
[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:输出记录分隔符,输出时用指定符号代替换行符
[root@rocky01 ~]# awk -v RS=";" -v ORS="***" '{print $1}' test.txt
1***a***A***

#NF:统计字段数量
[root@rocky01 ~]# cat /etc/issue
\S
Kernel \r on an \m

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

#NR:记录的编号
[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:各文件分别计数,记录的编号
[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:当前文件名
[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 “FORMAT”, 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
范例:操作符
#操作符
[root@rocky01 ~]# awk 'BEGIN{i=0;print i++,i}'
0 1

#比较操作符:
[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条件,过滤匹配的行,再做处理

  • 如果未指定:空模式,匹配每一行
  • /regular expression/:仅处理能够模式匹配到的行,需要用 / / 括起来
  • relational expression: 关系表达式,结果为“真”才会被处理

    真:结果为非0值,非空字符串

    假:结果为空字符串或0值

  • line ranges:行范围

  • BEGIN/END模式

    BEGIN{}:仅在开始处理文件中的文本之前执行一次

    END{}:仅在文本处理完成之后执行一次

范例:/ /
[root@rocky01 ~]# awk '/^UUID/{print $1}' /etc/fstab
UUID=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'
1
2
3
4
5
[root@rocky01 ~]# seq 5|awk '!1'
[root@rocky01 ~]# seq 5|awk '"0"'
1
2
3
4
5
范例:关系表达式2(面试题)
[root@rocky01 ~]# seq 10 |awk 'i=!i'
1
3
5
7
9
[root@rocky01 ~]# seq 10 |awk -v i=1 'i=!i'
2
4
6
8
10
范例:行范围
[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:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
范例:BEGIN/END模式
[root@rocky01 ~]# awk -F ":" 'BEGIN{printf "-------------------------------- \n%-20s|%10s|\n--------------------------------\n","username","uid"}{printf "%-20s|%10d|\n--------------------------------\n",$1,$3}' /etc/passwd
--------------------------------
username            |       uid|
--------------------------------
root                |         0|
--------------------------------
bin                 |         1|
--------------------------------
daemon              |         2|
--------------------------------
adm                 |         3|

 

(3.4)条件判断 if-else

语法:

if(condition){statement;…}[else statement]

if(condition1){statement1}else if(condition2){statement2}else if(condition3){statement3}...... else {statementN}

使用场景:对awk取得的整行或某个字段做条件判断

范例:成绩判断
#考试成绩
[root@rocky01 ~]# cat score.txt
name score
xiaoming 100
xiaohong 80
xiaojun 70
xiaoli 50

[root@rocky01 ~]# awk 'NR!=1{name=$1;score=$2;if(score>=80){print name":good"}else if(score>=60){print name":pass"}else{print name":no pass"}}' score.txt
xiaoming:good
xiaohong:good
xiaojun:pass
xiaoli:no pass

 

(3.5)循环 while

语法:while (condition) {statement;…}

[root@rocky01 ~]# awk 'BEGIN{i=1;sum=0;while(i<=100){sum+=i;i++};print sum}'
5050

 

(3.6)循环 for

语法:for(expr1;expr2;expr3) {statement;…}

[root@rocky01 ~]# awk 'BEGIN{sum=0;for(i=1;i<=100;i++){sum+=i};print sum}'
5050
面试题:文件test.txt只有一行数字,计算其总和
#内容
[root@rocky01 ~]# cat test.txt
1 2 3 4 5

[root@rocky01 ~]# awk '{for(i=1;i<=NF;i++){sum+=i};print sum}' test.txt
15

 

补充:性能比较

[root@rocky01 ~]# time(awk 'BEGIN{i=1;sum=0;while(i<=1000000){sum+=i;i++};print sum}')
500000500000

real	0m0.057s
user	0m0.048s
sys	0m0.008s
[root@rocky01 ~]#
[root@rocky01 ~]# time(sum=0;for((i=1;i<=1000000;i++));do let sum+=i;done;echo $sum)
500000500000

real	0m3.475s
user	0m3.468s
sys	0m0.000s
[root@rocky01 ~]#
[root@rocky01 ~]# time(seq -s+ 1000000|bc)
500000500000

real	0m0.257s
user	0m0.076s
sys	0m0.191s

#结论:awk运算最快

 

(3.7)continue 和 break

continue 中断本次循环

break 中断整个循环

[root@rocky01 ~]# awk 'BEGIN{for(i=1;i<=100;i++){if(i==50)continue;sum+=i};print sum}'
5000

[root@rocky01 ~]# awk 'BEGIN{for(i=1;i<=100;i++){if(i==50)break;sum+=i};print sum}'
1225

 

(3.8)next

next 可以提前结束对本行处理而直接进入下一行处理(awk自身循环)

[root@rocky01 ~]# seq 10 |awk '{if($1%2!=0) next; print $0}'
2
4
6
8
10

 

(3.9)数组

awk的数组为关联数组

格式:array_name[index-expression]

  • 利用数组,实现 k/v 功能
  • 可使用任意字符串;字符串要使用双引号括起来
  • 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”
  • 若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历

[root@rocky01 ~]# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";print weekdays["mon"]}'
Monday
范例:遍历数组
[root@rocky01 ~]# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays){print i,weekdays[i]}}'
tue Tuesday
mon Monday
范例:显示主机的连接状态出现的次数
[root@rocky01 ~]# ss -ant |awk 'NR>1{state[$1]++}END{for(i in state){print i,state[i]}}'
LISTEN 4
ESTAB 2

 

(3.10) awk 函数

awk 的函数分为内置和自定义函数

(3.10.1)常见内置函数

数组处理:

  • rand():返回0和1之间一个随机数
  • srand():配合rand() 函数,生成随机数的种子
  • int():返回整数
[root@rocky01 ~]# awk 'BEGIN{srand();for(i=1;i<=3;i++){print int(rand()*100)}}'
48
24
24

字符串处理:

  • length([s]):返回指定字符串的长度
  • sub(r,s,[t]):对t字符串搜索r表示模式匹配的内容,并将第一个匹配内容替换为s
  • gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容
  • split(s,array,[r]):以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中,第一个索引值为1,第二个索引值为2
[root@rocky01 ~]# echo "2008:08:08 08:08:08" | awk 'sub(/:/,"-",$1)'
2008-08:08 08:08:08
[root@rocky01 ~]# echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"-",$1)'
2008-08-08 08:08:08
[root@rocky01 ~]# echo "2008:08:08 08:08:08" | awk 'gsub(/:/,"-",$0)'
2008-08-08 08-08-08

awk中调用shell命令

system('cmd')

空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用空格分隔,或者说除了awk的变量外其他一律用""引用起来

[root@rocky01 ~]# awk 'BEGIN{system("hostname")}'
rocky01
(3.10.2)自定义函数

自定义函数格式:

function name ( parameter, parameter, ... ) {
   statements
   return expression
}
范例
[root@rocky01 ~]# cat awk.txt
function max(x,y) {
    x>y?var=x:var=y
    return var
}
BEGIN{print max(a,b)}
[root@rocky01 ~]#
[root@rocky01 ~]# awk -v a=30 -v b=20 -f awk.txt
30

 

(3.11)awk 脚本

将awk程序写成脚本,直接调用或执行

[root@rocky01 ~]# cat test.awk
#!/bin/awk -f
#this is a awk script
{if($3>=1000)print $1,$3}
[root@rocky01 ~]# chmod +x test.awk
[root@rocky01 ~]#
[root@rocky01 ~]# ./test.awk -F: /etc/passwd
nobody 65534
rye 1000
Willoneday 1001

 


45.文件查找

非实时查找(数据库查找):locate

实时查找:find

(1)locate

  • locate 查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db
  • 索引的构建是在系统较为空闲时自动进行(周期性任务),执行updatedb可以更新数据库
  • 索引构建过程需要遍历整个根文件系统,很消耗资源
  • locate和updatedb命令来自于mlocate包

工作特点:

  • 查找速度快
  • 模糊查找
  • 非实时查找
  • 搜索的是文件的全路径,不仅仅是文件名可能只搜索用户具备读取和执行权限的目录
[root@rocky01 ~]# yum install -y mlocate
[root@rocky01 ~]# updatedb

[root@rocky01 ~]# locate /root/*.txt
/root/1.txt
/root/2.txt

(2)find 

 find 是实时查找工具,通过遍历指定路径完成文件查找

格式:

find [OPTION]... [查找路径] [查找条件] [处理动作]

 工作特点:

  • 查找速度略慢
  • 精确查找
  • 实时查找
  • 查找条件丰富
  • 可能只搜索用户具备读取和执行权限的目录

常用查找条件

  • -maxdepth level 最大搜索目录深度,指定目录下的文件为第1级
  • -mindepth level 最小搜索目录深度
  • -depth 对每个目录先处理目录内的文件,再处理目录本身
  • -name "文件名称" #支持使用glob,如:*, ?, [ ], [^],通配符要加双引号引起来
  • -iname "文件名称"  #不区分字母大小写
  • -inum n #按inode号查找
  • -samefile name #相同inode号的文件
  • -links n   #链接数为n的文件
  • -type TYPE
  • TYPE可以是以下形式:
    f: 普通文件
    d: 目录文件
    l: 符号链接文件
    s:套接字文件
    b: 块设备文件
    c: 字符设备文件
    p: 管道文件
  • -empty 空文件或目录
  • -size [+|-]#UNIT #常用单位:k, M, G,c(byte),注意大小写敏感
  • -perm 755 按权限查找
  • 按时间查找 -amin-mmin-cmin

 组合条件:

  • 与:-a ,默认多个条件是与关系,所以可以省略-a
  • 或:-o
  • 非:-not !
[root@rocky01 ~]# find /etc/ -type d -o -type l |wc -l
307

 处理动作:

  • -print:默认的处理动作,显示至屏幕
  • -ls:类似于对查找到的文件执行"ls -dils"命令格式输出
  • -fls file:查找到的所有文件的长格式信息保存至指定文件中,相当于 -ls > file
  • -delete:删除查找到的文件,慎用!
  • -ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
  • -exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令
  • { }: 用于引用查找到的文件名称自身

(3)xargs

 xargs参数替换

由于很多命令不支持管道|来传递参数,xargs用于产生某个命令的参数,xargs 可以读入 stdin 的数据,并且以空格符或回车符将 stdin 的数据分隔成为参数

[root@rocky01 ~]# echo 666 > 1.txt |xargs cat 1.txt
666

 


46.打包和解包

tar

  • -z 相当于gzip压缩工具
  • -j 相当于bzip2压缩工具
  • -J 相当于xz压缩工具

打包 .tar.gz:tar zcvf 

解包 .tar.gz:tar zxvf

 


47.管理分区

(1)lsblk 列出块设备

(2)fdisk 创建分区

(3)partprobe 同步分区表

 


48.文件系统管理

(1)mkfs 创建文件管理工具

  • mkfs.FS_TYPE /dev/DEVICE
  • mkfs -t FS_TYPE /dev/DEVICE

常用选项

  • -t {ext2|ext3|ext4|xfs} 指定文件系统类型
  • -b {1024|2048|4096}  指定块 block 大小
  • -L ‘LABEL’              设置卷标

(2)blkid 查看块设备属性信息

[root@rocky01 ~]# blkid
/dev/sda1: UUID="df2eadb3-7a9d-4a50-9c86-da809c813e29" BLOCK_SIZE="512" TYPE="xfs" PARTUUID="8e74fbd5-01"
/dev/sda2: UUID="NN7nDc-Ctth-6mM4-Ry3c-6p31-fRcX-PokMmP" TYPE="LVM2_member" PARTUUID="8e74fbd5-02"
/dev/sr0: BLOCK_SIZE="2048" UUID="2022-05-15-21-06-44-00" LABEL="Rocky-8-6-x86_64-dvd" TYPE="iso9660" PTUUID="6b8b4567" PTTYPE="dos"
/dev/mapper/rl-root: UUID="e735777d-528c-424f-90e5-d13937d806e5" BLOCK_SIZE="512" TYPE="xfs"
/dev/mapper/rl-swap: UUID="ca568363-23a7-48bc-bc29-991eaa675cde" TYPE="swap"
/dev/mapper/rl-home: UUID="59717a5b-b425-4a26-b159-c2de13a75726" BLOCK_SIZE="512" TYPE="xfs"

 


49.挂载

同一个设备可以同时挂载到多个挂载点
一个挂载点不能同时挂载多个设备

(1)mount 挂载文件系统

autofs自动挂载

#当需要使用的时候会自动挂载,例如要使用本地yum源的时候
[root@rocky01 ~]# ls /misc/ -a
.  ..
[root@rocky01 ~]# ls /misc/cd
AppStream  BaseOS  EFI  images  isolinux  LICENSE  media.repo  TRANS.TBL
[root@rocky01 ~]# ls /misc/ -a
.  ..  cd

(2)umount 卸载文件系统 

 


50.磁盘常见工具

(1)df 文件系统空间实际真正占用等信息的查看工具

常用选项

  • -H 以10为单位
  • -T 文件系统类型
  • -h human-readable
  • -i inodes instead of blocks
  • -P 以Posix兼容的格式输出

(2)du 查看某目录总体空间实际占用状态 

常用选项

  • -a  --all 显示所有文件和目录的大小,默认只显示目录大小
  • -h human-readable
  • -s   仅显示每个参数的总计
  • --max-depth=#   指定最大目录层级
  • -x, --one-file-system   #忽略不在同一个文件系统的目录

(3)dd

格式:

dd if=/PATH/FROM/SRC of=/PATH/TO/DEST  bs=# count=#

常用选项

  • if=file       从所命名文件读取而不是从标准输入
  • of=file     写到所命名的文件而不是到标准输出
  • ibs=size   一次读size个byte
  • obs=size       一次写size个byte
  • bs=size block size, 指定块大小(既是是ibs也是obs)
  • cbs=size       一次转化size个byte
  • skip=blocks   从开头忽略blocks个ibs大小的块
  • seek=blocks   从开头忽略blocks个obs大小的块
  • count=n         复制n个bs

 


51.逻辑卷管理器(LVM)

实现过程

  1. 将设备指定为物理卷
  2. 用一个或者多个物理卷来创建一个卷组,物理卷是用固定大小的物理区域(Physical Extent,PE)来定义的
  3. 在物理卷上创建的逻辑卷, 是由物理区域(PE)组成
  4. 可以在逻辑卷上创建文件系统并挂载
#相关工具来自于 lvm2 包
[root@rocky01 ~]# yum -y install lvm2

(1)pv管理工具

显示pv信息

pvs:简要pv信息显示
pvdisplay

 创建pv

[root@rocky01 ~]# pvcreate /dev/DEVICE

删除pv

[root@rocky01 ~]# pvremove /dev/DEVICE

(2)vg管理工具

显示卷组

vgs
vgdisplay

创建卷组

#示例
vgcreate -s 16M testvg /dev/sdb /dev/sdc  #-s 指定PE的大小,默认4M

删除卷组

  • 先做pvmove
  • 再做vgremove

(3) lv管理工具

 显示逻辑卷

lvs
Lvdisplay

 创建逻辑卷

#示例
lvcreate -l 60%VG -n mylv testvg
lvcreate -l 100%FREE -n yourlv testvg

 删除逻辑卷

lvremove /dev/VG_NAME/LV_NAME

范例:总

#创建物理卷
[root@rocky01 ~]# pvcreate /dev/sda3
#为卷组分配物理卷
[root@rocky01 ~]# vgcreate vg0 /dev/sda3
#从卷组创建逻辑卷
[root@rocky01 ~]# lvcreate -L 256M -n data vg0
[root@rocky01 ~]# mkfs.xfs /dev/vg0/data
#挂载
[root@rocky01 ~]# mount /dev/vg0/data /mnt/data

 


52.扩展和缩减逻辑卷

 (1)在线扩展逻辑卷

#两步实现
#第一步实现逻辑卷的空间扩展
lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
#第二步实现文件系统的扩展
#针对ext
resize2fs /dev/VG_NAME/LV_NAME
#针对xfs 
xfs_growfs MOUNTPOINT 

#一步实现容间和文件系统的扩展
lvresize -r -l +100%FREE /dev/VG_NAME/LV_NAME

(2)缩减逻辑卷

注意:缩减有数据损坏的风险,建议先备份再缩减,xfs文件系统不支持缩减

umount /dev/VG_NAME/LV_NAME
e2fsck -f /dev/VG_NAME/LV_NAME
resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]
lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME
mount /dev/VG_NAME/LV_NAME mountpoint
#或者可以简写
umount /dev/VG_NAME/LV_NAME
lvreduce  -L #[mMgGtT] -r /dev/VG_NAME/LV_NAME
mount /dev/VG_NAME/LV_NAME mountpoint

 


53.逻辑卷快照

(1)原理、特点

逻辑卷快照工作原理

  • 在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间
  • 当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中
  • 快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据

快照特点:

  • 备份速度快,瞬间完
  • 应用场景是测试环境,不能完成代替备份
  • 快照后,逻辑卷的修改速度会一定有影响

(2)实现逻辑卷快照

范例

mkfs.xfs /dev/vg0/data
mount /dev/vg0/data/ /mnt/data

#为现有逻辑卷创建快照,注意ext4建议使用-p r 实现只读
lvcreate -l 64 -s -n data-snapshot /dev/vg0/data

#挂载快照,xfs注意要使用-o ro实现只读,防止快照被修改
mkdir  -p /mnt/snap
mount -o ro,nouuid /dev/vg0/data-snapshot   /mnt/snap

#恢复快照
umount /dev/vg0/data-snapshot
umount /dev/vg0/data
lvconvert --merge /dev/vg0/data-snapshot 

#删除快照
umount /mnt/snap
lvremove /dev/vg0/data-snapshot

 


54.软件管理

(1)rpm 包管理器

功能:安装、卸载、升级、查询、校验、数据库维护

常用选项

  • -i:表示安装。
  • -v, -vv, -vvv:表示详细信息。
  • -h:以"#"号显示安装进度。
  • -q:查询指定包名。
  • -e:卸载指定包名。
  • -U:升级软件,若未软件尚未安装,则安装软件。
  • -F:升级软件。
  • -V:对RPM包进行验证
  • –nodeps:忽略依赖关系
  • -K 包校验

 

  • rpm -q:查询某一个RPM包是否已安装
  • rpm -qi:查询某一个RPM包的详细信息
  • rpm -ql:列出某RPM包中所包含的文件。
  • rpm -qf:查询某文件是哪个RPM包生成的。
  • rpm -qa:列出当前系统所有已安装的包

(3)yum和dnf

CentOS 使用 yum, dnf 解决rpm的包依赖关系

YUM: Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具,CentOS 8 用dnf 代替了yum ,不过保留了和yum的兼容性,配置也是通用的

yum和dnf用法一致

注:yum仓库指向的路径一定必须是repodata目录所在目录

yum的repo配置文件中可用的变量:

  • $releasever: 当前OS的发行版的主版本号,如:8,7,6
  • $arch: CPU架构,如:aarch64, i586, i686,x86_64等
  • $basearch:系统基础平台;i386, x86_64
  • $contentdir:表示目录,比如:centos-8,centos-7
  • $YUM0-$YUM9:自定义变量

(3.1)yum客户端配置文件

/etc/yum.conf             #为所有仓库提供公共配置
/etc/yum.repos.d/*.repo: #为每个仓库的提供配置文件

(3.2)yum服务器的baseurl形式

file:// 本地路径
http://
https://
ftp://

(3.3)仓库配置local.repo

注:需要用到前面的自动挂载autofs

[root@rocky01 yum.repos.d]# ll /misc/cd/
total 14
dr-xr-xr-x. 4 root root 2048 May 16 05:06 AppStream
dr-xr-xr-x. 4 root root 2048 May 16 05:06 BaseOS

[root@rocky01 ~]# cat /etc/yum.repos.d/local.repo
[AppStream]
name=AppStream
baseurl=file:///misc/cd/AppStream
        https://mirrors.aliyun.com/rockylinux/8/AppStream/x86_64/os/
        https://mirror.nju.edu.cn/rocky/8/AppStream/x86_64/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
       https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-Rocky-8
       https://mirror.nju.edu.cn/rocky/RPM-GPG-KEY-Rocky-8
enabled=1

[BaseOS]
name=BaseOS
baseurl=file:///misc/cd/BaseOS
        https://mirrors.aliyun.com/rockylinux/8/BaseOS/x86_64/os/
        https://mirror.nju.edu.cn/rocky/8/BaseOS/x86_64/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
       https://mirrors.aliyun.com/rockylinux/RPM-GPG-KEY-Rocky-8
       https://mirror.nju.edu.cn/rocky/RPM-GPG-KEY-Rocky-8
enabled=1

[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/$releasever/Everything/$basearch/
        https://mirror.nju.edu.cn/epel/$releasever/Everything/$basearch/
        https://mirror.tuna.tsinghua.edu.cn/epel/$releasever/Everything/$basearch/
gpgchek=1
gpgkey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-$releasever
       https://mirror.nju.edu.cn/epel/RPM-GPG-KEY-EPEL-$releasever
       https://mirror.tuna.tsinghua.edu.cn/epel/RPM-GPG-KEY-EPEL-$releasever
enabled=1
 

(3.4)显示程序包

[root@rocky01 ~]# yum list tree
Last metadata expiration check: 1:11:48 ago on Thu 28 Jul 2022 09:31:15 PM CST.
Installed Packages
tree.x86_64                              1.7.0-15.el8                              @BaseOS

#注:最后面的@BaseOS指的是用哪个源,有@代表已经安装此软件

(3.5)安装程序包

yum install package1

(3.6)查询 provides

#查看程序包详细信息
yum info mysql   #已安装和未安装都可查
rpm -qi mysql    #已安装才可查

#查看指定的特性(可以是某文件)是由哪个程序包所提供
[root@rocky01 ~]# yum provides /etc/fstab     #注:文件要写全路径,而不只是文件名,否则可能无法查询到

(3.7)仓库缓存

#清除目录/var/cache/yum/缓存
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
#构建缓存
yum makecache

#范例:管理yum缓存
[root@rocky01 ~]# du -sh /var/cache/dnf/
82M	/var/cache/dnf/
[root@rocky01 ~]# yum clean all
50 files removed
[root@rocky01 ~]# du -sh /var/cache/dnf/
1.5M	/var/cache/dnf/
[root@rocky01 ~]# yum makecache
epel                                                      5.0 MB/s |  13 MB     00:02
AppStream                                                 120 MB/s | 7.8 MB     00:00
BaseOS                                                    102 MB/s | 2.6 MB     00:00
Metadata cache created.
[root@rocky01 ~]# du -sh /var/cache/dnf/
57M	/var/cache/dnf/

(3.8)查看yum事务历史

[root@rocky01 ~]# yum history

 


56.程序包编译

(1)C 语言源代码编译安装过程

利用编译工具,通常只需要三个大的步骤

  • ./configure
    • (1) 通过选项传递参数,指定安装路径、启用特性等;执行时会参考用户的指定以及Makefile.in文件生成Makefile
    • (2) 检查依赖到的外部环境,如依赖的软件包
    • 选项
    • ./configure --help
    • ./configure --prefix=/PATH:指定默认安装位置,默认为/usr/local/
  • make 根据Makefile文件,会检测依赖的环境,进行构建应用程序
    • make -j 2  -j 后面加内核数
  • make install 复制文件到相应路径

注意:安装前可以通过查看README,INSTALL获取帮助

(2)编译安装实战案例

#1 安装相关的依赖包
[root@rocky01 ~]# yum install gcc make

#2 下载源码并解压
[root@rocky01 ~]# tar xvf tree-1.8.0.tgz

#3 进入解压缩的目录,README和INSTALL 
[root@rocky01 ~]# cd tree-1.8.0/
[root@rocky01 tree-1.8.0]# cat README 
[root@rocky01 tree-1.8.0]# cat INSTALL 

#4 修改源码的版本号
[root@rocky01 tree-1.8.0]# sed -i 's#v1\.8\.0#v8.8.8#' tree.c

#5 编译准备
5.4.4.2 编译安装 cmatrix
[root@rocky01 tree-1.8.0]# vim Makefile
prefix = /apps/tree

#6 编译
[root@rocky01 tree-1.8.0]# make 

#7 安装
[root@rocky01 tree-1.8.0]# make install

#8 修改PATH变量
#默认无法直接运行tree
[root@rocky01 ~]# tree
-bash: tree: command not found
[root@rocky01 ~]# echo 'PATH=/apps/tree/bin:$PATH' > /etc/profile.d/tree.sh
. /etc/profile.d/tree.sh
#或者利用软链接实现
[root@rocky01 ~]# ln -s /apps/tree/bin/tree /usr/local/bin

#9 验证结果
[root@rocky01 ~]# tree --version
tree v8.8.8 (c) 1996 - 2018 by Steve Baker, Thomas Moore, Francesc Rocher, 
Florian Sesser, Kyosuke Tokoro

#10 添加man帮助
#默认无法查看man
[root@rocky01 ~]# man tree
No manual entry for tree
[root@rocky01 ~]# vim /etc/man_db.conf
MANDATORY_MANPATH           /apps/tree/man  
[root@rocky01 ~]# man tree

#11 运行tree查看生成的文件列表
[root@rocky01 ~]# tree /apps/tree
/apps/tree
├── bin
│   └── tree
└── man
   └── man1
       └── tree.1

 


57.Ubuntu软件管理

(1)dpkg

类似于rpm,因为安装包可能会有依赖关系,所以用的比较少

常见用法

  • dpkg -i package.deb  安装包,不支持包的依赖
  • dpkg -r package         删除包,不建议,不自动卸载依赖于它的包
  • dpkg -P package        删除包(包括配置文件)
  • dpkg -l                       列出当前已安装的包,类似rpm -qa
  • dpkg -l package        显示该包的简要说明
  • dpkg -s package        列出该包的状态,包括详细信息,类似rpm –qi
  • dpkg -L package        列出该包中所包含的文件,类似rpm –ql
  • dpkg -S <pattern>     搜索包含pattern的包,类似rpm –qf 

(2)apt

Debian 使用apt 工具集来管理包系统,apt-get 是其中一个常用的命令行工具,另外一款较为流行的命令行与 GUI 兼顾的工具是 aptitude ,之前最常用的 Linux 包管理命令都被分散在了 apt-get、apt-cache 和 apt-confifig 这三条命令中

在 2014 年apt 命令发布第一个稳定版,Ubuntu 16.04 引入新特性之一便是 apt 命令,apt 命令解决了命令过于分散的问题,它包括 apt-get 命令出现以来使用最广泛的功能选项,以及 apt-cache 和 aptconfifig 命令中很少用到的功能。在使用 apt 命令时,用户不必再由 apt-get 转到 apt-cache 或 apt-confifig,提供管理软件包所需的必要选项

apt 相当于 apt-get、apt-cache 和 apt-confifig 中最常用命令选项的集合

apt 命令 被取代的命令 命令的功能
apt install apt-get install 安装软件包
apt remove apt-get remove 移除软件包
apt purge apt-get purge 移除软件包及配置文件
apt update apt-get update 刷新存储库索引
apt upgrade apt-get upgrade 升级所有可升级的软件包
apt autoremove apt-get autoremove 自动删除不需要的包
apt full-upgrade apt-get dist-upgrade 在升级软件包时自动处理依赖关系
apt search apt-cache search 搜索应用程序
apt show apt-cache show 显示装细节

#查看仓库中软件包有哪些版本可以安装
apt-cache madison nginx 

 

#安装软件包的时候指定安装具体的版本
apt install nginx=1.14.0-0ubuntu1.6 

 

#查看文件来自于哪个包(需要安装apt install apt-file) 类似redhat中的yum provides <filename>
apt-file search 'string'  #默认是包含此字符串的文件
apt-file search -x  '正则表达式'
apt-file search -F /path/file

相关内容

    暂无相关文章