@mrz1
2017-12-31T15:09:32.000000Z
字数 20912
阅读 1735
笔记
rm -rf /boot/ /etc/fstab
dd if=/dev/zero of=/dev/sda1 //boot没了数据没了文件系统破坏了
修复需光盘引导 救援模式修复
修复 需要创建文件系统 mkfs.ext4 /dev/sda1
由于/etc/fstab文件被破坏,所以逻辑卷不能被挂载,此时必须先激活卷组,可以查看一下lv和vg,均处于不可用状态。
查看:lvs lvdisplay 逻辑卷 pvs 卷组激活逻辑卷:vgchange –ay创建一个挂载点:mkdir /mnt/root下面进行挂载:mount /dev/VolGroup/lv_root /mnt/root
现在开始恢复之前的fstab文件
自己手动写入文件内容导入到/etc/fstab,由于驱动也被破坏了,不能使用vim编辑器,所以只能用重定向导入。cat > /mnt/rootfs/etc/fstab/dev/sda1/ /boot ext4 defaults 0 0/dev/mapper/VolGroup/lv_root / ext4 defaults 0 0/dev/mapper/VolGroup-lv-swap swap swap defaults 0 0
重要:之后必须重新启动让救援模式自动挂载分区
点击shell start shell之后
chroot /mnt/sysimage 切换跟 //要装greb 必须切根mkdir /mnt/chrommount /dev/sr0 /mnt/chromrpm -ivh /mnt/Packages/kernel-2.6.32-696.el6.x86_64.rpm --force //引文切跟了 所以不写--root=/mnt/sysimagegreb-install /dev/sda 修复完成这里 修复好了 稍等下sync 因为它写到缓存 立即重启有可能会出现问题但是唯独没有grub.conf
之后 编辑grub.conf文件default=0timeout=5titel centos6kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=uuid=xxxxinitrd /initramfs-2.6.32-696.el6.x86_64.imgr!ls /boot/vmlinuz-2.6.32-696.el6.x86_64 /boot/initramfs-2.6.32-696.el6.x86_64.imgr!blkid /dev/sda2现在重启 完成

