sed:编辑器
sed:Stream EDitor,行编辑器
用法:
sed [option]... 'script' inputfile...
script:
'地址命令'
常用选项:
-n:不输出模式中的内容至屏幕
-e:多点编辑
-f /path/to/script_file:从指定文件中读取编辑脚本
-r:支持使用扩展正则表达式
-i:原处编辑
地址定界:
1.不给地址:对全文进行处理
2.单地址:
#: 指定的行
/pattern/:被此处模式所能匹配到的每一行
3.地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
4.~:步进
1~2,1开始,步长2
2~2,2开始,步长2
编辑命令:
d:删除
p:显示模式空间中的内容
a \text:在行后面追加文本;支持使用\n实现多行追加
i \text:在行前面追加文本
c \text:替换行为单行或多行文本
w /path/to/somefile:保存模式空间中匹配到的行至指定文件中
r /path/form/somefile:读取指定文件的文本流至模式空间中匹配到的行的行后
=: 为模式空间中的行打印行号
!:取反条件
s///:支持使用其他分隔符,s@@@,s###
替换标记:
g:行内全局替换
p:显示替换成功的行
w /path/to/somefile:替换成功的结果保存至文件中
练习:
删除/boot/grub/grub.conf文件中所有以空白开头的行的行首的空白字符
sed 's@^[[:space:]]\+@@' /etc/grub2.cfg
删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
sed 's/^#[[:space:]]\+//' /etc/fstab 
echo一个绝对路径给sed命令,取出其基名,取出其目录名
echo "/etc/sysconfig/" | sed 's@[^/]\+/\?$@@'
高级编辑命令:
h:把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g:从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x:把模式空间中的内容与保持空间中的内容进行互换
n:读取匹配到的行的下一行至模式空间
N:追加匹配到的行的下一行至模式空间
d:删除模式空间中的行
D:删除多行模式空间中的所有行
sed -n 'n;p' FILE
sed '1!G;h;$!d' FILE :逆向显示文件内容
sed '$!N;$!D' FILE:取出文件后两行
sed '$!d' FILE:取出文件最后一行
sed 'G' FILE:每行后添加空白行
sed '/^$/d;G' FILE:每行后添加空白行,多个空白行时合并为一个空白行
sed 'n;d' FILE:显示奇数行
sed -n '1!G;h;$p' FILE:逆向显示文件的每一行内容
base脚本编程:
while CONDITION;do
循环体
done
进入条件:CONDATION为true
退出条件:false
until CONDITION;do
循环体
done
进入条件:false
退出条件:true
示例:求100以内所有正整数之和
#!/bin/bash
#
declare -i i=1
declare -i sum=0
until [ $i -gt 100 ];do
let sum+=$i
let i++
done
echo $sum
示例:打印99乘法表
#!/bin/bash
declare -i j=1
declare -i i=1
until [ $j -gt 9 ];do
until [ $i -gt $j ];do
echo -n -e "${i}*${j}=$[$i*$j]\t"
let i++
done
echo
let i=1
let j++
done
循环控制语句(用于循环体中):
continue [N]:提前结束第N层循环
while CONDITION1:do
CMD1
...
if CONDITION2;then
continue
fi
CMDn
...
done
break [N]:提前结束循环
while CONDITION1:do
CMD1
...
if CONDITION2;then
break
fi
CMDn
...
done
示例1:求100以内所有偶数之和;要求循环遍历100以内的所有正整数
#!/bin/bash
declare -i i=0
declare -i sum=0
until [ $i -gt 100 ];do
let i++
if [ $[$i%s] -eq 1 ];then
continue
fi
let sum+=$i
done
echo $sum
创建死循环:
while true;do
until false;do
示例2:每隔3秒钟到系统上获取已经登录的用户的信息,如果docker用户登录了,则记录于日志中,并退出
while循环的特殊用法(遍历文件的每一行):
while read line;do
循环体
done < /path/from/somefile
依次读取文件中的每一行,且将行赋值给line
示例:找出ID号为偶数的所有用户,显示其用户名及ID
for循环的特殊格式:
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式));do
循环体
done
控制变量初始化:仅在运行到循环代码段时执行一次
控制变量的修正表达式:每轮循环结束,会先进行控制变量修正运算,而后再做条件判断
示例:求100以内所有正整数之和
条件判断:case语句
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
练习:写一个脚本,完成如下要求
1.脚本可接受参数:start,stop,restart,status
2.如果参数非此四个之一,提示使用格式后报错退出;
3.如果是start,则创建/var/lock/subsys/SCRIPT_NAME;并显示启动成功
考虑:如果事先已经启动过一次,该如何处理
4.如果是stop,则删除/var/lock/subsys/SCRIPT_NAME,并显示停止完成
考虑:如果事先已经停止过了,该如何处理
5.如果是restart,则先stop,再start
考虑:如果本来没有start,如何处理
6.如果是status
如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示"SCRIPT_NAME is running..."
如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示"SCRIPT_NAME is stopped..."
其中:SCRIPT_NAME为当前脚本名
#!/bin/bash
#
# chkconfig: - 88 12
# description: test 
prog=$(basename $0)
lockfile=/var/lock/subsys/$prog
start(){
if [ -f $lockfile ];then
echo "$prog is aleady running."
return 0
else
touch $lockfile
[ $? -eq 0 ] && echo "Starting $prog finished."
fi
}
stop(){
if [ -f $lockfile ];then
rm -f $lockfile && echo "Stop $prog finished."
else
echo "$prog is stopped ."
fi
}
status(){
if [ -e $lockfile ];then
echo "$prog is running."
else
echo "$prog is stopped."
fi
}
usage(){
echo "usage:$prog [start|stop|restart|status]"
}
if [ $# -lt 1 ];then
usage
exit 1
fi
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
usage
exit $?
esac
bash脚本编程:
case支持glob风格的通配符:
*:任意长度任意字符
?:任意单个字符
[]:指定范围内的任意单个字符
a|b:a或b
function:函数
过程式编程:代码重用
模块化编程
结构化编程
语法1:
function f_name {
...函数体
}
语法2:
f_name() {
}
调用:函数只有被调用才会执行
调用:给定函数名
函数名出现的地方,会被自动替换为函数代码
函数的生命周期:被调用时创建,返回时终止
return命令返回自定义状态结果
0:成功
1-255:失败
#!/bin/bash
function adduser {
if id $username &> /dev/null;then
echo "$username exists."
else
useradd $username
[ $? -eq 0 ] && echo "Add $username finished/"
fi
}
adduser
for i in {1..10};do
username=myuser$i
adduser
done
函数返回值:
函数的执行结果返回值:
1.使用echo或print命令进行输出
2.函数体中调用命令的执行结果
函数的退出状态码
1.默认取决于函数体中执行的最后一条命令的退出状态码
2.自定义退出状态码
return
函数可以接受参数:
传递参数给函数:调用函数式,在函数名后面以空白分割给定参数列表即可:例如testfunc arg1 arg2 ...
在函数体中,可使用$1,$2...调用这些参数;还可以使用$@,$#等特殊变量
练习:打印NN乘法表,使用函数实现
变量作用域:
本地变量:当前shell进程;为了执行脚本会启动专用的shell进程;因此,本地变量的作用范围是当前shell脚本程序文件
局部变量:函数的声明周期;函数结束时变量被销毁
如果函数有局部变量,其名称同本地变量
在函数中定义局部变量的方法:
local NAME=VALUE
函数递归:
函数直接或间接调用自身:
N!=N(n-1)(n-2)...1
#!/bin/bash
#
fact() {
if [ $1 -eq 0 -o $1 -eq 1];then
echo 1
else
echo $[$1*$(fact $[$1-1])]
fi
}
fact $1
练习:求N阶斐波那契数列
Systemd:
POST --> Boot Sequence --> Bootloader --> kernel + initramfs(initrd) --> rootfs --> /sbin/init
init:
CentOS 5:SysV init
CentOS 6:Upstart
CentOS 7:Systemd
Systemd新特性:
系统引导时实现服务并行启动
按需激活进程
系统状态快照
基于依赖关系定义服务控制逻辑
核心概念:unit
配置文件进行标识和配置:文件中主要包含了系统服务,监听socket,保存的系统快照以及其他与init相关的信息
保存至:
/usr/lib/systemd/system
/run/systemd/system
/etc/systemd/system
unit的类型:
service unit:文件扩展名为.service,用于定义系统服务
target unit:文件扩展名为.target,用于模拟实现运行级别
device unit:.device,用于定义内核识别的设备
mount unit:.mount,定义文件系统挂载点
socket unit:.socket,用于标识进程间通信用的socket文件
snapshot unit:.snapshot,管理系统快照
swap unit:.swap,用于标识swap设备
automount unit:.automount,文件系统的自动挂载点
path unit:.path,用于定义文件系统中的一个文件或目录
关键特性:
基于socket的激活机制:socket与服务程序分离
基于bus的激活机制:
基于device的激活机制:
基于path的激活机制:
系统快照:保存各unit的当前状态信息与持久存储设备中
向后兼容 sysv init脚本:
不兼容:
systemctl命令固定不变
非由systemd启动的服务,systemctl无法与之通信
管理系统服务:
CentOS 7:service unit
注意:能兼容早期的服务脚本
命令:systemctl COMMAND name.service
启动:service name start ==> systemctl start name.service
停止:service name stop  ==> systemctl stop name.service
重启:service name restart ==> systemctl restart name.service
状态:service name status ==> systemctl status name.service
条件式重启:service name condrestart ==> systemctl try-restart name.service
重载或重启服务:systemctl reload-or-restart name.service
重载或条件式重启服务:systemctl reload-or-try-restart name.service
禁止设定为开机自启:systemctl mask name.service
取消禁止设定为开机自启:systemctl unmask name.service
查看某服务当前激活与否: systemctl is-active name.service
查看所有已经激活的服务:
systemctl list-units --type service
查看所有服务:
systemctl list-units --type service --all
chkconfig命令的对应关系:
设定某服务开机自启动:chkconfig name on ==> systemctl enable name.service
禁止:chkconfig name off ==> systemctl disable name.service
查看所有服务的开机自启状态:
chkconfig --list ==> systemctl list-unit-files --type service 
查看服务是否开机自启:systemctl is-enable name.service
其他命令:
查看服务依赖关系:
systemctl list-dependencies name.service
target units:
unit配置文件:.target
运行级别:
0 ==> runlevel0.target,poweroff.target
1 ==> runlevel1.target,rescue.target
2 ==> runlevel2.target,multi-user.target
3 ==> runlevel3.target,multi-user.target
4 ==> runlevel4.target,multi-user.target
5 ==> runlevel5.target,graphical.target
6 ==> runlevel6.target,reboot.target
切换级别:
init N ==> systemctl isolate name.target
查看级别:
runlevel ==> systemctl list-units --type target
获取默认运行级别:
/etc/inittab ==> systemctl get-default
修改默认级别:
/etc/inittab ==> systemctl set-default name.target
切换至紧急救援模式:
systemctl rescue
切换至emergency模式
systemctl emergency
其他常用命令:
关机:systemctl halt,systemctl poweroff
重启:systemctl reboot
挂起:systemctl suspend
快照:systemctl hibernate
快照并挂起:systemctl hybrid-sleep
bash脚本编程:
变量:存储单个元素的内存空间
数组:存储多个元素的连续的内存空间
数组名:
索引:编号从0开始,属于数值索引
注意:索引页可以支持使用自定义的格式,而不仅仅是数值格式
bash的数组支持稀疏格式
引用数组中的元素:${ARRAY_NAME[INDEX]}
声明数组:
declare -a ARRAY_NAME
declare -A ARRAY_NAME:关联数组
数组元素的赋值:
1.一次只赋值一个元素
ARRAY_NAME[INDEX]=VALUE
weekdays[0]="sunday"
weekdays[4]="Thursday"
2.一次赋值全部元素:
ARRAY_NAME=("val1" "val2" ...)
3.只赋值特定元素:
ARRAY_NAME=([0]="VAL1" [3]="VAL2" ...)
4.read -a ARRAY
引用数组元素:${ARRAY_NAME[INDEX]}
注意:省略[INDEX]表示引用下标为0的元素
数组的长度(元素个数):${#ARRAY_NAME[*]},${#ARRAY_NAME[@]}
示例:生成10个随机数保存于数组中,并找出其最大值和最小值
#!/bin/bash
#
declare -a rand
declare -i max=0
for i in {1..9};do
rand[$i]=$RANDOM
[ ${rand[$i]} -gt $max ] && max=${rand[$i]}
done
echo $max
练习:写一个脚本
定义一个数组,数组中的元素是/var/log目录下所有以.log结尾的文件,要统计其下标为偶数的文件中的行数之和
#!/bin/bash
#
declare -a files
declare -i lines=0
files=(/var/log/*.log)
for i in $(seq 0 $[${#files[@]}-1]);do
if [ $[$i%2] -eq 0 ];then
let lines+=$(wc -l ${files[$i]} | cut -d' ' -f1)
fi
done
echo $lines
引用数组中的元素:
所有元素:${ARRAY[@]},${ARRAY[*]}
数组切片:${ARRAY[@]:offset:number}
offset:要跳过的元素个数
number:要取出的元素个数
向数组中追加元素:
ARRAY[${#ARRAY[*]}]
删除数组中的某元素:
unset ARRAY[INDEX]
关联数组:
declare -A ARRAY_NAME
ARRAY_NAME=([index_name]='val1' [index_name2]='val2' ...)
练习:生成10个随机数,升序或降序排序
bash的字符串处理工具:
字符串切片:${var:offset:number}
取字符串的最右侧几个字符:${var: -length}
注意:冒号后必须有一个空白字符
基于模式取子串:
${var#*word}:其中word可以是指定的任意字符串;功能:自左而右,查找var变量所存储的字符串中,第一次出现的word,删除字符串开头至第一次出现word字符之间的所有字符
${var##*word}:同上,不过删除的是字符串开头至最后一次由word指定的字符串之间的所有内容
file="/var/log/messages"
${file##*/}:messages
${var%word*}:其中word可以是指定的任意字符;功能:自右而左,查找var变量所存储的字符串中,第一次出现的word,删除字符串最后一个字符向左至第一次出现word字符之间的所有字符;
file="/var/log/messages"
${file%/*}:/var/log
${var%%word*}:同上,删除字符串最右侧的字符向左至最后一次出现word字符之间的所有字符
示例:url=http://www.magedu.com:80
${url##*:}
${url%%:*}
查找替换:
${var/pattern/substi}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,将其替换为substi
${var//pattern/substi}:查找var所表示的字符串中,所有被pattern所匹配到的字符串,将其替换为substi
${var/#pattern/substi}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,将其替换为substi
${var/%pattern/substi}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,将其替换为substi
查找并删除:
${var/pattern}:查找var所表示的字符串中,第一次被pattern所匹配到的字符串,将其删除
${var//pattern}:查找var所表示的字符串中,所有被pattern所匹配到的字符串,将其删除
${var/#pattern}:查找var所表示的字符串中,行首被pattern所匹配到的字符串,将其删除
${var/%pattern}:查找var所表示的字符串中,行尾被pattern所匹配到的字符串,将其删除
字符大小写转换:
$(var^^):var中所有小写转换为大写
$(var,,):var中所有大写转换为小写
变量赋值:
${var:-value}:如果var为空或未设置,那么返回value;否则,返回var的值
${var:=value}:如果var为空或未设置,则返回value并将value赋值给var;否则,返回var的值
${var:+value}:如果var不为空,则返回value
${var:?error_info}:如果var为空或未设置,那么返回error_info;否则,返回var的值
为脚本程序使用配置文件:
定义文本文件,每行定义"name=value"
在脚本中source此文件即可
命令:
mktemp命令:
mktemp [OPTION]... [TEMPLATE]
TEMPLATE:filename.XXX
XXX至少要出现3个
OPTION:
-d:创建临时目录
--tmpdir=/path/to/somedir:指明临时文件位置
install命令:
install [option]… [-T] source dest
install [option]… source… directory
install [option]… -t directory source…
install [option]… -d directory…
选项:
-m MODE
-o OWNER
-g GROUP
练习:写一个脚本
1.提示用户输入一个可执行命令名称
2.获取此命令所依赖到的所有库文件列表
3.复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下
/bin/bash ==> /mnt/sysroot/bin/bash
/usr/bin/passwd ==> /mnt/sysroot/usr/bin/passwd
4.复制此命令依赖到的所有库文件至目标目录下的对应路径下
/lib64/ld-linux-x86-64.so.2 ==> /mnt/sysroot/lib64/ld-linux-x86-64.so.2
进一步的:
每次复制完一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完成上述功能,直到用户输入quit退出
回顾:bash脚本编程数组
数组,字符串处理
数组:
数组:declare -a
index:0-
关联数组:declare -A
字符串处理:
切片,查找替换,查找删除,变量赋值
GNU awk:
文本处理:grep,sed,awk
grep,egrep,fgrep:文本过滤工具;pattern
sed:行编辑器
模式空间,保持空间
awk:报告生成器,格式化文本输出;
AWK:Aho,Weinberger,Kernighan --> New AWK,NAWK
GNU awk,gawk
gawk - pattern scanning and processing language
基本用法:gawk [options] 'program' FILE ...
program:PATTERN{ACTION STATEMENT}
语句之间用分号分割
print,printf
选项:
-F:指明输入时用的字段分隔符
-v var=value:自定义变量
1.print
print item1,item2,...
要点:
1.逗号分隔符
2.输出的各item可以字符串,也可以是数值;当前记录的字段,变量或awk表达式
3.如果省略item,相当于print $0
2.变量
内建变量
FS:input field seperator;默认为空白字符
OFS:output field seperator;默认为空白字符
RS:input record seperator;输入时的换行符
ORS:output record seperator;输出时的换行符
NF:number of field,字段数量
{print NF},{print $NF}
NR:number of record,行数
FNR:各文件分别计数
FILENAME:当前文件名
ARGC:命令行中给定的参数个数
ARGV:数组,保存的是命令行所给定的各参数
自定义变量
1.-v var=value
变量名区分字符大小写
awk -v test='hello gawk' 'BEGIN{print test}'
2.在program中直接定义
awk  '{test="hello";print test}'
3.printf命令
格式化输出:printf FORMAT,item1,item2,...
1.FORMAT必须给出
2.不会自动换行,需要显示给出换行控制符,\n
3.FORMAT中需要分别为后面的每个item指定一个格式化符号
格式符:
%c:显示字符ASCII码
%d,%i:显示十进制整数
%e,%E:科学计数法数值显示
%f:浮点数
%g,%G:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%:显示%自身
修饰符:
#[.#]:第一个数字控制显示的宽度,第二个字符表示小数点后的精度,右对齐
awk -F: '{printf "username:%15s,UID:%15d\n",$1,$3}' /etc/passwd
%3.1f:
-#[.#]:左对齐
+:显示数值的符号
4.操作符:
算数操作符:
x+y,x-y,x*y,x/y,x^y,x%y
-x
+x:转换为数值
字符串操作符:没有符号的操作符,字符串连接
=,+=,-=,*=,/=,%=,^=
++,--
比较操作符:
>,>=,<,<=,!=,==
模式匹配符:
~:是否匹配
awk -F: '$NF~/bash$/{print $1,$NF}' /etc/passwd
!~:是否不匹配
逻辑操作符:
&&
||
!
函数调用:
function_name(arg1,arg2,...)
条件表达式:
selector?if-true-expression:if-false-expression
awk -F: '{$3==0?usertype="comm":usertype="sys";printf "%15s:%s\n",$1,usertype}' /etc/passwd
5.PATTERN
1.empty:控模式,匹配每一行
2./regular expression/:
awk '/^UUID/{print $1}' /etc/fstab
3.relational expression:关系表达式;结果有真有假;结果为真会被处理
真:结果为非0值,非空字符串
awk -F: '$3>=300{print $1}' /etc/passwd
4.line ranges:行范围
startline,endline:/pat1/,/pat2/
awk -F: '/^root/,/^mail/{print $1}' /etc/passwd
awk -F: '(NR>=10&&NR<=20){print $1}' /etc/passwd
注意:不支持直接给出数字的格式
5.BEGIN/END模式
BEGIN{}:仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次
awk -F: 'BEGIN{print "\tusername\tuid"}{printf "%s\t%s\n",$1,$3}END{print "END"}' /etc/passwd
6.常用的action
1.Expressions
2.Control statements:if while等
3.compound statements:组合语句
4.input statements
5.output statements
7.控制语句
if(condition){statments}
if(condition){statments} else {statments}
while(condition){statments}
do{statments}while(condition)
for(exp1;exp2;exp3){statments}
break
continue
delete array[index]
delete array
exit
{ statments }
1.if-else
语法:if(condition) statment [else statment]
awk -F: '{if($3>=300){print $1,$3}else{print $1,$NF}}' /etc/passwd
df -h | awk -F[%] '/^\/dev/{print $1}'|awk '{if($NF>=10)print $1}'
使用场景:对awk取得的整行或某个字段做条件判断
2.while循环
语法:while(condition) statment
条件真,进入循环;条件假,退出循环
使用场景:对一行内的多个字段逐一类似处理时使用;对数组中的各元素逐一处理时使用
length()
awk '/^[[:space:]]*root/{i=1;while(i<=NF){print $i,length($i);i++}}' /etc/grub.conf
3.do-while循环
语法:do statement while(condition)
意义:至少执行一次循环体
4.for循环
语法for(expr1;expr2;expr3) statment
for(variable assignment;condition;iteration process){for-body}
awk '/^[[:space:]]*root/{for(i=1;i<=NF;i++){print $i,length($i)}}' /etc/grub.conf 
特殊用法:
能遍历数组中的元素:
语法:for (var in array){for-body}
5.switch语句:
语法:switch(expression){case VALUE1 or /REGEXP/:statement;case VALUE2 or /REGEXP2/:statement;...;default:statement}
6.break和continue
break [n]
continue
7.next
提前结束对本行的处理而直接进入下一行(python里的pass)
awk -F: '{if($3/2!=0)next;print $1,$3}' /etc/passwd
8.array
关联数组:array[index-expression]
index-expression
1.可以使用任意字符串
2.如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为空串
要判断数组中是否存在某元素,要使用"index in array"格式进行;
weekdays["mon"]="Monday"
awk 'BEGIN{weekdays["mon"]="Monday";print weekdays["mon"]}'
要遍历数组中的每一个元素,要使用for循环
for (var in array){for-body}
注意:var会遍历array的每个索引
awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}' /var/log/httpd/access_log
练习:
1.统计/etc/fstab文件中,每个文件系统类型出现的次数
awk '/^UUID/{fs[$3]++}END{for(i in fs){print i,fs[$i]}}' /etc/fstab
2.统计指定文件每个单词出现的次数
awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count){print i,count[i]}}' /etc/fstab
9.函数
1.内置函数
数值处理:
rand():返回0和1之间一个随机数
字符串处理:
length([s]):返回指定字符串的长度
sub(r,s,[t]):以r所表示的模式来查找t所表示的字符串中的匹配的内容,并将其第一次出现替换为s所表示的内容
gsub(r,s,[t]):以r所表示的模式来查找t所表示的字符串中的匹配的内容,并将其所有出现均替换为s所表示的内容
split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中
netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count){print i,count[i]}}'
2.自定义函数

马哥Linux SysAdmin学习笔记(四)的更多相关文章

  1. 马哥Linux SysAdmin学习笔记(三)

    CentOS 5和6的启动流程: Linux:kernel+rootfs kernel:进程管理,内存管理,网络管理,驱动程序,文件系统,安全功能 rootfs: glibc 库:函数集合,funct ...

  2. 马哥Linux SysAdmin学习笔记(二)

    Linux网络属性管理: 局域网:以太网,令牌环网 Ethernet:CSMA/CD 冲突域 广播域 MAC:media access control地址 48bit: 24bits 24bits  ...

  3. 马哥Linux SysAdmin学习笔记(一)

    Linux入门 Linux系统管理: 磁盘管理,文件系统管理 RAID基础原理,LVM2 网络管理:TCP/IP协议,Linux网络属性配置 程序包管理:rpm,yum 进程管理:htop,glanc ...

  4. 马哥Linux base学习笔记

     介绍课程: 中级: 初级:系统基础 中级:系统管理.服务安全及服务管理.shell脚本 高级: MySQL数据库: Cache & storgae 集群: Cluster   lb: 4la ...

  5. linux初级学习笔记四:Linux文件管理类命令详解!(视频序号:03_1)

    本节学习的命令:cat(tac),more,less,head,tail,cut,sort,uniq,wc,tr 本节学习的技能:目录管理 文件管理 日期时间 查看文本 分屏显示 文本处理 文件管理命 ...

  6. Linux学习笔记(四) vi编辑器

    一.vi 编辑器 vi 编辑器 (Visual Interface) 是所有 Unix 及 Linux 系统下标准的编辑器,相当于 Windows 系统中的记事本 它有三种模式,分别是: Comman ...

  7. Linux命令学习笔记目录

    Linux命令学习笔记目录 最近正在使用,linux,顺便将用到的命令整理了一下. 一. 文件目录操作命令: 0.linux命令学习笔记(0):man 命令 1.linux命令学习笔记(1):ls命令 ...

  8. 马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)

    马哥linux运维初级+中级+高级 视频教程 教学视频 全套下载(近50G)目录详情:18_02_ssl协议.openssl及创建私有CA18_03_OpenSSH服务及其相关应用09_01_磁盘及文 ...

  9. Linux系统学习笔记:文件I/O

    Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...

随机推荐

  1. [Fundamental of Power Electronics]-PART II-8. 变换器传递函数-8.4 变换器传递函数的图形化构建

    8.4 变换器传递函数的图形化构建 第7章推导出的buck变换器小信号等效电路模型在图8.55中再次给出.让我们用上一节的图解方法来构造该变换器的传递函数和端阻抗. Fig. 8.55 Small-s ...

  2. 阿里妈妈Java后端 社招5面(Offer已拿)

    最近由于个人原因, 由于前面两面的时间过去的有点久了,只能根据记忆大概写些记得问题.   阿里妈妈1面 40mins(2021-02-22) 1. 能简单介绍下自己和自己做的项目吗? 2. 关于项目的 ...

  3. Dynamics CRM字段安全配置文件

    在实施Dynamics CRM的过程中,有些需求会提到部分字段针对特殊的人员或者团队进行显示.更新以及创建的需求的控制.这里我们就需要用到字段安全性文件这个功能.此功能针对具体实体的字段进行配置可以达 ...

  4. Spring Security OAuth 格式化 token 输出

    个性化token 背景 上一篇文章<Spring Security OAuth 个性化token(一)>有提到,oauth2.0 接口默认返回的报文格式如下: {     "ac ...

  5. 一.文件处理和json模块(容易混淆知识点即用法)

    一.文件处理 注意点1: 打开文件包含两部分资源:操作系统级打开得文件+应用程序的变量. 在操作完毕一个文件时,必须把该文件的两部分资源一个不落的回收 如下: f.close() #回收操作系统级打开 ...

  6. JAVAEE_Servlet_13_HttpServlet

    HttpServlet 因为每次执行前端请求,都需要获取前端的请求方式,都需判断前端的请求方式和后端是否一致,随意这段代码就可以封装起来. 写一个HttpServlet类去继承GenericServl ...

  7. DPAPI机制学习

    0x00 前言 ​绝大多数应用程序都有数据加密保护的需求,存储和保护私密信息最安全的方式就是每次需要加密或解密时都从用户那里得到密码,使用后再丢弃.这种方式每次处理信息时都需要用户输入口令,对于绝大多 ...

  8. C++介绍和class的介绍

    课程介绍 程序设计II是程序设计I的延续,继续提高编程能力,并能掌握面向对象(Object Oriented Programming)的程序设计方法.所谓面向对象,指的是将具体的流程变得模块化.这可以 ...

  9. 03- HTML基本结构

    初始HTML HTML(英文Hyper Text Markup Language的缩写)中文译为"超文本标签语言",主要是通过HTML标签对网页中的文本.图片.声音等内容进行描述. ...

  10. 关于Spring Boot 多数据源的事务管理

    自己的一些理解:自从用了Spring Boot 以来,这近乎零配置和"约定大于配置"的设计范式用着确实爽,其实对零配置的理解是:应该说可以是零配置可以跑一个简单的项目,因为Spri ...