awk
-F 指明输入时用到的字段分隔符
默认空格为分隔符
-v 自定义变量
基本格式:awk [options] 'program' file
$1,$2..$n称为域标识,$0为所有域。
文件的每一行称为记录
awk '{print}' /etc/passwd
默认 print $0 显示全段
awk 'BEGIN{print "hello,awd"}'
awk '{print "hello,awd"}' 支持输入
df |awk '{print $5}'
df |awk '{print $1,$5}' ,默认以空格隔开
df |awk '{print $1"\t"$5}'
awk -F: 'print $1,$3' /etc/passwd
-F: 用:号作为分隔符
awk变量
输入字段分隔符
awk -v FS=":" '{print $1}' /etc/passwd
-v FS=":" 等于-F:
awk -v FS="bash" '{print $1}' /etc/passwd
awk -v FS=":" -v OFS="+++"' '{print $1,$3,$4,$5}' /etc/passwd 定义输出时候的分隔符
冒号分隔之后用+++替代分隔
awk -v FS=":" -v OFS="\t" '{print $1,$3,$4,$5}' /etc/passwd
awk -v RS=" " '{print $1,$2}' f1 输出将空格成为独立的行 记录的分隔符
awk -v RS=" " -v OFS="---" -v ORS="***" '{print $1,$2}' f1 -v ORS="***" 这个替换的是回车换行
NF 统计字段
awk -F: '{print NF}' /etc/passwd
NF统计字段
awk -v FS=":" '{print $NF}' /etc/passwd 等于显示$7
awk -v FS=":" '{print $(NF-1)}' /etc/passwd 等于显示$6
NR 显示行号
awk -v FS=":" '{print NR,$0}' /etc/passwd
awk -v FS=":" '{print NR,$0}' /etc/passwd /etc/issue
FNR 分开文件计算
awk -v FS=":" '{print FNR,$0}' /etc/passwd /etc/issue
FILENAME 每一行打印出文件名
awk -v FS=":" '{print FILENAME,$0}' /etc/passwd /etc/issue
将文件名字和路径写在前面
ARGC 显示命令的参数
awk -v FS=":" '{print ARGC,$0}' /etc/passwd /etc/issue
ARGV 查看那几个参数
awk -v FS=":" '{print ARGV[0]}' /etc/passwd /etc/issue 查看第一个参数 [0-2] 3个
变量:内置和自定义变量
FS:输入字段分隔符,默认为空白字符
awk-v FS=':' '{print $1,$3,$7}’ /etc/passwd
awk–F: '{print $1,$3,$7}’ /etc/passwd
OFS:输出字段分隔符,默认为空白字符
awk -v FS=‘:’ -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd
RS:输入记录分隔符,指定输入时的换行符,原换行符仍有效
awk -v RS=' ' ‘{print }’ /etc/passwd
ORS:输出记录分隔符,输出时用指定符号代替换行符
awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd
NF:字段数量
awk -F:‘{print NF}’ /etc/fstab,引用内置变量不用$
awk -F: '{print $(NF-1)}' /etc/passwd
显示的是倒数第二位等于显示$6
NR:行号
awk '{print NR}' /etc/fstab; awk END'{print NR}' /etc/fstab
1-12是etc/fstab的行数,54是/etc/passwd的行数
awk自定义变量
awk -F: -v name="supername" '{print name,$1}' /etc/passwd
里面定义的name="supername"
awk -F: -v name="supername" -f bin/awk.sh /etc/passwd -f可以调用
awk -F: '{name="superman";print name,$1}' /etc/passwd 定义多个变量
printf 命令
格式符:与item一一对应
%c: 显示字符的ASCII码
%d, %i: 显示十进制整数
%e, %E:显示科学计数法数值
%f:显示为浮点数
%g, %G:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%: 显示%自身
awk -F: '{printf "%s %d\n ",$1,$3}' /etc/passwd
awk -F: '{printf "%20s %10.2fd\n ",$1,$3}' /etc/passwd %20字符宽度,默认右对齐,左对齐%-20
%10.2f 宽度为10,显示后两位小数
操作符号,+ - * / 都支持
awk 'BEGIN{print 10*10}'
awk -v i=1 'BEGIN{print i++,i}'
显示1 2 i在前就显示i,++i就加完再打印
$0~"$root" 默认包含root
awk -F: '$3==0' /etc/passwd
'$3=="root"' 数字可以不加""
三目表达式
awk -F: '{$3>=1000?username="commonuser":username="sysuser";printf "%s %s %d",username,$1,$3}' /etc/passwd
模式过滤
没写模式默认全部处理
正则表达式
awk '/^UUID/' /etc/fstab
将UUID开头的句子显示出来
awk '/bash$/' /etc/passwd
将bash结尾的行显示出来
relational expression: 关系表达式;结果有“真”有“假”;结果为“真”才会被处理;
真:结果为非0值,非空字符串
假:结果为空字符串
awk -F: '/^root\>/,/^ftp\>/' /etc/passwd
/root/开头到 /ftp/开头
awk -F:'BEGIN{print "username uid"}/^root\>/,/^ftp/{print $1,$3}END{print "end file"}' /etc/passwd
print与printf的区别在前者负责的数据会自动换行
判定语句
seq 10|awk 'i=!i'
第一行i开始=0 !i=1 第二行i=1 !i=0 第三行重复第一行,所以只会显示单数行。
所以显示奇数值
seq 10|awk '!(i=!i)'
加非判断结果显示偶数行
seq 10|awk -v i=1 'i=!i'
偶数值
一开始赋值就是1,非1等于0假不输出。
seq 10|awk '{i=!i;print i}' 可以查看到i的值变化
组合语句
if-else
if(条件){组合}else if(条件){组合}else(条件){组合}
awk -F: '{if($3>=1000)print $1,$3}' /etc/passwd
将ID大于1000的用户名字和ID打印出来,-F:用:号来做分隔符。
多条件判定
awk 'BEGIN{ test=100;if(test>90){ print "very good";}else if(test>60){ print "good";}else{ print "no pass";}}'
根据数据判定
while循环
条件真进入循环,条件假退出循环
awk
do-while循环
语法:do statement while(condition)
意义:无论真假,至少执行一次循环体
awk在处理数值较大的时候速度比较有优势
break和continue
break 直接退出循环
continue 直接跳过当次循环
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i%2==0){continue}sum+=i}print sum}'
执行循环,当偶数的时候就跳出,等于奇数双加
awk 'BEGIN{sum=0;for(i=1;i<=100;i++){if(i==11){break}sum+=i}print sum}'
等于执行了10次的双加,第11次完全跳出循环
next
提前结束对本行处理而直接进入下一行处理(awk自身循环)
awk -F: '{if($3%2!=0) next;print $1,$3}' /etc/passwd
打印UUID为偶数的行
awk数组
关联数组:array[index-expression]
index-expression:
(1) 可使用任意字符串;字符串要使用双引号括起来
(2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”
若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历
awk 'BEGIN{week[0]="sun";week[1]="mon"; print week[0]}'
数组[0]的数值
awk 'BEGIN{week["frist"]="sum";week["two"]="mon";print week["frist"]}'
字符串要用“”引入,纯数字可以不加。
awk '!arr[0]++' f1 去重复
awk '{!arr[$0]++;print $0,arr[$0]}' f1
第一次![$0]=1 再++所以第一次是真 输出
第二次出现重复的时候[$0]=2取反就是假。所以不输出
第二次出现的数值+1之后判定条件就为正数,!正数等于0,就不输出重复的行数了。
遍历数组
awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]
="Tuesday";for(i in weekdays) {print weekdays[i]}}‘
显示所有的组成员
netstat -tan | awk'/^tcp\>/{state[$NF]++}END
{for(i in state) { print i,state[i]}}'
最后的参数遇到相同的后面+1
awk '{state[$1]++}END{for(i in state){ print i,state[i]}}'
awk函数
awk 'BEGIN{srand();print rand()}'
生成随机数
awk 'BEGIN{srand();print int(rand()*100)}'
生成整数随机数
awk 'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }'
显示10个随机整数
sub/gsub (替换单个/替换整行)
echo "2008:08:08 08:08:08" | awk'sub(/:/,"",$1)'
第一个冒号分隔符替换
echo "2008:08:08 08:08:08" | awk‘gsub(/:/,"",$1)' gsub整个替换
因为我输出的是$1,awk格式是默认空格为分隔号,所以替换$1的整行冒号。(这里$1=2008:08:08)
split($5,ip,":") ip这个组从[1]开始
netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}' 得出IP地址和IP地址出现的次数
统计IP链接的次数
function函数调用
awk -f fun.awk 调用awk函数
使用就fun.awk
function max(v1,v2) {
v1>v2?var=v1:var=v2
return var
}
END{a=3;b=2;print max(a,b);}
要加执行权限使用
脚本调用开头写
!/bin/awk -f 加上执行权限就能直接运行
awk中使用操作系统的指令
awk 'BEGIN{system("hostname")}'
awk 'BEGIN{system("echo xxx")}'
awk 'BEGIN{name="zczx";system("echo " name)}'
awk脚本
#cat f1.awk
{if($3>=1000)print $1,$3}
#awk -F: -f f1.awk /etc/passwd
#cat f2.awk
#!/bin/awk –f
#this is a awk script
{if($3>=1000)print $1,$3}
#chmod +x f2.awk
#f1.awk –F: /etc/passwd
传递参数
#cat f2.awk
#!/bin/awk –f
{if($3 >=min && $3<=max)print $1,$3}
#f2.awk -F: min=100 max=200 /etc/passwd
指定 -F: 为分隔符号
1、统计/etc/fstab文件中每个文件系统类型出现的次数# awk'/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab
2、统计/etc/fstab文件中每个单词出现的次数;
# awk'{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab
systemd 7版本之后使用的管理系统的工具
红帽开发的守护进程
CentOS 5: SysVinit
CentOS 6: Upstart
CentOS 7: Systemd
Systemd:系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程
最大特点:系统引导实现服务并行启动
在6版本以前版本都是串行启动,所以启动较慢
unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息
配置文件:
/usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/
/run/systemd/system:系统执行过程中所产生的服务脚本,比上面目录优先运行
/etc/systemd/system:管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行
cd /etc/systemd/system 如果要存放服务的时候,放在这个路径下比较安全
systemclt
systemclt -t 可以查看unit类型
automount 文件系统自动挂载
系统服务的管理
systemctl 支持保全
命令:systemctlCOMMAND name.service
启动:service name start ==> systemctlstart name.service
停止:service name stop ==> systemctlstop name.service
重启:service name restart ==> systemctlrestart name.service
状态:service name status ==> systemctlstatus name.service
禁止自动和手动启动:
systemctl mask name.service
取消禁止:
systemctl unmask name.service
用于不常用的服务可以通过禁止启动。
可以通过手动更改服务路径可以跳过mask 启动,mask 的原理就是将启动的软连接改成指向/dev/null。
systemctl list-units -t service 查看所有活动的服务
systemctl list-units -t service -all 查看所有的服务
systemctl is-enabled httpd 查询是否开机启动
systemctl enabled httpd 改成开机启动
systemctl disabled httpd 改成开机不启动
systemctl list-dependencies httpd.service 查看服务的依赖性
systemctl kill 进程 杀进程
显示所有单元状态
systemctl
只显示服务单元的状态
systemctl --type=service
显示sshd服务单元
systemctlstatus sshd.service–l
验证sshd服务当前是否活动
systemctl is-active sshd
启动,停止和重启sshd服务
systemctl start sshd.service
systemctl stop sshd.service
systemctl restart sshd.service
重新加载配置
systemctl reload sshd.service
列出活动状态的所有服务单元
systemctl list-units --type=service
列出所有服务单元
systemctl list-units --type=service --all
查看服务单元的启用和禁用状态。
systemctl list-unit-files --type=service
列出失败的服务
systemctl --failed --type=service
target
systemctl list-dependencies .target 查看target的依赖性
systemctl get-default 查看现在是神马状态
systemctl get-default multi-usr.target 切换默认开机成字符界面
graphical.target 图形界面
通过更改软链接路径修改
systemctl isolate multi-usr.target 切换成字符界面
systemctl isolate graphical.target 切换成图形界面
软连接指向谁就运行谁
systemctl rescue 切换成救援模式
systemctlemergency 切换至emergency模式
CentOS7引导顺序
UEFi或BIOS初始化,运行POST开机自检
选择启动设备
引导装载程序, centos7是grub2
加载装载程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
加载initramfs驱动模块
加载内核选项
内核初始化,centos7使用systemd代替init
执行initrd.target所有单元,包括挂载/etc/fstab
从initramfs根文件系统切换到磁盘根目录
systemd执行默认target配置,配置文件/etc/systemd/default.target/etc/systemd/system/
服务格式
cat httpd.service
分3部分
[unit]
Description描述
After:unit的启动次序 想当与依赖关系
Before:与after 相反
Requires: 强依赖,依赖的units无法激活,当前unit也无法激活
Wants:弱依赖
Conflicts:冲突项目
[Service]
Type
EnvironmentFile 文件路径
ExecStart 绝对路径
ExecReload 绝对路径
[Install]
Alias:别名
RequiredBy:强依赖
WantsdBy:强依赖
/etc/systemd/system :系统管理员和用户使用
/usr/lib/systemd/system 开发者使用
破解7root口令
启动时任意键暂停启动
按e键进入编辑模式
将光标移动linux16开始的行,添加内核参数rd.break
按ctrl-x启动 类似单一用户
mount –o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel 自动打标签,因为修改了标签会可能破坏了