分区并创建文件系统fdisk /dev/sdb分两个必要的分区 /dev/sdb1对应 /boot /dev/sdb2对应根 /mkfs.ext4 /dev/sdb1mkfs.ext4 /dev/sdb2挂载bootmkdir/mnt/boot 子目录必须为bootmount /dev/sdb1 /mnt/boothexdump -C -n 512 /dev/sdb //有分区 没有grub 1 1.5 2 阶段安装grubgrub-install --root-directory=/mnt/dev/sdbls /mnt/boot/grub //查看是否生成恢复内核和initramfs文件rpm -ivh /mnt/Packages/kernel-2.6.32-696.el6.x86_64.rpm --force //这条命令会装内核文件磁盘文件各种/lib/modules/*库 这里我们考过去最基本的cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot建立grub.confvim /mnt/boot/grub.confdefault=0timemout=3title costomlinuxkernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash //这里写bash是因为简单 如果写init 还得写大量的配置文件/etc/inittab 各种脚本initrd /initramfs-2.6.32-642.el6.x86_64.img创建一级目录mkdir /mnt/rootfsmount /dev/sdb2 /mnt/rootfsmkdir –pv /mnt/rootfs/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}复制bash和相关库文件复制相关命令及相关库文件 需要copycmd.sh文件复制如:bash ifconfig insmod ping ls cat mv cp mount quit 网卡驱动(modinfo e1000//查看路径)...等insmod /lib/e1000.ko 加载网卡驱动ifconfig eth0 192.168.2.03 配置ip开机启动配置ipgrub.confvim /mnt/boot/grub.confkernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 //这里不写参数 它会直接去/sbin/initvim /sbin/init/bin/bashinsmod /lib/e1000.koifconfig eth0 192.168.2.03就会先执行就这脚本 脚本有/bin/bash 加载网卡驱动,配置网络
在根文件系统无法使用时需要,如/bin/mount删除
对系统没有特殊要求
从光盘引导(boot.iso或者安装光盘#1)
从USB盘(由boot.iso制作)引导
文件系统重组
Anaconda将会询问是否应该挂载文件系统/mnt/sysimage/*/mnt/stage2$PATH包括硬盘的目录
系统在引导期间,很重要的一个过程就是init进程读取其配置文件/etc/inittab,启动系统基本服务程序及默认运行级别的服务程序完成系统引导,如果/etc/inittab误删除或修改错误,Linux将无法正常启动。此时,只有通过救援模式才可以解决此类问题。
有备份文件的回复方法
进入救援模式,执行chroot命令后,如果有此文件的备份(强烈建议系统中的重要数据目录,如/etc、/boot等要进行备份),直接将备份文件拷贝回去,退出重启即可。如果是配置文件修改错误,如比较典型的/boot/grub/grub.conf及/etc/passwd的文件修改错误,也可以直接修正恢复。假设有备份文件/etc/inittab.bak,则在救援模式下执行:chroot /mnt/sysimagecp /etc/inittab.bak /etc/inittab
没有备份文件的恢复办法
如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复,首先查找到/etc/inittab属于哪一个RPM包chroot /mnt/sysimagerpm -qf /etc/inittabinitscripts-9.03.49-1.el6.centos.x86_64exit 退出chroot模式挂载存放RPM包的安装光盘(在救援模式下,光盘通常挂载在/mnt/source目录下)
mount /dev/sr0 /mnt/source
CentOS6系统的RPM包存放在光盘Package目录下,要修复的硬盘系统的根目录在/mnt/sysimage下,需要使用--root选项指定其位置。覆盖安装/etc/inittab文件所在的RPM包:
rpm -ivh --replacepkgs | force /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm
其中的rpm命令选项"--replacepkgs"表示覆盖安装,执行完成后,即已经恢复了此文件
如果想只提取RPM包中的/etc/inittab文件进行恢复,可以在进入救援模式后,执行命令:
rpm2cpio /mnt/source/Packages/initscripts-9.03.49-1.el6.centos.x86_64.rpm| cpio -idv ./etc/inittabcpetc/inittab/mnt/sysimage/etc
注意此命令执行时不能将文件直接恢复至/etc目录,只能提取到当前目录下,且恢复的文件名称所在路径要写完整的路径。提取文件成功后,将其复制到根分区所在的/mnt/sysimage目录下相应位置即可
/proc/cmdline /boot/grub/grub.conf 内核的启动参数/proc/sys/net/ipv4/ 目录下是网络相关的 在改只是临时生效存不住(内存信息)想要保存住使用命令:sysctl 写配置文件sysctl -w path.to.parameter=VALUE例:net.ipv4.ip_forward=0[root@centos6 ~]#sysctl -w net.ipv4.ip_forward=0net.ipv4.ip_forward = 0注意: net.ipv4.ip_forward 前面不用加/proc/sys因为sysctl命令只是管就是/proc/sys里面的net/ipv4/ip_forward 之后把"/"换成"."就成了修改hostnamesysctl -w kernel.hostname=mail.magedu.com永久保存写文件 /etc/sysconfig/network[root@centos6 ipv4]#cat /etc/sysconfig/networkNETWORKING=yesHOSTNAME=centos6.qifei.com[root@centos7 ~]#cat /etc/hostnamecentos7.qifei.com[root@centos7 ~]#hostnamectl set-hostname centos7.qifei.com //设置hostname
sysctl命令:默认配置文件:/etc/sysctl.conf(不是所有配置文件都在这里有比如禁ping)(1) 设置某参数sysctl -w parameter=VALUE(2) 通过读取配置文件设置参数sysctl -p [/path/to/conf_file](3) 查看所有生效参数sysctl -a常用的几个参数:net.ipv4.ip_forwardnet.ipv4.icmp_echo_ignore_allvm.drop_caches[root@centos6 proc]#sysctl -a |grep dropvm.drop_caches = 0fs.quota.drops = 0net.core.xfrm_larval_drop = 1[root@centos6 proc]#sysctl -w vm.drop_caches=1 //清理内存vm.drop_caches = 1
[root@centos6 ~]#cat /proc/sys/net/ipv4/icmp_echo_ignore_all0net.ipv4.icmp_echo_ignore_all = 1 //把这个写到/etc/sysctl.conf里面就行了 禁pingsysctl -p //从新读/etc/sysctl.conf 生效禁pingsysctl -a //查看所有生效的设置如果注释net.ipv4.icmp_echo_ignore_all = 1 ;sysctl -p 是读取内存中的 内存是什么 就是什么 机器重启就恢复成默认0
扫描硬盘echo '- - -' > /sys/class/scsi_host/host0/scan/etc/udev/rules.d/70-persistent-net.rules //修改eth0 名称自己写一个80-disk.rules文件(意思是发现新硬盘如果是/dev/sdc/ 就创建软连接 disk2 可以参考70-persistent-cd.rules)[root@centos6 rules.d]#vim 80-disk.rulesSUBSYSTEM=="block",KERNEL=="sdc",SYMLINK="disk2"块设备 如果是sdc 软连接是disk2[root@centos6 rules.d]#ll /dev/disk2lrwxrwxrwx. 1 root root 3 Dec 28 16:20 /dev/disk4 -> sdc
单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制内核组成部分:kernel: 内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE(rpm -ql kernel 包)kernel object: 内核对象,一般放置于(如需加载需要的放到vmlinuz)/lib/modules/VERSION-RELEASE/(例:ntsysv 命令)[ ]: N 这功能不启用[M]: M 独立文件[*]: Y 生成到vmlinuz-VERSION-RELEASE辅助文件:ramdiskinitrdinitramfs/boot/config-3.10.0-693.el7.x86_64
运行中的内核:
uname命令:uname - print system informationuname[OPTION]...-n: 显示节点名称-r: 显示VERSION-RELEASE-a: 显示所有信息
lsmod命令:显示由核心已经装载的内核模块(根据硬件自动加载例:优盘usb)显示的内容来自于: /proc/modules文件
modinfo命令:显示模块的详细描述信息modinfo[ -k kernel ] [ modulename|filename... ]-n: 只显示模块文件路径-p: 显示模块参数-a: author 作者-d: description 描述-l: license 许可证lsmod|grep xfs;modinfo xfs[root@centos7 ~]#modinfo -n usb_storage/lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/usb/storage/usb-storage.ko.xz
modprobe命令:装载或卸载内核模块modprobe[ -C config-file ] [ modulename] [ module parame-ters... ]配置文件:/etc/modprobe.conf/etc/modprobe.d/*.confmodprobe[ -r ] modulename...modprobe -r usb_storage //卸载usb模块
depmod命令:内核模块依赖关系文件及系统信息映射文件的生成工具装载或卸载内核模块
insmod命令:指定模块文件,不自动解决依赖模块insmod[ filename ] [ module options... ]insmod `modinfo –n exportfs`lnsmod `modinfo –n xfs`
rmmod命令:卸载模块rmmod[ modulename]rmmod xfsrmmod exportfsrmmod usb_storage //卸载usb模块(有依赖性)
前提:
1. 准备好开发环境
2. 获取目标主机上硬件设备的相关信息
3. 获取目标主机系统功能的相关信息例如:需要启用相应的文件系统
4. 获取内核源代码包www.kernel.org
包组(CentOS 6):Server Platform DevelopmentDevelopment Tools目标主机硬件设备相关信息:CPU:cat /proc/cpuinfox86info -a //yum search x86info //查看包名lscpulspcilsusb
PCI设备:
lspci-v-vvlsusb-v-vvlsblk 块设备
CentOS6全部硬件设备信息hal-device
tail /var/log/messages //硬件有没有识别
df -T 查看什么系统
内核文件一般编译安装大概生成10多G,注意空间安装开发包组下载源码文件.config:准备文本配置文件make menuconfig:配置内核选项make [-j #]make modules_install:安装模块make install :安装内核相关文件安装bzImage为/boot/vmlinuz-VERSION-RELEASE生成initramfs文件编辑grub的配置文件
1:
tar xvf linux-4.14.9.tar.xz -C /app //解压du -sh /app //查看大小 1比9cd /app/linux-4.14.9/cp /boot/config-3.10.0-693.el7.x86_64 .configmake menuconfig 配置内核选项(有可能打不开缺少包组 例:ncurses-devel)grep NTFS .config 查看是否启用make [-j #] 用几核cpu编译for i in {1..10};do sleep 0.3;echo -e "\a";done ;make [-j #] 发出声音提醒(有可能还缺少库文件继续安装)make modules_install:安装模块 //lib/modulesmake install :安装内核相关文件安装bzImage为/boot/vmlinuz-VERSION-RELEASE生成initramfs文件编辑grub的配置文件U盘不可写yum search ntfsyum install ntfsprogsyum history uodo 33(编号)
2:
tar xf linux-3.10.67.tar.xz -C /usr/srccd /usr/srcln -sv linux-3.10.67 linuxcd /usr/src/linuxcp /boot/config-$(uname -r) ./.configmake helpmake menuconfigmake -j 2make modules_installmake installreboot
1.配置内核选项
(一)支持"更新"模式进行配置:make help(a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项(b) make menuconfig:基于curses的文本窗口界面(c) make gconfig:基于GTK (GNOME)环境窗口界面(鼠标)(d) make xconfig:基于QT(KDE)环境的窗口界面(二)支持"全新配置"模式进行配置(a) make defconfig:基于内核为目标平台提供的"默认"配置进行配置(b) make allyesconfig: 所有选项均回答为"yes"(c) make allnoconfig: 所有选项均回答为"no"
2.编译
全编译:make [-j #]编译内核的一部分功能:(a) 只编译某子目录中的相关代码cd /usr/src/linuxmake dir/ 编译dir里面所有模块驱动(b) 只编译一个特定的模块cd /usr/src/linuxmake dir/file.ko 编译dir/file.ko这个模块驱动例如:只为e1000编译驱动:make drivers/net/ethernet/intel/e1000/e1000.ko
3.如何交叉编译内核:
编译的目标平台与当前平台不相同(一般在哪编译在哪用)make ARCH=arch_name
4.要获取特定目标平台的使用帮助
make ARCH=arch_name helpmake ARCH=arm help 编译arm用到各种的功能选项
5.在已经执行过编译操作的内核源码树做重新编译
6.需要事先清理操作:
make clean:清理大多数编译生成的文件,但会保留config文件等make mrproper: 清理所有编译生成的文件、config及某些备份文件make distclean:mrproper、patches以及编辑器备份文件
7.卸载内核
删除/lib/modules/目录下不需要的内核库文件删除/usr/src/linux/目录下不需要的内核源码删除/boot目录下启动的内核和内核映像文件更改grub的配置文件,删除不需要的内核启动列表centous7 /boot/grub/grub2/grub.cfggrub2-mkconfig -o grub.cfg //生成这个文件
SELinux: Secure Enhanced Linux,是美国国家安全局(NSA=The National Security Agency)和SCC(Secure Computing Corporation)开发的Linux的一个强制访问控制的安全模块。2000年以GNU GPL发布,Linux内核2.6版本后集成在内核中
DAC:Discretionary Access Control自由访问控制(没有SELINUX)
MAC:Mandatory Access Control 强制访问控制(有SELINUX)
1. DAC环境下进程是无束缚的
2. MAC环境下策略的规则决定控制的严格程度
3. MAC环境下进程可以被限制的
4. 策略被用来定义被限制的进程能够使用那些资源(文件和端口)
5. 默认情况下,没有被明确允许的行为将被拒绝
[root@centos7 boot]#cat config-3.10.0-693.el7.x86_64 |grep SELINUXCONFIG_SECURITY_SELINUX=y //7已经集成到内核里面了·······

SELinux有四种工作类型:(/etc/selinux/config)
1. strict: centos5,每个进程都受到selinux的控制
2. targeted: 用来保护常见的网络服务,仅有限进程受到selinux控制,只监控容易被入侵的进程,centos4只保护13个服务,centos5保护88个服务
3. minimum:centos7,修改的targeted,只对选择的网络服务
4. mls:提供MLS(多级安全)机制的安全性
targeted为默认类型,minimum和mls稳定性不足,未加以应用,strict已不再使用
/etc/selinux/config
[root@centos7 ~]#getenforcePermissive[root@centos7 ~]#sestatusSELinux status: enabledSELinuxfs mount: /sys/fs/selinuxSELinux root directory: /etc/selinuxLoaded policy name: targetedCurrent mode: permissiveMode from config file: permissivePolicy MLS status: enabledPolicy deny_unknown status: allowedMax kernel policy version: 28[root@centos7 ~]#setenforce 1[root@centos7 ~]#sestatusSELinux status: enabledSELinuxfs mount: /sys/fs/selinuxSELinux root directory: /etc/selinuxLoaded policy name: targetedCurrent mode: enforcingMode from config file: permissivePolicy MLS status: enabledPolicy deny_unknown status: allowedMax kernel policy version: 28[root@centos7 ~]#getenforceEnforcingenforcing 变成enabled 必须关机安全上下文有五个元素组成:`user:role:type:sensitivity:category`会消失 -rw-r--r--. 点会没有
user:role:type:sensitivity:category user_u:object_r:tmp_t:s0:c0(ll -Z//查看)semanage fcontext –l安全上下文有五个元素组成:unconfined_u:object_r:admin_home_t:s0
1. User:指示登录系统的用户类型,如root,user_u,system_u,多数本地进程都属于自由(unconfined)进程
2. Role:定义文件,进程和用户的用途:文件:object_r,进程和用户:system_r
3. Type:指定数据类型,规则中定义何种进程类型访问何种文件Target策略基于type实现,多服务共用:public_content_t
4. Sensitivity:限制访问的需要,由组织定义的分层安全级别,如unclassified,secret,top,secret, 一个对象有且只有一个sensitivity,分0-15级,s0最低,Target策略默认使用s0
5. Category:对于特定组织划分不分层的分类,如FBI Secret,NSA secret, 一个对象可以有多个categroy,c0-c1023共1024个分类,Target 策略不使用category
配置SELinux:SELinux是否启用给文件重新打安全标签给端口设置安全标签设定某些操作的布尔型开关SELinux的日志管理SELinux的状态:enforcing: 强制,每个受限的进程都必然受permissive: 允许,每个受限的进程违规操作不会被禁止,但会被记录于审计日志disabled: 禁用
相关命令:getenforce: 获取selinux当前状态sestatus:查看selinux状态setenforce0|10: 设置为permissive 1: 设置为enforcing配置文件:/boot/grub/grub.conf使用selinux=0禁用SELinux/etc/selinux/config/etc/sysconfig/selinuxSELINUX={disabled|enforcing|permissive}
给文件重新打安全标签:chcon[OPTION]... [-u USER] [-r ROLE] [-t TYPE] FILE...chcon[OPTION]... --reference=RFILE FILE...-R:递归打标;恢复目录或文件默认的安全上下文:restorecon[-R] /path/to/somewhere
Semanage:来自policycoreutils-python包查看默认的安全上下文semanage fcontext–l添加安全上下文semanage fcontext -a –t httpd_sys_content_t '/testdir(/.*)?' restorecon–Rv/testdir删除安全上下文semanage fcontext -d –t httpd_sys_content_t '/testdir(/.*)?'
查看端口标签semanage port –l添加端口semanage port -a -t port_label-p tcp|udp PORTsemanage port -a -t http_port_t -p tcp 9527删除端口semanage port -d -t port_label-p tcp|udp PORTsemanage port -d -t http_port_t -p tcp 9527修改现有端口为新标签semanageport -m -t port_label-p tcp|udp PORTsemanageport -m -t http_port_t-p tcp 9527注意:httpd自带的端口不可修改不可删
[root@centos7 ~]#systemctl start httpd //启动httpd 服务cp /var/www/html/index.html /rootunconfined_u:object_r:httpd_sys_content_t:s0 //原先的mv /root/index.html /var/www/html/unconfined_u:object_r:admin_home_t:s0 //修改后的这时httpd服务会找不到html文件restorecon -R /var/www/html/ //还原这个目录下该有的标签chcon -t httpd_sys_content_t /var/www/html/index.html //针对单个文件修改默认标签semanage fcontext -a –t httpd_sys_content_t '/app(/.*)?'restorecon -R /app/ //还原这个目录下该有的标签httpd_sys_content_t删除默认标签semanage fcontext -d –t httpd_sys_content_t '/app(/.*)?'restorecon -R /app/ //还原这个目录下该有的标签default查看端口标签semanage port -l |grep http编辑/etc/httpd/conf/httpd.conf#Listen 12.34.56.78:80Listen 80Listen 9527 //80改成9527这个端口服务就启动失败了SE 策略报警信息 tail -n 30 cat /var/log/messages //最后30条添加端口semanage port -a -t http_port_t -p tcp 9527删除端口semanage port -d -t http_port_t -p tcp 9527修改现有端口为新标签semanage port -m -t ssh_port_t -p tcp 9527
布尔型规则:getseboolsetsebool 修改布尔值查看bool命令:getsebool[-a] [boolean]semanage boolean –lsemanage boolean -l –C 查看修改过的布尔值设置bool值命令:setsebool [-P] booleanvalue(on,off)setsebool [-P] Boolean=value(0,1)getsebool -a 与semanage boolean -l相比?getsebool -a 只显示生效的semanage boolean -l 显示当前生效和磁盘上保存的(内存)(磁盘)
[root@centos7 ~]#semanage boolean -l|grep ftpd_anon_writeftpd_anon_write (off(内存) , off(磁盘)) Allow ftpd to anon write[root@centos7 ~]#setsebool ftpd_anon_write=1 //等于1 或者on 等价 只改的内存 下次重启失效ftpd_anon_write (on(内存) , off(磁盘)) Allow ftpd to anon write[root@centos7 ~]#setsebool -P ftpd_anon_write=1 //等于1 或者on 等价 改的全部 保存下次重启不失效ftpd_anon_write (on(内存) , on(磁盘)) Allow ftpd to anon write[root@centos7 ~]#semanage boolean -l –C 查看修改过的布尔值ftpd_anon_write (on(内存) , on(磁盘)) Allow ftpd to anon write
yum install setroubleshoot(重启生效)将错误的信息写入/var/log/messagegrep setroubleshoot /var/log/messagessealert -l UUID查看安全事件日志说明sealert -a /var/log/audit/audit.log扫描并分析日志
yum –y install selinux-policy-devel (centos7.2帮助)yum –y install selinux-policy-doc (centos7.3以后)yum info selinux-policy-doc 查看yum search selinux-policy-doc 搜索mandb | makewhatis 更新数据库man -k _selinux 查看与selinux相关的文档服务
httpd为例
[root@centos7 ~]#mandb 更新数据库[root@centos7 ~]#man -k _selinux |grep httpd_selinux 看在哪个章节httpd_selinux(8) -XXXXXXXXXXXXXXXXXXXX[root@centos7 ~]#man 8 httpd_selinux 查看文档[root@centos7 ~]#man 8 ftpd_selinux 查看文档有的配置文件都告诉你怎么改 /etc/ssh/sshd_config
/etc/selinux/config
case $1 in
on)
sed -i 's/^SELINUX=.*/SELINUX=enforcing/' /etc/selinux/config
;;
off)
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
echo "please reboot"
;;
*)
echo 'SELinux on or off'
;;
esac
awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出有多种版本:New awk(nawk),GNU awk(gawk)gawk:模式扫描和处理语言基本用法:awk [options] 'program' var=value file...awk [options] -f programfile var=value file...awk [options] 'BEGIN{ action;... } pattern{ action;... } END{ action;... }' file ...awk程序通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块,共3部分组成program通常是被单引号或双引号中选项:-F 指明输入时用到的字段分隔符-v var=value: 自定义变量
基本格式:awk [options] 'program' file...program:pattern{action statements;..}pattern和action:pattern部分决定动作语句何时触发及触发事件BEGIN,ENDaction statements对数据进行处理,放在{}内指明print, printf注意: 内部命令也有printf,处理字符串和echo差不多分割符、域和记录awk执行时,由分隔符分隔的字段(域)标记$1,$2..$n称为域标识。$0为所有域,注意:和shell中变量$符含义不同文件的每一行称为记录省略action,则默认执行print $0 的操作
第一步:执行BEGIN{action;... }语句块中的语句第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;... }语句块,它逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。第三步:当读至输入流末尾时,执行END{action;...}语句块BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句块,则默认执行{ print },即打印每一个读取到的行,awk读取的每一行都会执行该语句块
print格式:print item1, item2, ...
要点:
(1) 逗号分隔符
(2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式
(3) 如省略item,相当于print $0
示例:
awk '{print "hello,awk"}' //输入什么打印hello,awkawk -F: '{print}' /etc/passwd //打印所有awk -F: '{print "wang"}' /etc/passwd //打印用户名全是wangawk -F: '{print $1}' /etc/passwd //打印用户名awk -F: '{print $0}' /etc/passwd //打印所有awk -F: '{print $1"\t"$3}' /etc/passwd //打印用户名和uid制表符分开tail -3 /etc/fstab | awk '{print $2,$3}' //打印/etc/fstab后三行取出挂载点和什么系统
实例:
支持\n[root@centos7#echo "QQ" |awk '{print "qq\nqq"}'支持运算[root@centos7]#echo "QQ" |awk '{print 2*2}'4[root@centos7]#echo "QQ" |awk '{print 2^3}'8[root@centos7]#echo "QQ" |awk '{print 2/3}'0.666667取出特定的格式[root@centos7]#awk -F: '{print $1,$3,$4}' passwdroot 0 0[root@centos7]#df -h |grep /dev/sd |awk '{print $1,$5}'/dev/sda2 8%/dev/sda1 16%/dev/sda3 1%支持\t[root@centos7]#df -h |grep /dev/sd |awk '{print $1"\t"$5}'/dev/sda2 8%/dev/sda1 16%/dev/sda3 1%
awk默认分隔符是空白符 字符串必须用双引号
变量:内置和自定义变量FS:输入字段分隔符,默认为空白字符(变量)awk -v FS=':' '{print $1,FS,$3}' /etc/passwdawk -F: '{print $1,":",$7}' /etc/passwdOFS:输出字段分隔符,默认为空白字符awk -v FS=':' -v OFS=':' '{print $1,$3,$7}'' /etc/passwdRS:输入记录分隔符,指定输入时的换行符awk -v RS=' ' '{print }' /etc/passwdORS:输出记录分隔符,输出时用指定符号代替换行符awk -v RS=' ' -v ORS='###' '{print }' /etc/passwdNF:字段数量awk -F:'{print NF}' /etc/fstab 引用内置变量不用$awk -F: '{print $(NF-1)}' /etc/passwdNR:记录号awk '{print NR}' /etc/fstab; awkEND'{print NR}' /etc/fstabFNR:各文件分别计数,记录号awk '{print FNR}' /etc/fstab /etc/inittabFILENAME:当前文件名awk '{print FILENAME}’ /etc/fstabARGC:命令行参数的个数awk '{print ARGC}' /etc/fstab /etc/inittabawk 'BEGIN {print ARGC}' /etc/fstab/etc/inittabARGV:数组,保存的是命令行所给定的各参数awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/inittabawk 'BEGIN {print ARGV[1]}' /etc/fstab/etc/inittab
练习1(可以调用bash变量)
FS(以它为分隔符找出$1$3)[root@centos7]#awk -v FS=':' '{print $1,$3}' /etc/passwdroot 0[root@centos7]#seq=":";awk -v FS="$seq" '{print $1FS$3}' /etc/passwdroot:0OFS(输出分隔符默认是空白符)[root@centos7]# awk -v FS=':' -v OFS='#' '{print $1,$3}' /etc/passwdroot#0RS:(以;为分隔符(aa bb cc)(ee ff oo)(xx yy zz)分三组$2 bb ff yy )[root@centos7]#cat f1.txtaa bb cc ;eeff oo ;xxyy zz[root@centos7]#awk -v RS=";" '{print $2}' f1.txtbbffyyORS:(RS找以空格分割 ORS是用---替换)[root@centos7]#cat f1.txtaa bb cc ;eeff oo ;xxyy zz[root@centos7]#awk -v RS=' ' -v ORS="---" '{print $1 $2 }' f1.txtaa---bb------cc---;eeff---oo---;xxyy---zz---NF:字段数量[root@centos7]#awk -F: '{print NF}' /etc/fstab011311111111在文件中找以":"分割的 如果这一行没东西是0 有东西但是没有:是1 有:看下分成几段[root@centos7]#awk -F: '{print NF}' /etc/passwd 字段777[root@centos7]#awk -F: '{print $NF}' /etc/passwd 倒数一/bin/bash[root@centos7]#awk -F: '{print $(NF-1)}' /etc/passwd 倒数二/root[root@centos7]#ss -nt |grep ESTAB |awk '{print $NF}'|awk -F: '{print $1}'172.18.101.65[root@centos7]#df |grep /dev/sd | awk '{print $1,$(NF-1)}'|awk -F\% '{print $1}'/dev/sda2 8/dev/sda1 16/dev/sda3 1[root@centos7]#awk '{print $1}' /var/log/httpd/access_log172.18.0.100 ....NR:记录号[root@centos7]#awk '{print NR,$0}' /etc/passwd 一个文件1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin ...[root@centos7]#awk '{print NR,$0}' /etc/passwd /etc/issue 多个文件,行号累加 (空白行也算一行)1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin48 time is \t49 tty is \l50 \S51 Kernel \r on an \m52FNR 独立编号[root@centos7]#awk '{print FNR,$0}' /etc/passwd /etc/issue 多个文件 行号不累加(空白行也算一行)1 root:x:0:0:root:/root:/bin/bash2 bin:x:1:1:bin:/bin:/sbin/nologin3 daemon:x:2:2:daemon:/sbin:/sbin/nologin48 time is \t49 tty is \l50 \S51 Kernel \r on an \m52FILENAME:当前文件名[root@centos7]# awk '{print FNR,FILENAME,$0}' /etc/passwd /etc/issue1 /etc/passwd root:x:0:0:root:/root:/bin/bash2 /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin1 /etc/issue The hostname is \n2 /etc/issue time is \tARGC:命令行参数的个数[root@centos7]# awk '{print ARGC}' /etc/fstab /etc/inittab3 (awk /etc/fstab /etc/inittab 这三个)[root@centos7]# awk '{print ARGV[0]}' /etc/fstab /etc/inittabawkARGV:数组,保存的是命令行所给定的各参数[root@centos7]# awk '{print ARGV[0]}' /etc/fstab /etc/inittab3 (awk /etc/fstab /etc/inittab 这三个)[root@centos7]# awk '{print ARGV[1]}' /etc/fstab/etc/inittab2 (awk /etc/fstab/etc/inittab 这两个/etc/fstab/etc/inittab是一个整体 )
自定义变量(区分字符大小写)(两种方式定义变量)
(1) -v var=value
(2) 在program中直接定义
示例:
[root@centos7 app]#awk -v seq='---' -F: '{print $1seq$2}' /etc/passwd seq自定义变量root---xbin---x这种写法可以调用bash变量[root@centos7]#awk -v username="username" -v uid="uid" -v seq=":" -F: '{print username seq $1"\t"uid seq $3}' /etc/passwdusername:root uid:0username:bin uid:1[root@centos7]#seq=":";awk -v seq="$seq" -F: '{print $1seq$3}' /etc/passwdroot:0下面这两种写法没发调用bash变量[root@centos7]#awk -F: '{sex="male";print$1,sex,age;age=18}' /etc/passwd (变量需先定义)root malebin male 18[root@centos7]#awk -F: '{ username="username" ;print username,$1}' /etc/passwdusername root[root@centos7]#vim awkscript{username="username" ;print username,$1}[root@centos7]#awk -F: -f awkscript /etc/passwdusername root