1、 描述centos6系统开机启动流程;2、 描述/etc/rc.d/sysinit脚本功能;
http://lisoy79.blog.51cto.com/10836537/1733265
3,sed:stream editor流编辑器,行编辑器,逐行处理数据
用法:
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
pattern space:模式空间,把文本符合定界的行逐行读取到一个内存空间存放处理,然后通过输出流输出到屏幕
script:
常用选项:
-n,静默模式,不输出模式空间中的内容到屏幕;
-e:多点编辑功能;一个命令中实现多个操作
-f /path/to/somefile:从文件中读取事先编辑存成文件的脚本
-r:支持使用扩展正则表达式
-i:编辑原文件,修改原文件
地址定界:
1,不给地址;对全文处理;
2,单地址;
#:第几行
/pattern/:被模式匹配到的每一行;
3,地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
4, ~: 步进
1~2:读所有的奇数行:sed-n '1~2p' test.txt
2~2:读所有的偶数行:sed -n'2~2p' test.txt
编辑命令:
d:删除
sed'/^#/d' /etc/fstab: 删除#开头的行
set '/^$/d' /etc/fstab:删除空白行
sed '1,4d' /etc/fstab:删除1到4行
p:命令,显示模式空间中的内容,
sed '/^UUID/p' /etc/fstab :打印内容两次
sed -n '/^UUID/p' /etc/fstab :打印内容一次
a \text:在指定范围的行后面追加文本,支持\n实现多行追加;
sed '/^uuid/a \# hellosed \n welcome' /etc/fstab
i \text: 在指定范围内的之前添加新行,也支持\n添加多行
sed '/^uuid/i \# hellosed \n welcome' /etc/fstab
c \text:替换行为单行或多行文本;
sed '/^uuid/c \# hellosed \n welcome' /etc/fstab
w /path/to/filename:把符合范围内的模式空间中内容存到指定文件
sed '/^uuid/w/tmp/fstab.txt /etc/fstab
= :等于号:显示符合条件行的行号,为模式空间中的行打印行号
sed '/^uuid/=' /etc/fstab
r /path/from/somefile:把指定文件读取到符合条件的模式空间中的行后
sed '6r/etc/issue' /etc/fstab
! :取反条件;对匹配到的行的其它行做编辑操作;
sed '/^UUID/!d' /etc/fstab :除了uuid开头的行之外都删除,对地址定界取反
s/ / / :支持使用其他分隔符,s@@@s###; 查找替换命令;
替换标记:
g:行内全局替换
i:忽略大小写
sed'S@^UUID@uuid@' /etc/fstab:大写uuid替换为小写
后向引用:
sed's@r..t@&er@g' /etc/passwd: r..t替换为..ter
仅显示被替换的行,替换成功则显示之
sed -n's@r..t@&er@p' /etc/passwd :只显示被替换的行
w /path/to/somefile:将替换成功的结果保存到指定文件中
sed -n's@r..t@&er@w /tmp/fs.txt'/etc/passwd
高级编辑命令:
hold space: 保持空间
patter space:模式空间
h:用模式空间的内容覆盖到保持空间中
H:把模式空间的内容追加至保持空间中
g:从保持空间中取出内容覆盖至模式空间;
G:从保持空间中取出内容追加到模式空间;
x:把模式空间和保持空间的内容互换;
n:读取匹配到的行的下一行至模式空间;会用下一行覆盖模式空间匹配到的行
N:追加匹配到的行的下一行到模式空间:
d:删除模式空间中的行;
D:删除多行模式空间中的所有行
a.txt:
sed -n 'n;p' FILE :显示偶数行
sed '1!G;h;$!d' a.txt :逆向显示文件内容
sed '$!N;$!D' a.txt: 取文件后两行;不是最后一行就追加,不是最后一行就删除模式空间
sed '$!d' a.txt: 取文件最后一行
sed 'G' a.txt:每行后加入一个空白行
sed 'g' a.txt:全部替换为空白行
sed '/^$/d;G' a.txt:空白行删除后再加空白行,每个行后面加一个空白行
sed 'n;d' a.txt: 显示奇数行
sed -n '1!G;h;$p' a.txt:逆序显示文件内容;
sed -i -n '1!G;h;$p' a.txt:逆序显示文件内容,并修改原文件;
GUN awk:
gawk - pattern scanning and processing language 文档报告生成工具:
基本用法:
gawk [options] 'program' file ...
progarm: pattern{action statements}
statements语句之间用分号分隔
print,printf
选项:
-F:指明输入时用到的字段分隔符;
-v var=value:自定义变量
cat /etc/fstab
tail -5 /etc/fstab |awk '{print $2,$4}'
输出命令:
1,pring item1,item2,...
注意:
1,逗号做分隔符;
2,输出的item可用是字符串,也可以是数值;也可是当前记录的字段,变量,awk的表达式;
tail -5 /etc/fstab |awk'{print “hello", $2,$4,6}'
tail -5 /etc/fstab |awk'{print “hello:", $1}'
3,省略item,相当执行print$0;
tail -5 /etc/fstab|awk '{print }'
2,变量:
1,内置变量:
FS:input field seperator:输入分隔字段分隔符,默认空白
OFS: output field seperator,输出分隔字段分隔符,默认空白字符
awk '{print $1}' /etc/passwd:显示所有内容,因为开始没有空白字符
awk -v FS=':' '{print $1}' /etc/passwd 相当于: awk -F: '{print $1}' /etc/passwd
awk -v FS=':' -v OFS=':''{print $1,$3,$7}' /etc/passwd :指定输出输入分隔符
RS:input record seperator,输入是的换行符号
ORS:output record seperator,输出的换行符;
awk -v RS=' ' -v ORS='#''{print}' /etc/passwd
NF:number of field:每行的字段数量
awk '{print NF}' /etc/fstab:统计每行有多少个字段;
awk '{print $NF}' /etc/fstab :打印每行的最后一个字段;
NR:number of record:行数:
awk '{print NR}' /etc/fstab :打印每行的行号。和行数
FNR:各文件分别计数行数;
awk '{print FNR}' /etc/fstab /etc/issue:每个文件单独计数,
awk '{print $NF}' /etc/fstab :打印每行的最后一个字段;
FILENAME:当前正在处理的文件名:
awk '{printFILENAME}' /etc/fstab :每行都显示一次文件路径和文件名
awk END'{printFILENAME}' /etc/fstab :只显示最后一次的路径和文件名
ARGC:命令行参数的个数
awk '{printARGC}' /etc/fstab/ /etc/issue
awk BEGIN'{printARGC}' /etc/fstab/ /etc/issue
ARGV: 数组,保存命令行中给定的各参数;
awk BEGIN'{printARGV[0]}' /etc/fstab/ /etc/issue
awk BEGIN'{print ARGV[1]}' /etc/fstab/ /etc/issue
2,自定义变量:
1, -v var=value
变量名区分字符大小写;
2,在program中直接定义
awk -v test='hello gawk' '{print test}' /etc/fstab :打印出/etc/fstab文件行数那么多的hello gawk
awk -v test='hello gawk' BEGIN'{print test}':只打印一次hellogawk
awk BEGIN'{test="hellogawk" ;print test}'
3,printf命令:
格式化输出:printfFORMAT, item1,item2,...
1,FORMAT是必须要给出
2,不会自动换行,需要显示给出换行控制符: \n
3,FORMAT中需要分别为后面的每个item指定一个格式化符号;
格式符:
%c:显示字符的ascii码
%d,%i:显示十进制整数;
%e,%E:显示科学计数法数值显示
%f:显示浮点数
%g,%G:科学计数或浮点数显示数值;
%s:字符串
%u:无符号整数;
%%:显示%号自己;
awk -F: '{printf"%s\n",$1}' /etc/passwd
awk -F: '{printf"username: %s, UID: %d\n",$1,$3}' /etc/passwd
修饰符:
#[.#]:第一个数字控制显示的宽度,第二个字符表示小数点后面的精度:默认右边对齐
%3.1f :三个字符宽度,一个小数点
awk -F: '{printf"username: %15s, UID: %3.1f\n",$1,$3}' /etc/passwd
-:表示左对齐
awk -F: '{printf"username: %-15s, UID: %d\n",$1,$3}' /etc/passwd
+:显示数值的符号:
4,操作符
算术运算操作符:+ - * / ^次方, %取模
-x:整数转负数
+x:字符串转为数值
字符串操作符:
没有符号的操作符,字符串链接;
赋值操作符: = +=-= *= /= %= ……=
++ , --
比较操作符:
> >=<= != ==
模式匹配符:
~ :匹配,左侧的字符串是否能被右边的模式所匹配
!~:是否不匹配:左侧的字符串是否不能被右边的模式所匹配
逻辑操作符:&&, ||, !
条件表达式:
selector:挑选器,
awk -F:'{$3>=500?usertype="common user":usertype="sysadmin orsysuser";pringf"%15s:%-s\n",$1,usertype}' /etc/passwd
5,PATTERN
类似地址定界符
1, empty:空模式:处理文本的每一行,匹配任意行;
2,/regulaarexpression/:能被表达式匹配到的行才被处理;
awk '/^UUID/{print $1}' /etc/fstab
awk '!/^UUID/{print $1}' /etc/fstab
3,relationalexpression:关系表达式:结果有真有假,结果为真的才被处理,
真:结果为非0值,非空字符串: awk-F: '$3>=1000{pring $1,$3}' /etc/passwd
找/bash的用户: awk -F: '$NF=="/bin/bash"{print$1,$NF} ' /etc/passwd
awk-F: '$NF~/bash$/ {print $1,$NF} ' /etc/passwd :显示bash结尾的:
4,line ranges:行范围地址定界:startline,endline:指定起始行号:
awk -F:'(NR>=10&&NR<=20){print $1}' /etc/passwd
注意:不支持直接给出数字范围的格式
/pat1/,/pat2/:从模式1到模式2直接匹配到的行,
如: awk -F:'/^r/,/^u/{print $1}' /etc/passwd
5,BEGIN/END模式:
BEGIN{}:表示仅在开始处理文件中的文本之前执行一次的程序;
END{};仅在文本处理完成之后命令结束之前处理执行一次;
awk -F: 'BEGIN{print " username uid \n------"}{print $1,$3}END{print"=====\n end "}'/etc/passwd
6,控制语句:
1 if-else
语法: if(condition) statement [else statement]
awk -F: '{if($3>=1000) {printf "commonuser : %s\n",$1}
else { printf “roo or sysuser:%s\n",$1}}' /etc/passwd
2 while循环:
语法:while(condition) statement
awk'/^[[:space:]]*linux16/{i=1;while(i<=NF) {printf $i,length($i);i++}}'/etc/grub2.cfg
3 do-while循环
语法: do statement while(condition)
4 for循环
语法: for(expr1;expr2;expr3) statement
awk'/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}'/etc/grub2.cfg
5 next:提前结束对本行的处理,直接进入下一行
awk -F: '{if($3%2!=0)next; print $1,$3}' /etc/passwd
7 array数组
awk'BEGIN{weekdays["mon"]="monday";weekdays["tue"]="tuesday";for (i in weekdays) {print weekdays[i]}}'
8,函数
9.1 内置函数
数值处理:
rand():返回0和1之间的随机数:
awk 'BEGIN{print rand()}'
字符串处理:
length([s]):返回指定字符串的长度;
sub(r,s,[t]):表示以r所表示的模式来查找t所表示的字符串中的匹配的内容,
并将其第一次出来替换为s所表示的内容;
awk -F: '{sub(o,O,$1)}' /etc/passwd
4、写一个脚本,生成10个随机数,并按从小到大进行排序(要求至少使用2中方法)
方法一:
方法二:
5、在每周二的凌晨1点5分执行脚本/data/get_username.sh,并将脚本的输出至/tmp/get_username.log日志文件中;
crontab –e
5 1* * 2 /data/get_username.sh >> /tmp/get_username.log
6、写一个脚本:如果某路径不存在,则将其创建为目录;否则显示其存在,并显示内容类型;
7、写一个脚本,打印9X9乘法表;
8、描述dns的工作流程,以及完整搭建一套dns主从服务器,相关域名和ip可自行设定。
DNS http://lisoy79.blog.51cto.com/10836537/1735611