Linux 面试宝典

Linux 面试宝典

一、计算机基础部分

1.第一台计算机诞生的时间为:1946年。
2.冯诺依曼体系体系结构。

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

3.二进制和十进制转换。
二进制和十进制之间转换可根据下表操作。

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

4.Unix的哲学思想?

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

5.硬盘存储术语CHS:

  • head:磁头 磁头数=盘面数
  • track:磁道 磁道数=柱面数
  • sector:扇区,512bytes
  • cylinder:柱面 1柱面=512sector数/trackhead数 大概8M

6.识别SSD和机械硬盘类型?
备注:1表示机械盘,0表示SSD盘

#lsblk -d -o name,rota
NAME ROTA
sda     1
sdb     1
sdc     1

7.MBR分区:使用32位表示扇区数,分区的磁盘不能超过2T。MBR分区中一块硬盘最多有4个主分区,也可以3主分区+1个扩展分区,多个逻辑分区。主分区和扩展分区对应的1-4,逻辑分区从5开始。

8.GPT分区,支持128个分区,使用64位,支持8Z
UEFI统一可扩展固件接口,硬件支持GPT,是得操作系统可以使用。

9.管理磁盘常用命令:
lsblk -->列出块设备
创建分区命令:
fdisk:管理MBR分区
gdisk:管理GPT分区
parted:高级分区,可以是交互式或非交互式
注意:parted的操作都是实时生效的,小心使用。
partprobe:更新内存中的磁盘分区表版本,适用于处CentOS6以为的其他版本5,7,8

10.mount挂载:
默认权限相当于rw, suid, dev, exec, auto, nouser, async
挂载规则:
一个挂载点同一时间只能挂载一个设备
一个挂载点同一时间挂载了多个设备,只能看到最后一个设备的数据,其它设备上的数据将被隐藏
一个设备可以同时挂载到多个挂载点
通常挂载点一般是已存在空的目录

将挂载保存到 /etc/fstab 中可以下次开机时,自动启用挂载

11.swap交换分区:

  1. 创建交换分区或者文件
  2. 使用mkswap写入特殊签名
  3. 在/etc/fstab文件中添加适当的条目
  4. 使用swapon -a 激活交换空间

swapon 启用交换分区。
swapoff 关闭交换分区。

-a:激活所有的交换分区
-p PRIORITY:指定优先级,也可在/etc/fstab 在第4列指定:pri=value

SWAP交换分区可以指定swap分区0到32767的优先级,值越大优先级越高
系统默认从-1开始,每加一个新的交换分区,给该交换分区的优先级减一

12.官方推荐系统swap空间:

系统中的RAM量推荐的swap空间允许休眠的建议swap空间大小
低于2GBRAM量的2倍数RAM容量的三倍
2GB-8GB等于RAM量RAM量的倍数
8GB-64GB4GB到RAM容量的0.5倍RAM容量的1.5倍
超过64GB独立负载(至少4GB)不建议使用休眠功能

后面搭建k8s时,需要禁用swap
13. RAID0、RAID1、RAID5、RAID6、RAID10之间的区别:

RAID等级最少硬盘最大容错可用容量读取性能写入性能安全性目的应用场景
010nnn一个硬盘异常,全部硬盘都会异常追求最大容量、速度影片剪接,缓存用途
12n-11n1高,一个正常即可追求最大安全性个人、企业备份
531n-1n-1n-1最求最大容量、最小预算个人、企业备份
642n-2n-2n-2安全性较RAID5高同RAID5,但教安全个人、企业备份
104综合RAID0/1优点,理论速度较快大型数据库、服务器

14.df与du的区别?什么时间df>du;什么时间df<du
区别:
文件系统空间实际真正占用等信息的查看工具 df
查看某目录总体空间实际占用状态 du,显示指定目录下面各个子目录的大小,单位为KB
当删除文件但不释放空间时,有什么不同?(du 查看文件空间释放,df不释放)
du查看文件以删除,空间释放;df查看文件系统不释放。
du从文件的角度看,df从分区空间的使用角度看(df可用看到的时真实的)。

df>du是在分区刚挂好的时候,默认地df>du
df<du是在分区目录下挂了新的设备时

网络部分

1.网络的功能和优点

  • 数据和应用程序

  • 资源

  • 网络存储

  • 备份设备
    2.网络分类:

  • 广域网

  • 城域网

  • 局域网

3.开放系统互联OSI模型:

分层名称功能每层功能概览对应物理设备及对应的协议单位
7应用层针对特定应用的协议电子邮件、远程登陆、文件传输HPPT、FTP、SSH、MySQl等消息 message
6表示层设备固有数据格式和网络标准数据格式的转换。接收不同变现形式的信息,如文字、图像、声音等消息 message
5会话层通信管理。负责建立和断开通信连接。管理传输层一下的分层何时建立连接,何时断开连接以及保持多久的连接消息 message
4传承层管理两个节点之间的数据传输。负责可靠传输是否有数据丢失?TCP数据段 segment
3网络层地址管理与路由选择经过那个路由传递到目标地址?路由器 IP数据包 packet
2数据链路层互连设备之间传递和识别数据帧数据帧与比特流之间的转换(分段发送)交换机、 MAC数据帧 frame
1物理层以“0”、“1”代表电压的高低,灯光的闪灭。界定连接器和网线的规格。比特流与电子信号之间的切换。连接器与网线的规格数据位 bit

4.网络的三种通讯模式:

  1. unicast:单播,目标设备是一个
  2. broadcast:广播,目标设备时所有
  3. multicast:多播,组播,目标设备时多个

