首页 > 技术文章 > shell入门总结

andreking 2015-10-01 22:07 原文

shell入门总结
*shell特性
shell是一个程序,他可以起到保护内核的作用,我们可以通过他和内核交互。
用户使用过的命令保存在家目录下的.bash_history文件中,与命令历史有关的!的用法:
!!:表示执行上一个命令
!n:n是数字,表示执行命令历史中第n个命令
!ps:ps是字符串,表示执行命令历史中最近一次以ps开头的命令

*shell变量
shell变量有系统变量和自定义变量,系统变量是系统自身定义的,一般是不允许更改的;自定义变量使用户,为了更好的管理而定义的变量。
env和set命令都可以显示变量,但是set还可以显示自定义变量。
自定义变量注意:
(1)变量名必须是字母、下划线和数字组成,数字不能在变量名首部,且不能为关键字。
(2)要想所有用户登录后使用该变量,需要在/etc/profile文件下方添加该变量。
(3)如果只想当前用户使用该变量,则在用户主目录下.bashrc的文件里添加该变量。
(4)定义变量后,需要用export声明下,让该shell的子shell也知道该变量。

*系统和用户的环境变量配置文件
/etc/profile:系统的环境变量在这里定义
/etc/profile.d:用户自定义的系统变量
/etc/bashrc:主要定义PS1和umask
下面四个文件在主目录下:
.bash_profile:定义个人的环境信息和路径
.bashrc:定义个人的shell信息
.bash_history: 记录历史命令信息
.bash_logout:退出shell时,执行该文件,可以把一些清理工作放在这个文件中
.bashrc和.bash_profile区别:.bash_profile调用.bashrc,login shells执行.bash_profile;nologin shells执行.bashrc。

*shell中的特殊符号
“*”代表零个或多个任意字符
“?”只代表一个任意字符
“+”代表一个或多个任意字符
“#”代表注释符号
“\”脱意符号,后面出现的特殊符号还原成普通符号
“|”管道符,将管道前的结果传递给管道符后面的命令,不是所有的命令都可以使用管道符,一般对文档进行统计的命令都可以。
“$”变量的标识符,并且可以和“!”组合使用,“!$”代表上一条命令的参数。
“;”输入多条命令时的分隔符。
“~”用户的家目录。
“&”执行这个可以把任务放在后台执行。
“>,>>,2>,2>>”重定向符号,>和>>代表取代和追加,2>和2>>代表错误信息取代和追加。
“[ ]”代表中间字符任意一个

Linux特殊符号大全:http://www.apelearn.com/bbs/thread-7720-1-1.html


*常用文档查看工具:cut,sort,tee,uniq,tr,split

cut:
-d:后面跟分隔符,用引号括起来
-f:指定第几段
-c:后面只跟数字,表示截取几个字符,可以使一个数字,也可以是n1,n2,表示区间n1-n2;也可以是n1,n2,n3。

sort:
-t:后面跟分隔符
-n:使用纯数字排序
-r:反向排序
-u:去重复
-kn1,n2:由n1到n2区间排序,也可以写成-kn1,既对n1字段排序
如果使用-nu,sort会把文档中的字母看成0

uniq:用来去重
-c:统计重复的行数,并把结果写在结果最前面
使用uniq前,必须要排序,否则不管用

tee:
tee命令类似于重定向,但是比重定向多一个功能,他可以把结果标准输出

tr:常用来替换字符
-d:常用来删除字符,后面接需要删除的字符

split:
-b:依据大小来分割文档,单位byte
-l:依据行来分割
使用split分割,源文件还在

*shell中的链接符号
(1)command1;command2:两个命令都执行
(2)command1&&command2:command1执行成功,才执行command2,否则command2不执行
(3)command||command2:command1执行成功,command2不执行,否则command2执行

*grep过滤
语法选项:grep [-cinvABC] 'word' filename
-c:打印符合要求的行数
-n:在输出符合要求的行的时候把行号也输出
-v:打印不符合要求的行
-A:后跟数字,表示打印符合要求的行以及下面两行
-B:后跟数字,表示打印符合要求的行以及上面两行
-C:后跟数字,表示打印符合要求的行以及上下各两行
-r:会把目录下所有文件遍历
-color:把匹配到的关键字用红色标示
实例:
过滤出带有某个关键字的行并输出行号
#grep -n ‘root’ /etc/passwd
过滤出不带某个关键字的行并输出行号
#grep -n -v ‘root’ /etc/passwd
过滤出所有包含数字的行
#grep ‘[0-9]’ /etc/passwd
过滤出所有不包含数字的行
#grep '[0-9]' /etc/passwd
去除以#开头和空的行
#grep -v '^#' /etc/passwd | grep -v '^$'
过滤出英文字母开头的行
#grep '^[a-zA-Z]' /etc/passwd
注:grep不支持+和?,只有egrep支持。


*sed
sed可以实现grep大部分功能,而且还可以查找替换。
sed ‘10’p -n /etc/passwd :是print的意思,-n是打印出符合规则的行,如果不加-n则会把全部打印出来。
sed -n ‘/ro.t/’p /etc/passwd:可以使用特殊符号
sed '/root/d' /etc/passwd :删除指定行
sed ‘1,2s/ot/to/g’ /etc/passwd:替换,s是替换的意思,g是全局的意思
head -n2 /etc/passwd | sed -r 's/(root)(.*)(bash)/3\2\1/' :在sed中可以用()表示一个整体,本例子中,调换root和bash的位置
后面的\1\2\3,分别表示第一个括号,第二个括号,以及第三个括号。
使用sed命令不会更改源文件,但是加上-i就会更改源文件。

 

*awk
awk很强大,相对的也很灵活复杂。
-F:指定分隔符
OFS:指定输出分隔符
NF:段数
NR:行数
实例:
截取文档的某段
#awk -F ‘:’ ‘{print $1}’ /etc/passwd

推荐阅读