复习(今日无答疑,笔记可以不写)
八、Linux shell基础知识
8.1 shell介绍
每个用户都有自己的shell;
Bourne人名,为了纪念他;
搜索zsh命令,#yum list | grep zsh
搜索ksh命令,#yum list | grep ksh
逻辑判断if,for等等;
8.2 命令历史
输入过的命令,会记录下来,上下键进行查看;
历史命令存在.bash_history里面,最大1000条;
查看变量HISTSIZE条数,#echo $HISTSIZE
查看目前的历史命令内容,#history;
设置记录历史命令和所运行时间,#HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S";
清空内存历史命令,#history -c ;.bash_history不会被清空,上下键也没有了历史命令,
环境变量修改,#vi /etc/profile;修改后生效命令,#source /etc/profile;
只能追加命令,#chattr +a ~/.bash_history;
#!!表示上一条历史命令;
#!n表示执行第n条历史命令;
#!word表示执行以关键词word开头的历史命令;
8.3 命令补全和别名
tab键补全,敲一下补全,敲两下显示以关键字开头的所有命令;
参数补全安装,#yum install -y bash-completion
别名设置,#alias restartnet='systemctl restart network.service'
列出所有别名,#alias
别名存在的目录,家目录/.bashrc 和 /etc/profile.d/
8.4 通配符
*表示通配,前后都可以,不分字符和字符数目;
?表示一个任意的字符;
【0-9】表示范围内,任意一个数字;【0123456789】范围内任意一个数字;
{1,2}表示范围内,任意一个数字,比【】里面数字多了逗号划分开;
8.5 输入输出重定向
输出重定向
>表示执行前面命令得到的内容输出到后面文件,会覆盖;正确
>>表示追加内容;正确
2>表示前面命令执行产生的错误信息输入到文件中;
2>>表示追加执行的错误信息;
&>表示错误和正确的信息都输入进去;
&>>表示追加错误和正确的信息;
command >1.txt 2>a.txt表示正确的写入1.txt,错误的写入a.txt;
输入重定向
wc -l 查看文本文档行数
wc -l < 1.txt表示将后边的1.txt输入到前面命令里面去;
8.6 管道符和作业控制
管道符|,前面命令的结果给到后面命令处理;
fg把任务调到前台;bg丢到后台并运行;
#vmstat 1不停的显示系统的状态
sleep 1000暂停1000秒
8.7/8.8 shell变量
PATH环境变量;
#env获取到系统变量,系统内置;
#set查看系统及用户变量
有特殊符号的要用单引号;
全局变量,其他连接的用户也可以查看到这个变量;其他用户看不到;
#w查看当前主机连接的用户信息;
pstree命令安装,#yum install psmisc
全局变量设置b=2,命令为#export b=2
取消变量,#unset 变量名
8.9 环境变量配置文件
系统层次
/etc/profile
/etc/bashrc
用户层次
~/.bashrc
~/.bash_profile
~/.bash_history历史命令
~/.bash_logout定义用户退出时做的操作
#source ~/.bash_profile,加载使生效;
PS1,定义执行路径;#vi /etc/bashrc配置文件;
扩展
bashrc和bash_profile的区别 http://ask.apelearn.com/question/7719
【故】若要配置环境变量之类,最保险是写在 .bashrc 文件中。因为不管是登陆还是不登陆,该文件总会被调用!
简易审计系统: http://www.68idc.cn/help/server/linux/2014042190951.html
关于PROMPT_COMMAND环境变量的含义 http://www.linuxnote.org/prompt_command-environment-variables.html
8.10 shell特殊符号cut命令
c='$a$b',c就等于$a$b字符,也相当于c=\$a\$b
cut,截取字符串;-d指定分隔符;
8.11 sort_wc_uniq命令
sort排序;
特殊符号排在最前,然后数字,然后字母顺序
-n的话,字母表示为0;
wc -l统计行数,-m统计全部字符数(含隐藏字符);-w word单词;
uniq去重复;#uniq 2.txt;
需要先排序,再去重,命令为#sort 2.txt | uniq -c
以上操作,不会更改文件内容,只是处理显示结果;
8.12 tee_tr_split命令
tee 表示>;
tee -a 表示追加>>;
tr 'a' 'A'将a替换为A;
split切割,大文件切割成小文件,比如日志文件;
-b指定大小切割,默认B字节为单位,100M就以兆为单位;
-l指定行数切割;
切割并指定前缀#split -b 100k a.txt abc
查看切割后的每个文件大小#du -sh x*
删除所有小文件#rm -f x*
8.13 shell特殊符号下
||表示或;&&表示与,命令都执行;
相关测验题目:http://ask.apelearn.com/question/5437
扩展
1. source exec 区别 http://alsww.blog.51cto.com/2001924/1113112
2. Linux特殊符号大全http://ask.apelearn.com/question/7720
3. sort并未按ASCII排序 http://blog.csdn.net/zenghui08/article/details/7938975
九、正则
9.1 正则介绍_grep上
egrep是grep的扩展,具有所有grep功能;
grep是用来过滤关键词的;
-r遍历所有子目录
-v取反,意思是除了关键词所在行,其他行显示出来;
9.2 grep中
'【0-9】'表示从0到9任意一个数字;
'【^0-9】'表示非0到9任意数字;
'^#'表示以#开头的行;
^放到中括号里面'[^关键词]',表示非;
^放到关键词前面‘^关键词’表示以关键词开头;
9.3 grep下
‘r.o’中,字符“.”表示任意一个字符;
‘r*o’中,字符“*”表示任意N个字符;
‘.*’表示所有字符;
\脱意字符;
{}花括号表示前面字符的重复范围;
‘o\{2\}’表示两个o;
grep -E相当于egrep;
grep 'o\{2\}' passwd相当于egrep 'o{2}' passwd或grep -E 'o{2}' passwd;
+表示前面字符的1次或多次出现;
?表示前面字符的0次或1次;'o?t'就表示t或ot;
|表示或者;
()表示一个组合字符串;
扩展
把一个目录下,过滤所有*.php文档中含有eval的行
grep -r --include="*.php" 'eval' /data/
9.4/9.5 sed
sed也能够实现grep功能,没有颜色显示,强项为替换功能;
sed '/关键词/'p 文件名;p为print打印显示;
sed匹配的行,重复一遍显示出来,如果不需要显示其他行,加-n;#sed -n '/root/'p test.txt;
同时,也支持"." "*" "+" "[]" "{}";
直接打印指定的行,#sed -n '2'p test.txt;
‘2,5’表示2到5行;
‘1,$’表示1到最尾行,就是全部行打印出来;
sed不区分大小写,加I,#sed -n '/bus/'Ip test.txt
sed删除过期日志内容,不显示1到100行内容,加d,命令为#sed '1,100'd test.txt,并没有删除内容,真正删除需再加-i,命令为#sed -i '1,100'd test.txt;
d为delete删除;
将1到2行,内ot替换为to,g表示global全局替换,命令为#sed '1,2s/ot/to/g' test.txt;
9.6/9.7 awk
支持分段,passwd文件内容,很有规律,冒号分段;按段匹配;
-F指定分割符,‘{print $1}’表示打印第一段;不会更改文件内容;
‘{print $0}’表示打印所有段;
#awk '{jprint $0}' test.txt也可以打印所有段,相当于cat;
‘{print $1,$3,$4}’表示打印第一,第三,第四段;中间加逗号;
‘{print $1“#”$3“#”$4}’表示打印第一,第三,第四段,中间以#分隔;
查找oo的行并列出来,awk “/oo/”test.txt ;
第一段匹配oo的列出来,awk -F ':' '$1 ~/oo/' test.txt;
包含root或user的指定段列出来,awk -F ':' '/root/ {print $1,$3} /user/ {print $1,$3,$4}' test.txt;
显示包含root或user的行,#grep -E 'root | user' test.txt;#awk -F ':' '/root | user/ {print $0}' test.txt;
‘$3==0’表示第三段等于数字0的;
‘$3=="0"’表示第三段等于ASCII的0,字符0;
<表示小于;&&表示与;||表示或;==表示等于;
~表示匹配;
'{OFS="#"}'表示显示时用#分隔段; 写在print及条件前面;
NR表示行号,NF表示段数;
打印前10行,#awk -F ':' 'NR<=10' test.txt;
扩展
把这里面的所有练习题做一下
http://www.apelearn.com/study_v2/chapter14.html