5.冲突域和广播域
冲突域:两个网络设备同时发送数据,如果发生了冲突,则两个设备处于同一个冲突域,反之,则各自处于不同的冲突域
广播域:一个网络设备发送广播,另一个设备收到了,则两个设备处于同一个广播域,反之,则各自处于不同的广播域

6.网络的三种通讯机制:

  1. 单工通信:只有一个方向的通信,比如:收音机
  2. 半双工通信:通信双方都可以发送和接收信息,但不能同时发送,也不能同时接收,比如:对讲机
  3. 全双工通信:通信双方可以同时发送和同时接收,比如:手机

7.局域网的特点、功能、优点:
特点:网络为一个单位所拥有;地理范围和站点数目均有限
主要功能:资源共享和数据通信
优点:能方便地共享昂贵的外部设备,主机以及软件、数据。从一个站点可以访问权威;便于系统的扩展和逐渐演变,各设备的位置可灵活的调整和改变;提高系统的可靠性、可用性、易用性。

8.超5类线的双绞线(Twisted-Pair)网线线序
T568B和T568A
T568B的线序为:橙白、橙、绿白、蓝、蓝白、绿、棕白、棕
T568A的线序为:白绿 绿 白橙 蓝 白蓝 橙 白棕 棕

9.网线线缆和接口

  • Twisted-Pair 双绞线—>RJ-45 Connector和Jack
  • Coaxial
  • Fiber-Optic 光纤

10.网桥和交换机:
网桥bridge:也叫桥接器,是连接两个局域网的一种存储/转发设备,根据MAC地址表对数据帧进行转发,可隔离碰撞域。网桥将网络的多个网段在数据链路层连接起来,并对网络数据帧进行管理
交换机:是工作在OSI参考模型数据链路层的设备,外表和集线器相似
它通过判断数据帧的目的MAC地址,从而将数据帧从合适端口发送出去
交换机是通过MAC地址的学习和维护更新机制来实现数据帧的转发。
交换机的工作原理:
(1)交换机根据收到数据帧中的源MAC地址建立该地址同交换机端口的映射,并将其写入MAC地址表中
(2)交换机将数据帧中的目的MAC地址同已建立的MAC地址表进行比较,以决定由哪个端口进行转发
(3)如数据帧中的目的MAC地址不在MAC地址表中,则向所有端口转发。这一过程称为泛洪(flood)
(4)广播帧和组播帧向所有的端口转发

11.路由器:
路由:把一个数据包从一个设备发送到不同网络里的另一个设备上去。这些工作依靠路由器来完成。路由器只关心网络的状态和决定网络中的最佳路径。路由的实现依靠路由器中的路由表来完成
路由器功能:

  • 工作在网络层
  • 分隔广播域和冲突域
  • 选择路由表中到达目标最好的路径
  • 维护和检查路由信息
  • 连接广域网

12.虚拟局域网VLAN
VLAN工作原理:虚拟局域网 VLAN 是由一些局域网网段构成的与物理位置无关的逻辑组。这些网段具有某些共同的需求。每一个 VLAN 的帧都有一个明确的标识符,指明发送这个帧的工作站是属于哪一个 VLAN。虚拟局域网其实只是局域网给用户提供的一种服务,而并不是一种新型局域网。

13.VALN的优点:

  1. 更有效地共享网络资源。如果用交换机构成较大的局域网,大量的广播报文就会使网络性能下降。VLAN能将广播报文限制在本VLAN范围内,从而提升了网络的效能。
  2. 简化网络管理。当结点物理位置发生变化时,如跨越多个局域网,通过逻辑上配置VLAN即可形成网络设备的逻辑组,无需重新布线和改变IP地址等。这些逻辑组可以跨越一个或多个二层交换机。
  3. 提高网络的数据安全性。一个VLAN中的结点接收不到另一个VLAN中其他结点的帧。

虚拟局域网的实现技术
(1)基于端口的VLAN
(2)基于MAC地址的VLAN
(3)基于协议的VLAN
(4)基于网络地址的VLAN

14.TCP/IP
Transmission Control Protocol/Internet Protocol 传输控制协议/因特网互联协议
TCP/IP是一个Protocol Stack,包括TCP、IP、UDP、ICMP、RIP、TELNET、FTP、SMTP、ARP等许多协议

15.TCP/IP分层
TCP/IP4层模型
应用层---->应用层、表示层、会话层
传输层---->传输层
互联网层---->网络层
网络接口层---->数据链路层、物理层

16.TCP/IP和OSI模型的比较
相同点:两者都是以协议栈的概念为基础;协议栈种的协议批次相互独立;下层对上层提供服务。
不同点:OSI是先有模型;TCP/IP 是先有协议,后有模型
OSI是国际标准,适用于各种协议;TCP/IP实际标准,只适用于TCP/IP网络;
层次数量不同

17.TCP和UDP

ReliableBest-Effort
Connection TypeConnection-orientedConnectionless
ProtocolTCPUDP
SequencingYesNo
UsesE-mail、File sharing、DownloadingVoice streaming、Video streaming

