系统启动和内核管理,各种修复及各种编译
Linux就是个内核。
ldd命令可查到每一个程序依赖的库。
Centos6的启动流程及修复
centos6启动步骤概述
1、上电POST自检,加载BIOS的硬件信息,获取第一个启动设备
2、读取第一个启动设备MBR里的引导加载程序(grub)的启动信息
3、加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
4、核心执行init程序,并获取默认的运行信息
5、init程序执行/etc/rc.d/rc.sysinit文件
6、启动核心的外挂模块
7、init执行运行的各个批处理文件(scripts)
8、init执行/etc/rc.d/rc.local
9、执行/bin/login程序,等待一会登录
10、登录之后开始以shell控制主机
Bootloader是用来启动操作系统的。实现操作系统的前期引导。
GRUB启动程序是多部份组合而成,其中MBR的前446个字节只是他的第一个阶段。
第二阶段放在了磁盘文件:放在了/boot下的grub文件
内核放在/boot/文件下这就是内核文件
初始化的文件系统:/boot/initramfs - VERSION -release.img 这还是一个打包文件。
:先修改后缀就能解压。
:这个文件的目录和根分区的目录一样。他就是一个缩小版的根。这个文件里面就是一个隐藏版的小内核。
:--force 这是强制安装覆盖安装。
Chroot:改变根的挂载位置
Initramfs 文件被破坏的救援
:initramfs文件破坏的救援
Initramfs文件破坏的界面:↓↓
然后再关闭虚拟机在电源开启处
在重启虚拟机输入esc键进入boot 关盘救援模式
进入这个文件。
:更改根挂载的位置,这是真的根
:mkinitrd文件制作命令在接着输入这一条命令。
删除initramfs。Img 恢复之:
1 rescue mode(进入救援模式)
2 chroot /mnt/sysimage 切根
3 mkinitrd /boot/initramfs-uname -r
.img uname -r
4 exit ; exit ; reboot
Mkinitrd是一个脚本文件。两种方法都可以用来生成ramdisk这个文件。
在centos6上使用的是ubantu的init 基于upstaet这个程序来开发出来的。
但是他们都有一个相同的文件/etc/inittab文件,是init启动的时候会读取的文件。
Init 启动流程及破解密码和多次重启的修复方法
Init进程启动之后就开始读取一些配置文件。
比较关键的文件:/evt/inittab文件:
定义了启动时非常重要的特性,开机的时候到底进入到什么模式下。
使用runlevel命令是可以查看在那个模式下。
Init 启动在那个模式下是靠vim /etc/inittab这个配置文件下来定义的。
:这一样是设置开机启动在那个模式下,这一行的作用就是用来设置开机启动在那种模式下的。
1 模式单用户模式。:可以用来进行维护作用。
2 模式是没有NFS功能。其他和3模式相似的
4 模式没有使用功能。
Init是加载系统中的第一个主程序。
:开机的配置文件
init1模式下单用户模式 破解密码
再单用户模式下只提供了concole一个控制台。只提供了一个终端,将来单用户模式主要用于维护用,使用单用户模式确保别人都不能访问只有我一个人可以访问,在工作中在单用户下可以轻松的破解root口令的。
如何再centos 5 和6上破解root口令:
1 :输入重启时输入任意键再输入a进入内核
2 :进去之后输入1进入单用户模式
3 :进入之后输入修改密码
这就已经单用户破解了口令了。
Init6模式下,虚拟机一直重启修复
1:
在重启界面输入任意键,进入下图↓↓然后输入a键
2:
进入3模式↓↓
3:vim /etc/inittab进入修改init模式
Id:理解成一个行的标识
runlevels:后续的这个程序是在哪个运行级别里运行。(表示0-6的某一个模式)
action:表示在这个模式下要执行的事。其中action里面常见的动作有这几种:
Wait:切换此运行级别只运行一次后续不在运行。
resoawn:这进程如果终止,将重新启动(具有再生功
能)。
Initdefault:开机进入到此运行模式,开机系统就会运行到指定的模式下。
Sysinit: 表示的是系统初始化的一个方式,开机的时候所有init都会先运行系统运行的脚本。
启动流程:
/etc/rc.d/rc.sysinit : 系统初始化脚本
(1)设置主机名
(2)设置欢迎信息
(3)设置udev规则,和selinux
(4)重新根据/etc/fstab文件的内容进行挂载
(5)重新挂载根,而且以可读可写方式挂载
(6)设置系统时间
(7)激活swap设备
(8)根据/etc/sysctl.conf 文件设置内核参数
(9)激活lvm及software raid设备
(10)加载额外设备的驱动程序
(11)清理操作
这是一个复杂的脚本,这个脚本时系统提供好的一般来将不建议修改他的。
这个脚本运行完了以后就开始根据系统的运行模式
Process:进程程序名。
:打印当前Linux系统的运行等级
如果开机进入的是0模式然后再系统读秒的时候输入任意键,然后再内核参数输入a跟5模式,零时的绕过错误文件,再进入vim /etc/inittab文件配置
修改系统运行等级。
Service 引用的就是 /etc/init.d/atd 这个脚本,
K开头决定服务不启动
S开头决定服务的启动
计划任务是一个服务。
S开头的就是开机的启动服务。
开机启动的顺序决定:
次序是按照字母表次序排序
启动服务是有一定讲究的有些服务之间有一定的依赖,有些服务要启动的先把别的服务先起来。关闭服务的时候先关后面的在管前面的,因为后免得依赖性太多了,开启的时候正好反过来。
在0-6这七种模式下,服务的启动或者关闭都是可以加以认为改变的。 0-6的区别在于就是各种服务启动不启动的各种组合。
K开头和S开头可以手工的去修改他,把它设为K开头或者S开头:
ntsysv这个命令进去之后可以修改服务的启动(只能改一种模式,但是也可以指定模式) :
进入之后*表示开机启动,就为S开头的文件把他关了就代表K开头的文件。但他只能在当前修改的模式下为K开头当开机模式切换为init 其他模式他依旧为S开头的文件。
:该命令表示了只修改该5模式下的开机启动服务(但是这个命令只能同一时间改一个模式)
编写添加服务脚本
- :表示的是刚把这个服务加进系统中,系统认为所有模式(0-6)下全是off。
1.创建一个脚本
(1):必须写到这个目录下
(2)- 添加到启动服务中。
Chkconfig --add 叫脚本名就加入了启动服务中 -
启动脚本出现错误机器起不来了。
1.如果开启虚拟机的时候起不来的服务就会卡在那
2.然后再次重启进入单用户模式输入 chkconfig 起不来的服务脚本名 off将他停掉
3.然后在重启在想办法进入那个启动脚本解决。
删除启动脚本。
Chkconfig --del 跟脚本名:这样删除带来的好处就是马上软连接就没了,当然这个脚本还在。在centos7上面已经不推荐这么使用。
非独立服务
- 添加到启动服务中。
Service --status -all 这个选项所有服务的状态都能看到。
瞬态服务:用的不太多的服务找一个代理人由它来管理这个代理人叫:xinetd服务。他用来解决某些服务用的并不是这么频繁的服务。平时用的不多的服务并不启动,由xinetd这个服务来监控。
用xinetd来代理的服务叫做:非独立服务。
非独立服务都是由xinetd来进行监管和代理。
刚装的服务都不会自动启动,只有手动启动:
1·先启动xinetd服务:
2·
3·重启xinetd服务是修改得配置文件生效。
另一种启动方法
:这个命令也是将配置文件的yes改为了on直接修改
S99local :
这个脚本将所有的init脚本运行后在运行。:把想开机的命令写在这个文件就行了。不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行
的命令,可直接放置于/etc/rc.d/rc.local文件中,在centos7上面要加执行权限才能运行。
https://s4.51cto.com/wyfs02/M02/87/20/wKiom1fVBELjXsvaAAUkuL83t2Q304.jpg
Grnb就是Boot loader的过程:
关键内容分为第一阶段和第二阶段grub就是我们对应的boot loader
在centos6上用的版本是0.97,centos7上版本已经是2.02版。你不论它是及版本他的功能都是加载找到操作系统的 。是脱离操作系统的软件,可以用来启动各种操作系统。
第一阶段:
GRUB启动程序是多部份组合而成,其中MBR的前446个字节只是他的第一个阶段。
第1.5阶段:
还有1.5阶段:存放的位置在mbr之后的扇区,把驱动放在了后续的扇区中,通过后续的某个地方来找到boot对应的驱动。找到boot的驱动之后加载boot然后我们才能进到boot里面找到这个文件。因为进入到boot之后他会先进入到grub这个文件夹里,然后通过grub的一个文件定位vmlinuz内核文件的文件名,这个文件就是grub.conf这个配置文件。
第二阶段:
第二阶段就会读取grub.conf文件根据里面的配置文件来找到内核
grub.conf这个配置文件解析图
Yum 安装内核及卸载内核
1 :http://elrepo.org/tiki/tiki-index.php 这个网站提供了很多新版的内核
2.:根据需求下载需要的内核包
这是6就对应6,别的版本对应的不一样。
3.: 进入内核配置文件进入官网。
(1)
(2)
(3)
(4)
4.:上面工作做完了直接安装:
5.:进入cd /boot/grub vim grub.conf
然后reboot重启即可生成。
删除内核
Grub 修复,和删除了/boot/initramfs.Xxx.img恢复,及制作linux系统
Grub对应的是第一个扇区,如果第一个扇区破坏了将如何来进行修复。
如果前446字节的boot loader被破坏了不需要去备份进行还原,用grub命令进行修复
(1)用grub-install 进行修复
语法:
在执行grub-install进行修复的时候他的语法是要指定根,也可以默认不指定后面跟上指定硬盘的设备名称
grub-install --root-directory=DIR /dev/DISK
(2)或者用grub 的交互式命令进行修复
语法:
grub> root (hd#,#):进了以后用root指定分区的名称,因为他要找到boot所在的位置
grub> setup (hd#):然后在指定安装在那个硬盘上
Grnb的前446字节破坏故障修复
使用grub-install 命令修复方法
破坏前446字节
1:如果在生产中重启直接不找硬盘找光盘就是mbr分区表出了故障:
2:进入救援模式
3:使用grub-install方法修改:这就修复成功
4:修复完了以后检查是否修复成功
:这是查看前512字节里的前446字节是否修复成功
使用grub交互式修复方法
使用grub交互式下修复,依赖于boot下gurb里的若干文件才能修复
1:grub交互修复
2: 进入交互式后救修复就OK了
3:修复完了以后检查是否修复成功
:这是查看前512字节里的前446字节是否修复成功
破坏grub里1.5阶段修复跳过前512 字节破坏修复
1 : 破坏了512后面的字节故障显示,这和破坏了512字节前的状态不一样但是也起不来了,但这次他不提示用光盘了,因为他认为硬盘具有启动功能。
2: 直接进入救援模式下修复
3: 修复完了再同步
然后exit 退出直接到重启界面
使用grub.conf配置文件防止单用户模式破解密码
1
再内核参数中我们可以加很多参数,具体需要我们可以通过安装kernel-doc这个文档来观察每个参数的作用。
制作linux系统
该实验对理解linux的组成很有意义
1 : 先创建一个小的linux系统
2 : 找到这个新建centos的配置文件
3 : 再将这个新建虚拟机添加到现有虚拟机的磁盘上
4: 添加好了就在shell上直接进行划分工作
(1)
(2)
(3)
(4)然后进行挂载及安装grub
挂载boot
mkdir /mnt/boot 子目录必须为boot
mount /dev/sdb1 /mnt/boot
安装grub
grub-install --root-directory=/mnt /dev/sdb
(5)编写grub.conf配置文件
(4)添加根的详细信息
5 :添加网络服务
6 : 将装好的小linux那个虚拟机重启再装网络服务
总结linux系统的组成:
作为启动来讲Boot Loader(就是grub),内核和其他的相关文件都得有这就可以凑一个linux出来。
逻辑卷破坏的修复。实验:
grub第二阶段破坏修复
二阶段主要是对应主要对面的是/boot/grub。Grub这个目录整个破坏了的修复方法
做实验先将这个目录全部删除:
1: Grub第二阶段破坏状态:
2: 进入救援模式
·
3: 先切根再输入grub - install /dev/sda :这命令是万能命令,可以修复一阶段和二阶段的命令。
4: 修复了之后再进入到grub但是缺少grub.conf配置文件,如果现在立即重启就缺少菜单项。进入/boot/grub文件编辑grub.conf配置文件然后重启即可
(1)
(2)
(3)编写grub.conf配置文件
(5)如果出现了交互式直接按照交互式的来修改
删除了/boot/initramfs.Xxx.img,恢复
假如/etc/fstab文件和/boot文件全部被破坏
1 :
2 :
(1)逻辑卷再不是正常启动的情况下,不会正常激活所以目前逻辑是不可访问的状态
(2)激活逻辑卷
(3)挂载root激活文件目录,和挂载boot等会要用。
因为root是当根用的。Boot里面有gurb启动文件。
(4)编译挂载文件
3 : 改完逻辑卷配置文件再次进入到救援模式
(1)到了救援模式下的步骤挂载和安装修复内核
(2)修复grub和编写grub配置文件
:修复grub文件
:使用重定向把这个导入到vim配置文件里去。最后在使用sync同步刷新。
Proc目录
在proc下有很多是可以设置的东西但是也有很多是可读的东西。在proc下主要存放了系统运行过程中大量进程的东西都在proc下。有些设置也可以通过proc这个目录修改。
/Proc/sys这个目录可以修改很多参数。
这个文件专门管理此目录的配置
禁ping↓↓
:改为1就ping不通了。
:路由器永久生效。
Sysctl - a列出所有正在生效的
Sysctl -p读取配置文件的参数使之生效。
TCP 协议连接优化。
源码编译内核
想用最新的内核就得源码编译:
在编译的时候我们可以通过点菜单的方法来进行编译。
[M]:表现为模块方式,在磁盘上为独立文件带来的好处是需要就加载。
[*]:表现为集成在内核文件上去了。意味着将打包到我们的核心文件中。
lsmod 各种加载的驱动模块,按需加载,也可以手动加载
modprobe 后面跟文件类型加载模块手动加载(驱动模块是可以加载也可以卸载的)
rmmod 后面跟文件类型卸载模块
modinfo 后面跟文件类型看模块详细信息。
模块和模块之间是有依赖性的。
先卸载依赖文件类型载卸载模块。
Insmod 安装加载模块(后面要加文件名和路径)
编译内核要安装需要的软件和依赖包
编译的时候要考虑编译环境。
7上编译内核其支持ntfs文件
1 : 先在网上去下载新版内核,下载好后再将拖入xshell中
:在选择这项
:在选择NTFS文件最后全部退出保存进行编译
2.装的时候要分成两步装,第一步装模块第二步装内核。
(1)make modules_install安装模块
(3)make install 安装新内核
这就编译完了。
Busybox介绍
Busybox源码编译
有一个工具叫make install 这个工具会自动的把软连接放到一个叫_install的目录中,把软链接考出来就行了
Busybox源码编译
1 : 安装所需的依赖包
yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl
openssl-devel systemd-devel zlib-devel glibc-static ncurses-devel
2 : 进入官方网站下载源码https://www.busybox.net/
复制版本链接
cd busybox-1.30.1/
make menuconfig 按下面选择,把busybox编译也静态二进制、不用共享库
Busybox Settings -->Build Options -->[] Build BusyBox as a static
binary (no shared libs)
make && make install 如果出错,执行make clean后,重新执行上面命令
mkdir /mnt/sysroot/
cp -a _install/ /mnt/sysroot/
Systemd 的原理
再centos7上面用systemd这个进程管理所有资源,而这些资源统称为unit,unit把不同的资源分为了不同的类型,不管为什么类型都统称为unit单元
Unit最主要的放在了/urs/lib/systemd/system,这个目录里面放了各种资源,主要表现为文件后缀不同。这里面都为unit为了区分资源类型就用不同的文件后缀。
最多的就为service文件,这些service文件就等价于centos6上面的各种服务脚本。也就表现为一个一个服务除了service还有其他资源比方说target,target就像之前的runlevel的0到6这7中模式。
优先级越高就意味着该文件里面的脚本优先级越高
Systemctl 命令及各种选项用法
这种语 法带来的好处是可以管理查看多个服务。
在centos7上启动的时候不再显示ok,如果不显示则表现为正常状态,如果显示了往往是出了错。
Maks选项代表是将某个服务禁止在让他使用
Mask禁止服务流程:↓↓
Unmask取消禁止服务流程:↓↓
这样的话就不会造成误操作。
查看某服务当前激活与否的状态如下两图:↓↓
设为开机启动或不启动就是本质上有没有创建软链接
下次开机禁止启动,然后创建了一个软连接
红色表示没有启动,绿色表示启动
就是一些服务各种状态各种资源的集合。当进入到某个而且相互之间有各种依赖性,多个函数放到一个文件里面就相当于一个target
Centos7修复grub前446字节
Centos7破解root口令
防破解口令添加grub2密码
Centos7修复grub2 第二阶段
删除centos7 /boot修复
修复次序:先修复内核再去修改gurb
这就修复完了
修改默认启动内核
如果内核不想要的删除方法及修改默认内核
下图两个都可以设置默认启动内核
实验熟练掌握:systemctl start stop restart enable disable mask unmask is-active is-enabled name.service
systemctl set-default multi-user.target
安全加固SElinux
越安全越复杂。
MAC:强制的访问控制
:当前mac模式是否启用禁用
这个文件可以修改禁用和允许
:临时修改报警,不阻止
文本三剑客AWK(重点)
每读一行处理一行,然后进行处理。这个命令可以除了各种文本信息,也能处理标准内容,和一些管道传过来的内容
主要的功能能够实现文本的处理
Awk语法:
Awk +选项 -f 后面可以跟文件或者程序。他后面这个文件不一定要必须跟,可以对标准输入做处理。
程序的格式分为两部分来组合而成,一部分是pattern,一部分是括号里面的action。Pattern就是模式,模式决定了读入的每一行是否符合他的模式定义,如果符合这个模式定义,他将针对这一行的内容执行action动作,如果不符合这个模式定义,自然不会执行action里面的动作。
自动就把文件中的每一行读入利用pattren做过滤满足pattern条件的行,对应执行action,如果不满足直接跳过
其中action最常见的动作就是print(打印),awk有个非常好的特点,自动地把某一行读入之后,然后自动的将读入的这行切割为了多个字段。
切割不用人为的去切割,默认的用空白符就可以切割(空格tab键都可以)可以用这种空白符自动把一行。切割成多个字段,而且切割完了以后awk自动的将这些切割完了的字段赋予了变量,切出来的第一个字段赋予了$1,第二个字段就是$2.直到$n。
但这个$和shell脚本里的$不是一个意思,其中$0代表了所以字段整行。 默认是一行处理但是也可以不用一行处理,其中wak在处理的时候,可以指定某一行作为一条记录作为一个单位。事实上也可以不用行来作为单位的分割。
如果这个action动作没有写的话相当于执行了一个print $0的操作。
Awk工作原理
逗号分隔符;输出的各item可以是字符串,也可是数值;当前记录的字段、变量或awk的表达式;如省略item,相当于print $0。
awk程序通常由:BEGIN语句块、能够使⽤模式匹配的通⽤语句块、END语句块等三部分组成。program通常是被单引号或双引号括起来。
选项:
-F:指明输入时用到的字段分隔符;
-v var=value:自定义变量。
基本格式:
awk [options] 'program' file
program:表示为pattern{action statements;...}
pattern:表示部分决定动作语句何时触发及触发事件BEGIN、END;
action statements:表示对数据进行处理,放置{}内指明print、printf。
分隔符、域和记录:
awk执行时,由分隔符的字段(域)标记$1,$2...$n称为域标识。$0为所有域,注意:和shell中变量$符含义不
同;
文件的每一行称为记录;
省略action,则默认执行print $0的操作。
BEGIN 类似于打印的意思:
例图:
Awk 最重要的功能还是对文件的处理
:双引号中间只要是普通字符串不是变量一定要加双引号引起来,除了数字。
会按照文件或者标准读入输入一行,然后执行pattren{任务}语句块,然后逐行执行,直到最后一行执行完毕。
但是awk还支持另外两个独立的特殊语句,一个叫BEGIN一个叫END。
BEGIN,END并不是在文件的处理过程中来执行的,
BEGIN是开始:还没有对文件进行读入就先执行BEGIN的 ,文件前执行,可以做一些打印表格的表头(大标题)
END是结束 :END恰恰相反,是把所有的文件都处理完了在执行,文件后执行
相当于一个头一个尾,可以做汇总
Awk在执行分割打印的时候默认是将空白符来切割为多个字段,然后用$1来代表第一个字段...
事实上他的切割符也可以通过人为的切割 -F就是指定以什么字符作为切割符来进行切割。
:$1和$3中间用的逗号是默认使用空格作为分隔符,我们也能人为的加一些符号作为指定的分隔符
在AWK里面我们打印的内容只要不是变量不是数字就必须的用双引号“”
awk 变量的用法
Awk也支持变量一种是系统支持的内置变量还有一种是自定义的变量, - v 表示后面有变量赋值,一个 - v 代表一个变量,要是有多个赋值每一个变量都得加 - v
FS:是系统自带的变量,这个变量的作用是就是 -F 的作用。不过这个FS是个变量
要用变量标准的语法是 -v 对变量赋值,变量要赋值FS是一个系统自带的变量他的功能是用来声明字段和字段之间的分隔符,所以要用 -v FS对他来进行声明赋值,赋值之后我们再去print里面去调用它。
FS变量得声明及调用:↓↓
FS这个变量指定了对文件读入的时候怎么去区分$1,$2,$3等等的分隔符就用FS来进行定义实际上他的作用和-F是一样得
:需要指定分隔符所以的用-F或者FS来指定:冒号的变量。
变量的引用:↓↓(变量的好处是前面声明后面可以引用)
多重引用变量及调用shell变量引用到awk变量中。
OF S变量指定了输出的时候列和列之间的分隔符:↓↓
RS定义的是输入时字段记录和记录之间的分隔符↓↓
ORS定义的是输出时字段记录与记录之间的分隔符↓↓
NF这个变量表示为字段的数量。
NR定义了记录数,一行就是一个记录打印他的编号
FNR 表示每个文件有自己独立的编号
:文件与文件之间的分割编号
FILENAME定义此行是来自那个文件
ARGC定义的是参数的个数
ARGV定义了数字保存的命令行的参数
在awk中也可以自定义变量,这些变量可以用 -v 声明。
实际上也可以在程序里来定义变量,在花括号(程序)里面
实际上也可以在程序里来定义变量,在花括号(程序)里面↓↓必须先定义在使用
分隔符不一定是字符也可以是正则表达式↓↓
-f选项对文件的调用,文件可存放执行动作:
下图调用了上图的内容
Awk Printf 选项用法
Printf是我们shell中也支持的不过他是一个内部命令,awk的printf和shell中的用法相识的
Printf的强大之处它可以定义格式
Printf语法:
必须指定模板,定义后续要打印的格式,然后在后面在跟上若干打印的内容,其中打印的后面这些内容,要按照定义的格式来进行打印。
格式符:与item(英译:项目)一一对应
不会自动换行,需要显示给出换行控制符,\n
%c:显示字符的ASCII码
%d, %i:显示十进制整数 (用的比较多)
%e, %E:显示科学计数法数值
%f:显示为浮点数
%g, %G:以科学计数法或浮点形式显示数值
%s:显示字符串 (用的比较多)
%u:无符号整数
%%:显示%自身 (用的比较多)
其还可以指定打印字符串的格式可以在中间插入修饰符
修饰符
#[.#] 第一个数字控制显示的宽度;第二个#表示小数点后精度,例子:%3.1f f :表示的打印的时候宽度
- 左对齐(默认右对齐) 例子:%-15s + 显示数值的正负符号 例子:%+d
新浪面试题:↓↓
操作符运算
算术操作符:
x+y:加法;
x-y:减法;
x*y:乘法;
x/y:除法;
x^y:幂运算;
x%y:取模(余数)。
赋值操作符:
=:右边赋值给左边;
+=:先加,再赋值;
-=:先减,再赋值;
*=:先乘,再赋值;
/=:先除,再赋值;
%=:先取余,再赋值;
^=:先幂运算,再赋值;
++:递增操作;
--:递减操作。
BEGIN/END模式
BEGIN{}:仅在开始处理文件中的文本之前执行一次;
END{}:仅在文本处理完成之后执行一次。
Awk 的正则表达式及操作符
⽐较操作符:
==:判断相等;
!=:判断不等;
\>:判断大于;
\>=:判断大于等于;
<:判断小于;
<=:判断小于等于。
模式匹配符:
~:左边是否和右边匹配包含;
!~:是否不匹配。
写在两个斜线中间表示正则表达式 / /或者 ” ”也是表示正则表达式
除了支持数字运算等还支持模式匹配,
~:左边的是否和右边的相包含
!~:不包含
Awk正则格式
当我们读入一行之后他去检查我们的正则表达式是否匹配,如果匹配才去执行后续的{print }
比较符用法
下图这样写也行↓↓这是表示大于等于2的行
Awk 的与&& 或|| 非!!
&&与
||或者
三目表达式
表示有三个元素,逻辑意思是:
有三个组成部分,最前面一个部分是逻辑判断,如果这个条件判断的结果为真,就执行第二个部分,如果为假就执行第三个部分。
Pattern(英译模式)格式汇总:
(1)没有写pattern,相当于所有行都满足要求,所有行都进行打印
例图:
(2)pattern可以写正则表达式,可以再pattern位置直接将正则表达式放到两个 / /
例图:
例图:
(3)关系表达式:前面是一个条件为真的表达式,如果为真就打印 ,假就不打印
假:双引号里面没有东西空或者0就是假,里面没有任何东西
例图:
例图:
真:结果不是0,或者双引号里不是空的字符(空格号是表示字符为真),里面有东西
例图:
例图:
例图:
例图:
另外也可指定从第几行到第几行,可以写pat模式,从这个模式开始到下一个模式之间的所有行。
如果想表示第几行到第几行也可以使用NR这种模式来写
Awk 得if循环判断
使用循环判断的时候一定要将循环写在{ }里面然后再将判断条件写到小括号里
if 语句判断:
Awk得while循环判断
length(英译长度)
break [n]:结束整个循环默认是最近的一次循环;
continue [n]:跳过本轮循环,执行下一轮循环;
next:提前结束对本行处理而直接进入下一行处理(awk自身循环)
Awk for循环判断
For循环还有一个突出得功能能够实现数组得便利,awk里面支持数组还支持逐个逐个得将数组取出来。
break [n]:结束整个循环默认是最近的一次循环;
continue [n]:跳过本轮循环,执行下一轮循环;
next:提前结束对本行处理而直接进入下一行处理(awk自身循环)
Continue对奇数运算
Continue对偶数运算
Break对66的运算
在awk 里面还有一个特殊得打断得指令next:
提前结束本行得处理,直接进入到下一行
Awk 数组
在awk里面有一个好的功能叫数组,而且他用的数组叫关联数组
关联数组:下标位置定义得,可以拿任意得字符串或者数字都可以作为下标。
使用awk 结合for循环就能将数组里得东西一个一个得取出来。因为关联数组不想普通数组都是有规律得。因为关联数组里面得下标都是任意格式无规则得。
For循环可以将一个一个得元素取出来,进行便利。基本语法:
(1)语法:for(变量名 in 数组名)然后再进行循环得时候每一次循环执行,将把数组得下标取出来付给变量数组得下标自动就给了变量名
例图:↓↓
打印出来的的次序并不是当初赋值的次序他是随机的。
Awk 函数
length()函数:统计字符长度
rand()函数:⽣成随机数
sub()函数:替换第⼀次匹配的字符
gsub()函数:全部替换
split()函数:指定分隔符,分隔字符串
Awk里面还支持函数,函数包括系统自带的函数以及我们自定义的函数。
自带函数rand() : 返回一个随机数
Srand()能够给我rand()提供种子,rand()有了种子才能实现对种子的随机生成。
Awk 自定义函数,
他的参数不用$1 , $2是事先写好,将来函数执行的时候第一个参数就符给了他,变量是啥,调函数的时候值就赋给了谁,这个参数作为函数定义的时候必须要写清楚的,而这个函数在用的时候,我们可以把具体的值赋给这个参数而这个参数是定义函数用的,所以叫做形式参数简称形参。真正用的时候要传一个实际的数据给他,叫实际参数简称实参。
在定义的时候叫形参用的时候叫实参。
Awk 中调用shell命令
在awk中还有一个特殊的函数系统自带的函数,这个函数可以调用Linux中的命令。
语法:
awk ‘ BEGIN{system(“需要调用的命令”)} ’
将要使用的命令放到system后面用小括号引起来就可以使用这个命令。
:引号里面放的是linux命令,而dir是一个变量,所以不能放到双引号里面,不然就成了字符串了。
甚至awk 还可以写成专门的脚本写成一个 #!/bin/awk -f 机制当成一个命令来执行
另外awk里面也支持传参数,传一些变量的话我们可以使用 - V 加上 -v 在BEGIN语句里面就可以用变量。不加 - v 就只能在shell的逐行处理中使用,就不能再BEGIN里面使用了。
来源:https://blog.51cto.com/14451140/2434419