18.TCP头结构(理解)
源端口、目标端口:源/目标端口用16位表示的,可得计算机端口个数位:2^16个,即65536个
序列号:表本报文段所发送数据的第一个字节的编号。TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每2^32个字节,就会出现序列号回绕,再次从0 开始。
确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送方:我希望你(指发送方)下次发送的数据的第一个字节数据的编号为此确认号。
数据偏移:表示TCP报文段的首部长度,该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节
URG:表示本报文段中发送的数据是否包含紧急数据。后面的紧急指针字段(urgent pointer)只有当URG=1时才有效。
ACK:表示是否前面确认号字段是否有效。只有当ACK=1时,前面的确认号字段才有效。TCP规定,连接建立后,ACK必须为1,带ACK标志的TCP报文段称为确认报文段。
PSH:提示接收端应用程序应该立即从TCP接收缓冲区中读走数据,为接收后续数据腾出空间。如果为1,则表示对方应当立即把数据提交给上层应用,而不是缓存起来,如果应用程序不将接收到的数据读走,就会一直停留在TCP接收缓冲区中。
RST:如果收到一个RST=1的报文,说明与主机的连接出现了严重错误(如主机崩溃),必须释放连接,然后再重新建立连接。或者说明上次发送给主机的数据有问题,主机拒绝响应,带RST标志的TCP报文段称为复位报文段。
SYN:在建立连接时使用,用来同步序号。当SYN=1,ACK=0时,表示这是一个请求建立连接的报文段;当SYN=1,ACK=1时,表示对方同意建立连接。SYN=1,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中SYN才置为1,带SYN标志的TCP报文段称为同步报文段。
FIN:表示通知对方本端要关闭连接了,标记数据是否发送完毕。如果FIN=1,即告诉对方:“我的数据已经发送完毕,你可以释放连接了”,带FIN标志的TCP报文段称为结束报文段。
窗口大小:表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,达到此值,需要ACK确认后才能再继续传送后面数据,由Window size value * Window size scaling factor(此值在三次握手阶段TCP选项Window scale协商得到)得出此值。
校验和:提供额外的可靠性。
紧急指针:标记紧急数据在数据字段中的位置。
选项部分:其最大长度可根据TCP首部长度进行推算。TCP首部长度用4位表示,选项部分最长为:(2^4-1)*4-20=40字节

19.三次握手和四次挥手
TCP三次握手:客户A与服务器B通信
A主动向B发起请求SYN=1,seq=x
B收到后,返回一个SYN=1,ACK=1,seq=y,ack=x+1
然后,A在给B发送一个ACK=1,seq=x+1,ack=y+1 确认建立连接,开始传递数据。
TCP四次挥手:客户端A与服务器B
A主动发起关闭FIN=1,seq=u 这时A处于终止等待状态(FIN-WAIT1)
B收到后返回一个ACK=1,seq=v,ack=u+1 这时B处于关闭等待状态(CLOSE-WAIT)
这个时候可能还会有数据传送。等待数据传送完后
B在给A发个关闭确认请求FIN=1,ACK=1,seq=w,ack=u+1 这时B处于最后确认状态(LAST-ACK)A处于终止等待状态2(FIN-WAIT2)
A等待2s后返回确认断开ACK=1,seq=u+1,ack=w+1 A处于时间等待状态(TIME-WAIT)

20.UDP特性
工作在传输层、提供不可靠的网络访问、非面向连接协议、有限的错误检查、传输性能高、无数据恢复特性

21.Internet协议

  • 运行在OSI网络层
  • 面向无连接的协议
  • 独立处理数据包
  • 分层编址
  • 尽力而为传输
  • 无数据恢复功能

24

25.IP地址可唯一标识IP网络中的每台设备,每台主机(计算机、网络设备、外围设备)必须有唯一的地址。(IP地址是一个32位二进制数)
IP地址由两部分组成
网络 ID:标识网络,每个网段分配一个网络ID,处于高位
主机 ID:标识单个主机,由组织分配给各设备,处于低位
IPv4地址格式:点分十进制记法

26.IP地址分类

  • A类:0-127
    网络ID位是最高8位,主机ID是24位低位
    网络数:126=2^7(可变是的网络ID位数)-2
    每个网络中的主机数:2^24-2=16777214
    默认子网掩码:255.0.0.0
    私网地址:10.0.0.0

  • B类:128-191
    网络ID位是最高16位,主机ID是16位低位
    网络数:2^14=16384
    每个网络中的主机数:2^16-2=65534
    默认子网掩码:255.255.0.0
    私网地址:172.16.0.0-172.31.0.0

  • C类:192-223
    网络数:2^21=2097152
    每个网络中的主机数:2^8-2=254
    默认子网掩码:255.255.255.0
    私网地址:192.168.0.0-192.168.255.0

  • D类:组(多)播,1110 0000 - 1110 1111.X.Y.Z: 224-239.X.Y.Z

  • 保留未使用,240-255

27.CIDR:无类域间路由,目前的网络已不再按A,B,C类划分网段,可以任意指定网段的范围,网络ID位不固定,按需指定 。
CIDR 无类域间路由表示法:IP/网络ID位数,如:172.16.0.100/16
netmask: 子网掩码 32bit二进制,和IP成对使用,对应于IP中网络ID为1,对应于主机ID为0

28.子网掩码
子网掩码的8位:
128 64 32 16 8 4 2 1
——————————
1 0 0 0 0 0 0 0 =128
1 1 0 0 0 0 0 0 =192
1 1 1 0 0 0 0 0 =224
1 1 1 1 0 0 0 0 =240
1 1 1 1 1 0 0 0 =248
1 1 1 1 1 1 0 0 =252
1 1 1 1 1 1 1 0 =254
1 1 1 1 1 1 1 1 =255

29.相关公式

  • 一个网络的最多的主机数=2^主机ID位数-2
  • 网络(段)数=2^网络ID中可变的位数
  • 网络ID=IP与netmask

用自已的子网掩码分别和自已的IP及对方的IP相与,比较结果,相同则同一网络,不同则不同网段

30.203.101.123.163/28

  1. netmask: 255.255.255.240
  2. 主机数:2^(32-28)-2=14
  3. IP范围:最小IP? 203.101.123.161最大IP?203.101.123.174

31.划分子网: 将一个大网(主机数量多,主机ID位多)分割成多个小网(主机数量少,主机ID位少) ,网络ID向主机ID借N位,将划分成个2^N子网

32.中国移动10.0.0.0/8 给32个各省公司划分对应的子网。
1)每个省公司的子网的netmask? 2^5>=32 借5位网络ID
8+5=13
255.248.0.0

2)每个省公司的子网的主机数有多少?
2^(32-13)-2=524286

3)河南省得到第10个子网,网络ID?
10.00000 000.0.0/13
10.01001 000.0.0/13
10.72.0.0/13

4)河南省得到第10个子网的最小IP和最大的IP?
10.01001 000.0.1
10.01001 111.11111111.11111110
10.72.0.1—10.79.255.254

5)所有子网中最大,最小的子网的netid?
10.00000 000.0.0/13 10.0.0.0/13
10.11111 000.0.0/13 10.248.0.0/13

33.计算公式
主机数=2^主机ID-2
网络数=2^可变网络ID
网络ID=IP与netmask

34.路由
网络路由: 表示一个网段的路由
主机路由: 表示一个主机的路由
默认路由: 所有未知网段的路由 0.0.0.0/0

路由表组成: 四个组成部分
1)目标网络: 目标主机所在网络ID 172.16.0.0
2)netmask:
3)接口: 当前网络设备的出口
4)网关: 下一个路由器的临近当前路由器的接口的IP,下一跳 next hop

metric: 费用,值越小,优先级越高

后续再不断更新……

二、Linux基础部分

1.什么是shell?
Shell是Linux系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
Shell也被称为Linux的命令解释器,Shell本身是一个程序。
2.Linux下的文件类型有:

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

3.软连接与硬链接的区别:

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

4.下面那个些选项不是将标准输出和错误都重定向到同一个文件中的(E)。
A.[root@centos8 ~]#ls /data /xxx > /data/all.log 2>&1
B.[root@centos8 ~]#ls /data /xxx 2> /data/all.log 1>&2
C.[root@centos8 ~]#ls /data /xxx &> /data/all.log
D.[root@centos8 ~]#ls /data /xxx >& /data/all.log
E.[root@centos8 ~]#ls /data /xxx 2>&1 > /data/all.log

5.案例1:提示空间满No space left on device,但df可以看到空间很多,为什么?
答:因为改分区的incode号使用完了,小文件太多,清理掉不用的小文件就可以了。

6.案例2:提示空间快满了,使用rm删除了很大的无用文件后,df依然看到空间不足,为什么?如何解决?
答:因为使用rm删除的文件,可能被删除的文件还在被程序占用的。需要用 # lsof | grep deleted 命令找到被删除的文件。然后在kill掉相应的进程就行了。
删除大文件,正确的姿势:

#cat /dev/null > /var/log/huge.log#> /data/file.log

7.Linux中的目录和文件的权限区别?(分别说明读,写和执行权限的区别)

区别类型目录文件
读 ( r )使用ls命令查看目录文件使用文件类查看工具,如cat查看文件内容
写 ( w )可以在目录下创建/删除文件及目录可以修改文件中的内容
执行( x )可cd目录,执行ls -l查看目录元数据(需要配合r权限)可将文件在系统中运行

8.执行 cp /etc/issue /data/dir/ 所需要的最小权限?(ABCDE)
A./bin/cp 需要x权限
B./etc/ 需要x权限
C./etc/issue 需要r权限
D./data 需要x权限
E./data/dir 需要w,x权限

9.误将 /bin/chmod 文件的执行权限删除,如何恢复?
解决:两种办法,一种是直接把root用户设置ACL权限,另外一种是将root组设置ACL权限。

10.ACL生效的顺序是?
所有者,自定义用户,所属组/自定义组,其他人

11.误删除了用户git的家目录,如何重建并恢复该用户家目录及相应的权限属性?

cp -a /etc/skel/. /home/git
chown git:git /home/git
chmod 700 /home/git

12.Linux中新建文件和目录的默认权限为?
新建文件的默认权限: 666-umask,如果所得结果某位存在执行(奇数)权限,则将其权限+1,偶数不变
新建目录的默认权限: 777-umask
非特权用户umask默认是 002
root的umask 默认是 022

13.Linux安全模型:
资源分派:
Authentication:认证,验证用户身份
Authorization:授权,不同的用户设置不同权限
Accouting|Audition:审计

14.CentOS7/8中生成12位数的随机密码:

#tr -dc '[:alnum:]' < /dev/urandom | head -c 12 

15.CentOS6/7/8中生成sha512加密密码的方法:

CentOS6:
[root@CentOS6 ~]#grub-crypt --sha-512
CentOS7:
[root@centos7-8 ~]#python -c 'import crypt,getpass;pw="<密码>";print(crypt.crypt(pw))'
CentOS8:
[20:08:05 root@centos8 ~]#openssl passwd -6 <密码>

16.判断一个账户是否为管理员,通过该用户的uid号是否为0来判断。

17.Linux系统中文本查看工具的命令有:cat、nl、tac、rev、more、less、head、tail等

18.统计文件中客户访问前10名的IP信息

#cut -d' ' -f1 文件名 |sort |uniq -c| sort -nr | head

备注:该文件的第一列为客户IP

19.找到file1和file2文件中重复的行和不重复的行

#cat file1 file2 | sort | uniq -d		#重复的行
#cat file1 file2 | sort | uniq -u		#不重复的行

#grep -f file1 file2	#找到两个文件相同行,将第一个文件作为正则表达式

20.用正则表达式表示QQ、邮箱、手机号码:

QQ:\<[0-9]{6,12}\>

邮箱:[[:alnum:]_]+@[[:alnum:]_]+\.[[:alnum:]_]+

手机号:\<1[356789][0-9]{9}\>

21.如何查看当前进程的环境变量?
通过进程号查看对应的环境变量。

#pstree -p | grep sshd  
           |-sshd(37685)---sshd(46034)---sshd(46036)-+-bash(46037)-+-grep(49593)
#cat /proc/46037/environ

22.变量的分类:
内置变量和自定义变量
自定义变量又分为普通变量、环境变量、只读变量
特殊变量:位置变量、状态变量
位置变量:

$1 $2 $3……
$*=$@
$0
$#

状态变量:

#echo $?
0

状态变量是查看上一条命令执行的结果,是否成功。
结果为0,则成功;结果为1-255为失败。

23.判断磁盘使用率大于80发告警邮件的小脚本。
后续可以加定时任务,让其自动发邮件。

#cat disk_check.sh 
#!/bin/bash
WARING=80
DISK=`df | grep  "^/dev/sd" |grep -Eo '[0-9]+%' |grep -Eo '[0-9]+' | sort -rn | head -n1`

[ $DISK -ge $WARING ] && echo Disk will be full | mail -s 'Disk Warning' QQ号@qq.com

24.利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255

0-9:#echo {0..255} |tr ' ' '\n'|grep -E '^[0-9]{1}$'
10-99:#seq 255 |grep -E '^[0-9]{2}$'
100-199:#seq 1 255 |grep -E '[0-9]{3}$' |grep '^1[0-9].*'
200-249:#seq 255 |grep -E '^2[0-4][0-9]$'
250-255:#seq 255 |grep -E '^25[0-5]$' 

25.异域实现变量互换:

#x=10;y=20;x=$[x^y];y=$[x^y];x=$[x^y];echo x=$x,y=$y
x=20,y=10

26.xargs命令的默认功能是接收键盘的标准输入,把输入的结果用xargs传给后续的命令作为参数,默认会将换行换成空格。用xargs可以把一些命令的参数动态生成。

#echo {1..5} 
1 2 3 4 5
#echo {1..5} |xargs -n1
1
2
3
4
5
#echo {1..5} |xargs -n2
1 2
3 4
5
#批量创建用户
#for i in {1..10};do useradd user$i;done
#批量删除用户
#echo user{1..10}|xargs -n1 userdel -r
#getent passwd

#find /bin/ -perm /7000 |xargs ls -Sl
-rwxr-sr-x. 1 root screen  494040 May  5 18:04 /bin/screen
---s--x--x. 1 root root    165608 May 19  2020 /bin/sudo
-rwsr-xr-x. 1 root root     84296 Aug 13  2020 /bin/gpasswd
-rwsr-xr-x. 1 root root     79648 Aug 13  2020 /bin/chage
-rwsr-xr-x. 1 root root     65904 Nov  9  2019 /bin/crontab
-rwsr-xr-x. 1 root root     61688 May 11  2019 /bin/at
……
#指定字符nul分隔(ascii的0分隔),默认空格分隔
#find -type f -name "*.txt" -print0 |xargs -0 rm

27.使用xargs批量下载视频:
-P3指3个同时下载

#yum install python3-pip -y
#pip3 install you-get
#seq 10 | xargs -i -P3 you-get https://www.bilibili.com/video/BV1HZ4y1p7Bf?p={}

28.统计Linux最新内核的C源码行数:

#cd linux-5.14.5/
#for file in `find -name "*.c"`;do line=`cat $file |wc -l`;let sum+=line;done;echo $sum
20925307#cat `find -name '*.c'` |wc -l
20925307#find -name "*.c" |xargs cat |wc -l
20925307

29.统计光盘BaseOS库目录下的rpm的架构类型及相应的包数量:

#pwd
/misc/cd/BaseOS/Packages
#ls *.rpm |grep -Eo '[^.]+\.rpm$'|grep -Eo '^[^.]+' |sort |uniq -c
    396 i686
    224 noarch
   1074 x86_64
或
#ls *.rpm |rev|cut -d. -f2|rev |sort |uniq -c
    396 i686
    224 noarch
   1074 x86_64
或
#ls *.rpm |sed -nr 's/.*\.([^.]+)\.rpm$/\1/p' |sort | uniq -c
    396 i686
    224 noarch
   1074 x86_64
Linxu文本处理三剑客
文本处理三剑客之grep

1.过滤掉文本中#开头或空行:

#grep -v '^[[:space:]]*#' /etc/httpd/conf/httpd.conf | grep -v '^$' `#grep -vE '^[[:space:]]*#|^$' /etc/httpd/conf/httpd.conf

2.统计#ss -nta命令的状态出现的次数

#grep -v '^State' ss2.log |grep -Eo '^[[:alpha:]-]+\>' |sort | uniq -c#grep -v '^State' ss2.log | cut -d' ' -f1 | sort | uniq -c

3.获取ss -nt命令下的连接IP数量:

#`ss -nt | grep -v '^State' | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]+ *$'| grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' |uniq -c`

4.获取文档中的年龄和:

#cat user.txt 
xiaoming=18
xiaohong=33
wangwu=25
lisi=22
#cut -d'=' -f2 user.txt | paste -d+ -s|bc#grep -Eo '[0-9]+' user.txt |paste -d+ -s |bc#grep -Eo '[0-9]+' user.txt |tr '\n' + |grep -o '^.*[^+]' | bc

5.显示CentOS7上所有UID小于1000以内的用户名和UID

cut -d: -f1,3 /etc/passwd|grep '^.*\:[0-9]\{1,3\}$'

6.获取Linux系统中的IP地址:

#ifconfig ens33| grep -i mask | grep -o '[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}.[0-9]\{1,3\}' | head -1#ifconfig ens33 | grep -i mask | grep -o '\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}' | head -1#ifconfig ens33 | grep -i mask | grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' | head -1 

7.利用df和grep,取出磁盘各分区利用率,并从大到小排序。

#df |grep -Eo "[0-9]{1,3}%" |sort -nr
100%
24%
6%
3%
2%
2%
1%
0%

8.添加用户bash、testbash、basher、sh、nologin(其shell为/sbin/nologin),找出/etc/passwd用户名和shell同名的行.

#cat /etc/passwd |grep '\(^[[:alnum:]]\+\b\).*/\1$'
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
nologin:x:968:967::/home/nologin:/sbin/nologin
或 扩展正则表达式:
#cat /etc/passwd | grep -E "(^[[:alnum:]]+\b).*/\1$"
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
nologin:x:968:967::/home/nologin:/sbin/nologin

9.显示ifconfig命令结果中所有IPv4地址.

#ifconfig |grep -Ewo "(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])" |head -n1

10.显示三个用户root、mage、wang的UID和默认shell

#cut -d: -f1,3,7 /etc/passwd |grep -e '^root' -e 'mage' -e 'wang' |cut -d: -f2,3
0:/bin/bash
1001:/bin/bash
1003:/bin/bash

11.找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行。

#cat /etc/rc.d/init.d/functions |grep -E '^[a-Z_]+\(.*'#cat /etc/rc.d/init.d/functions |grep -E '^[[:alpha:]_]+\(.*'
checkpid() {
__kill_pids_term_kill_checkpids() {
__kill_pids_term_kill() {
__pids_var_run() {
__pids_pidof() {
daemon() {
killproc() {
……

12.使用egrep取出/etc/rc.d/init.d/functions中其基名。

#echo /etc/rc.d/init.d/functions |egrep -w '[a-z]{9}'
/etc/rc.d/init.d/functions

13.使用egrep取出上面路径的目录名。

#echo "/etc/rc.d/init.d/functions" |egrep "^/[a-z./]{15}"
/etc/rc.d/init.d/functions

14.统计last命令中以root登录的每个主机IP地址登录次数。

#last |grep "^root" |grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' |sort |uniq -c
     62 10.0.0.1

15.将此字符串:welcome to redhat linux 中的每个字符去重并排序,重复次数多的排到前面

#echo "welcome to redhat linux" | tr -d ' '| grep -o '[a-z]' |sort |uniq -c |sort -nr
      3 e
      2 t
      2 o
      2 l
      1 x
      1 w
      1 u
      1 r
      1 n
      1 m
      1 i
      1 h
      1 d
      1 c
      1 a
文本处理三剑客之sed

Sed是从文件或管道中读取一行,处理一行,输出一行;在读取一行,再处理一行,再输出一行,直到最后一行。sed被称为是行处理器。
常用选项:-n:关闭自动打印 -e:多点编译 -r,-E:使用正则表达式 -i.bak:备份文件并编辑
#说明: -ir 不支持、-i -r 支持、-ri 支持、-ni 会清空文件
1.获取文件的目录名和基名

#echo /etc/sysconfig/network-scripts/ifcfg-ens33 |sed -rn 's@(.*)/([^/]+)@\1@p'
/etc/sysconfig/network-scripts
#echo /etc/sysconfig/network-scripts/ifcfg-ens33 |sed -rn 's@(.*)/([^/]+)@\2@p'
ifcfg-ens33
#echo "/etc/sysconfig/network-scripts/" |sed -r 's#(^/.*/)([^/]+)#\1#'  
/etc/sysconfig/network-scripts/
#echo "/etc/sysconfig/network-scripts/" |sed -r 's#(^/.*/)([^/]+)/?#\2#' 
network-scripts

2.使用sed初始化网卡名:

#初始化网卡名
#cat /etc/default/grub 
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto resume=UUID=01a2c83f-8c53-4db4-94ce-294abd850f64 rhgb quiet net.ifnames=0"
GRUB_DISABLE_RECOVERY="true"
GRUB_ENABLE_BLSCFG=true
方法一:
#sed -ri.bak '/^GRUB_CMDLINE_LINUX=/s#(.*)"$#\1 net.ifnames=0"#' /etc/default/grub 
方法二:
#sed -ri.bak '/^GRUB_CMDLINE_LINUX=/s@"$@ net.ifnames=0"@' /etc/default/grub
#然后在执行
#CentOS:
[root@centos8 ~]#grub2-mkconfig -o /boot/grub2/grub.cfg ;reboot
#ubuntu:
[root@ubuntu ~]#grub-mkconfig -o /boot/grub/grub.cfg

3.使用sed获取IP地址的多少写法:

#ifconfig eth0 | sed -nr "2s/[^0-9]+([0-9.]+).*/\1/p"
10.0.0.154
#ifconfig eth0|sed -En '2s/^[^0-9]+([0-9.]{7,15}).*/\1/p'
10.0.0.154
#ifconfig eth0|sed -rn '2s/^[^0-9]+([0-9.]+) .*/\1/p'
10.0.0.154
#ifconfig eth0 |sed -rn '2s/^.*inet //p'|sed -n 's/netmask.*//p'
10.0.0.154  
#ifconfig eth0 |sed -n '2s/^.*inet //;s/ netmask.*//p'
10.0.0.154 
#ifconfig eth0 |sed -rn '2s/(.*inet )([0-9].*)( netmask.*)/\2/p'
10.0.0.154 

4.使用sed取文件的前缀和后缀:

#echo a.b.c.gz | sed -En 's/(.*)\.([^.]+)$/\1/p'
a.b.c
#echo a.b.c.gz | sed -En 's/(.*)\.([^.]+)$/\2/p'
gz
#echo a.b.c.gz |grep -Eo '.*\.'
a.b.c.
#echo a.b.c.gz |grep -Eo '[^.]+$'
gz
#echo a.b.tar.gz | sed -rn 's@.*\.([^.]+)\.([^.]+)$@\1@p'
tar
#echo a.b.tar.gz | sed -rn 's@.*\.([^.]+)\.([^.]+)$@\1.\2@p'
tar.gz

5.使用sed将非#开头的行加#

#sed -rn "s/^[^#]/#&/p" fstab
#sed -rn 's/^[^#](.*)/#\1/p' fstab 
#sed -rn '/^#/!s@^@#@p' fstab

6.使用sed将#开头的行删除#

#sed -ri.bak '/^#/s/^#//' fstab

7.使用sed获取分区利用率:

#df |sed -nr '/^\/dev\/sd/s# .* ([0-9]+)%.*# \1#p'
/dev/sda2 6
/dev/sda5 7
/dev/sda1 24
#df |sed -rn '/^\/dev\/sd/ s#([^[:space:]]+[[:space:]]+){4}(.*)%.*#\2#p'
6
7
24
#df |sed -rn "/^\/dev\/sd/ s#(\S+\s+){4}(.*)%.*#\2#p"
6
7
24

8.使用sed修改内核参数:

#sed -rn '/^GRUB_CMDLINE_LINUX=/s@(.*)"$@\1 net.ifnames=0@p' grub  

#sed -rn '/^GRUB_CMDLINE_LINUX=/s@"$@ net.ifnames=0"@p' grub

9.使用sed过滤掉以#号和空行开头的行:

#sed -r '/^( *#|$)/d' /etc/httpd/conf/httpd.conf#sed -r '/^ *#|^$/d' /etc/httpd/conf/httpd.conf#下面两个表达式中的条件前后顺序互换,结果不一样
#sed -n '/^$/d;/^[[:space:]]*#/!p' /etc/httpd/conf/httpd.conf		#sed -n -e '/^$/d' -e '/^[[:space:]]*#/!p' /etc/httpd/conf/httpd.conf

10.sed引用变量使用单引号时的注意事项:

#echo |sed "s/^/$RANDOM.rmvb/"
20394.rmvb
#echo |sed 's/^/$RANDOM.rmvb/'
$RANDOM.rmvb
#echo |sed 's/^/'"$RANDOM".rmvb'/'
8263.rmvb
#echo |sed 's/^/'''$RANDOM'''.rmvb/' 
7767.rmvb

11.使用sed引用变量实现多点编辑,修改配置文件:

#port=8080
#sed -ri.bak -e 's/^Listen 80/Listen '$port'/' -e "/^#ServerName/c ServerName `hostname`:$port" /etc/httpd/conf/httpd.conf

12.修改Linux操作系统密码长度和有效时间的操作:
参数和值之间是用tab制表符,用[[:space:]]表示
修改建议值:
a.PASS_MAX_DAYS 180
b.PASS_MIN_DAYS 1
c.PASS_MIN_LEN 8
d.PASS_WARN_AGE 28

# sed -ri.bak 's/(^PASS_MAX_DAYS[[:space:]]+)[0-9]+/\1180/' /etc/login.defs
# sed -ri 's/(^PASS_MIN_DAYS[[:space:]]+)[0-9]+/\11/' /etc/login.defs
# sed -ri 's/(^PASS_MIN_LEN\t)[0-9]+/\18/' /etc/login.defs# sed -i 's@^\(PASS_MIN_LEN[[:space:]]\+\)[0-9]+@\18@g' /etc/login.defs
# sed -ri 's@(^PASS_WARN_AGE[[:space:]]+)[0-9]+@\128@' /etc/login.defs

13.sed的高级用法:

sed -n 'n;p' FILE	#打印下一行(打印偶数行)
#seq 10 |sed -n 'n;p'
2
4
6
8
10
seq 10 | sed 'N;s/\n//'	#2行合并一起打印
#seq 10 |sed 'N;s/\n//'
12
34
56
78
910
sed '1!G;h;$!d' FILE	#倒序打印
#seq 10|sed '1!G;h;$!d'
10
9
8
7
6
5
4
3
2
1
seq 10 | sed -n '/3/{g;1!p;};h'  #第3行前一行
#seq 10  |sed -n '/3/{g;1!p;};h'
2
seq 10 | sed -nr '/3/{n;p}'      #第3行后一行
#seq 10  |sed -n '/3/{n;p}'
4
sed  'N;D'FILE		#打印最后一行
#seq 10 |sed 'N;D'
10
seq 10 |sed  '3h;9G;9!d'
#seq 10 |sed '3h;9G;9!d'
9
3
sed '$!N;$!D' FILE
#seq 10 |sed '$!N;$!D'
9
10
sed '$!d' FILE
#seq 10 |sed '$!d'
10
sed 'G' FILE		#将每行后加个空行
#seq 4 |sed 'G' 
1

2

3

4

sed 'g' FILE
#seq 3 |sed 'g'


sed '/^$/d;G' FILE		#将每行后加一空行
#seq 3 |sed '/^$/d;G'  
1

2

3

sed 'n;d' FILE 	#打印奇数行
#seq 10 |sed 'n;d'
1
3
5
7
9
sed -n '1!G;h;$p' FILE		#倒序打印
#seq 5 |sed -n '1!G;h;$p'  
5
4
3
2
1
文本处理三剑客之awk

1.gawk:模式扫描和处理语言,可以实现下面功能

  • 文本处理
  • 输出格式化的文本报表
  • 执行算数运算
  • 执行字符串操作

语法格式:
awk [options] ‘program’ var=value file…
awk [options] -f prografile var=value file…
说明:program通常是放在单引号中,并可以由三种部分组成

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

常见选项:-F“分隔符”指明输入时用到的字段分隔符,默认的分隔符时若干个连续空白符;-v var=value变量赋值

Linxu脚本部分

shell脚本常见的三种错误类型:命令错误、语法错误、逻辑错误。
命令错误的话,不影响后面命令的执行;语法错误会中断执行后面的命令,可通过bash -n *.sh排查;逻辑错误不影响执行,相对比较难找,可通过bash -x *.sh查找观察。

重复性的工作可以先写好脚本放在自己的服务器上,然后通过命令执行你自己服务器上的脚本。

#curl -s http://你服务器地址/testdir/system_info.sh | bash

1.简单实现Linux系统磁盘告警脚本。

#cat disk_check.sh 
#!/bin/bash
WARING=80

DISK=`df | grep  "^/dev/sd" |grep -Eo '[0-9]+%' |grep -Eo '[0-9]+' | sort -rn | head -n1`

[ $DISK -ge $WARING ] && echo Disk will be full | mail -s 'Disk Warning' 邮箱@qq.com

2.今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?

#cat chicken_rabbit.sh 
#!/bin/bash
HEAD=$1
FOOT=$2

RABBIT=$(((FOOT-HEAD-HEAD)/2))
CHICKEN=$[HEAD-RABBIT]
echo RABBIT:$RABBIT
echo CHICKEN:$CHICKEN
#bash chicken_rabbit.sh 35 94
RABBIT:12
CHICKEN:23

3.判断指定主机网络状态:

#cat check_host.sh 
#!/bin/bash
read -p "Please input a IP:" IP
[[ $IP =~ ^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$ ]] || { echo "IP is invalid";exit; }
ping -c1 -w1 $IP &>/dev/null && echo $IP is up || echo $IP is down

4.编写脚本 yesorno.sh,提示用户输入yes或no,并判断用户输入的是yes还是no,或是其它信息。

read -p "Do you agree(yes/no)?" INPUT
case $INPUT in
[Yy]|[Yy][Ee][Ss])
        echo "You input is YES"
        ;;
[Nn]|[Nn][Oo])
        echo "You input is NO"
        ;;
*)
        echo "Input false,please input yes or no!"
esac

5.编写脚本 filetype.sh,判断用户输入文件路径,显示其文件类型(普通,目录,链接,其它文件类型)。

#cat filetype.sh 
#!/bin/bash
#
#***********************************
#author:                hjx
#version:               0.0
#date:                  2021-09-09
#description:   hello world
#**********************************
read -p "请输入一个文件路径:" PATH1

TYPE=`ls -ld $PATH1 |cut -c 1`

case $TYPE in
-)
        echo "$PATH1为普通文件"
        ;;
d)
        echo "$PATH1为目录文件"
        ;;
l)
        echo "$PATH1为连接文件"
        ;;
b)
        echo "$PATH1为块设备文件"
        ;;
*)
        echo "$PATH1为其他文件类型"
        ;;
esac

6.计算1+2+3+…+100 的结果。请写出多种实现方法:

#sum=0;for i in {1..100};do let sum+=i;done;echo sum=$sum
sum=5050#seq -s+ 100|bc
5050#echo {1..100}|tr ' ' + |bc
5050#seq 100 |paste -sd + |bc
5050

7.批量创建用户,并设置随机密码。

#cat user_for.sh 
#!/bin/bash
#
#***********************************
#author:                hjx
#version:               0.0
#date:                  2021-09-10
#description:   hello world
#**********************************
for i in {1..10};do
        useradd user$i
        PASS=`cat /dev/urandom |tr -dc '[:alnum:]'|head -c12`
        echo $PASS |passwd --stdin user$i &> /dev/null
        echo user$i:$PASS >> /data/user.log
        echo "user$i is created"
done

8.花式打印九九乘法口诀表。

  1. 随机颜色打印
for i in {1..9};do
        for j in `seq $i`;do
                echo -e "\E[1;$[RANDOM%7+31]m${j}x${i}=$[i*j]\E[0m\t\c"
        done
        echo
done
  1. 使用printf格式输出
for ((i=1;i<=9;i++));do
        for ((j=1;j<=i;j++));do
                printf "\033[1;$[RANDOM%7+31]m${i}*${j}=$[i*j]\033[0m\t"
        done
        printf "\n"
done
  1. 倒叙输出
for i in {1..9};do
        for j in $(seq `echo $[10-$i]`);do
                echo -en "${j}x`echo $[10-i]`=$[(10-i)*j]\t"
        done
        echo
done

9.PS(1,2,3)的含义:
PS1是用来控制控制终端上的命令提示符的颜色,内容的
PS2是控制多行重定向的提示符的,可以认为修改想要的类型。
PS3是用来定义select菜单的提示

9.脚本初始化配置

Linxu的各种服务
后续不断更新中……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值