shell
shell脚本编程:
1)什么叫编程,编程就是编写程序源代码。为了可以让用户在使用计算机的时候,可让计算机以非交互式的方式完成某 些任务,须要将这些任务编制称为一个文件,让计算机顺序读取,从而实现功能;
2)编程语言:
高级语言:
根据源代码的处理方式:
编译运行语言:
源代码 --> 编译器(编译) --> 汇编器(汇编) --> [连接器(库的连接)] -->能够直接执行的二进制文件;
解释运行语言:
源代码 --> 直接启动跟源代码对应的解释器程序,由解释器边解释边执行;
根据其编程过程当中的功能的实现是调用库还调用外部程序文件:
完整编程语言:
利用库或编程组件进行编程;
脚本编程语言:
解释器
shell脚本:调用shell程序,其次调用须要的外部命令文件;命令解释器
提供了单一功能的编程接口:过程式编程逻辑的支持;
根据程序的编写范式:程序=指令+数据 程序=算法+数据结构
过程式编程语言:
以指令(算法)为中心,围绕指令(算法)的实现设计数据和数据结构,数据为指令服务的;
算法或指令的实现形式:
顺序执行
选择执行
循环执行
对象式编程语言:
以数据为中心,将数据实例化为类,围绕着数据的需求来部署指令
类(class):被实例化的数据
属性(attribution):同一类中的不一样对象的区分依据;
方法(method):类的正确的操做方法;
低级语言:
汇编语言
shell脚本编程是一种过程式编程语言,解释运行,依赖于外部程序文件运行;
3)shell脚本究竟是什么?
1.纯文本文档——文件中所存储的数据都是以字符为单位进行存储的;
2.根据用户的需求来解决用户问题的大量命令的组合体;
3."执行幂等性"——任何命令屡次执行的结果是一致的;
不少命令都不具有"执行幂等性",在shell脚本中就须要使用大量的程序逻辑来判断某个命令是否知足其运行条件,以免在运行过程当中出现严重错误;
4) shell脚本中的代码内容:
1.首行必须是shebang,解释器路径,必须占据绝对行首:在执行时,启动相应的解释器以解释脚本内诸多的命令;
#!/bin/bash
#!/bin/sh
#!/usr/bin/python
#!/usr/bin/perl
2.在shell脚本中,除了shebang以外,以#占据绝对行首的内容,均为注释行;解释器会忽略这样的行的内容;
3.解释会忽略脚本中因此的空白行;
4.大量的命令和关键字(if,else,then,do,while,for,...)
5.bash中全部的特殊字符;
注意:shell脚本一旦运行,是在当前的shell中根据shebang的指示,开启一个解释器(子shell)解释执行代码内容,shell脚本的内容是在一个子shell进程中实现的;
咱们能够利用文本编辑工具来编写shell脚本:
nano、vi、vim、emacs、pico
推荐使用vim:语法着色特性,自动缩进,...
脚本命名方式:可使用.sh的文件名后缀;在低版本的vim编辑器,只能根据.sh的后缀命令来识别是否为shell脚本;高版本的vim编辑器,则无需过多的关心文件后缀名的问题;
5)脚本的运行方法:
1.为脚本文件赋予执行权限,直接运行此文件;
~]# chmod +x /PATH/TO/SCRIPT_FILE
~]# /PATH/TO/SCRIPT_FILE
若是在执行脚本时,只写脚本文件名不给出路径的话,必须确保PATH变量中保存的路径下,能找到该脚本文件;
2.直接使用解释器运行脚本,将脚本做为解释器命令的参数;
bash /PATH/TO/SCRIPT_FILE
bash -x /PATH/TO/SCRIPT_FILE:将脚本的运行过程展现出来,通常用于脚本排错;
bash -n /PATH/TO/SCRIPT_FILE:对脚本进行语法排错,若是存在语法错误,则bash会给予提示,针对于这类错误提示,须要咱们自行判断错误发生的位置;
6)文本处理工具:
vim、vi、nano
文本处理三剑客:
grep系:grep、egrep、fgrep,文本搜索工具,基于"PATTERN"对于给定的文本进行模糊搜索,grep系默认工做于贪婪模式下;
sed:Stream EDitor,流编辑器,行编辑器,文本编辑工具;
awk:gawk——GNU awk,文本格式化工具,文本报告生成器,文本处理的编程语言;
grep系:
grep
egrep
fgrep
grep:Global search Regular Expression and Print out the line.
利用正则表达式进行全局搜索并将匹配的行显示出来;
grep [OPTIONS] PATTERN [FILE...]
PATTERN:过滤条件,是由正则表达式元字符以及没有特殊含义的文本字符组成;
正则表达式的元字符:
会被正则表达式引擎解释为特殊含义;
pcre——perl语言的正则表达式引擎;
基本的正则表达式:BRE
扩展的正则表达式:ERE
grep默认仅支持基本正则表达式;
egrep默认仅支持扩展正则表达式;
fgrep默认不开启正则表达式引擎;
文本字符:
只具有字符便面含义的那些字符;
经常使用选项:
-i, --ignore-case:忽略文本字符的大小写;
-v, --invert-match:反向匹配;最终显示的结果是PATTERN不能成功匹配的行;
-c, --count:计数,统计匹配PATTERN的全部的行数;
-o, --only-matching:关闭贪婪模式,仅显示PATTERN可以匹配的内容;
-q, --quiet, --silent:安静模式,不输出任何匹配结果;
--color[=WHEN], --colour[=WHEN]:将匹配PATTERN的内容以特殊颜色高亮显示;
--color=auto
-E, --extended-regexp:扩展的正则表达式,grep -E至关于egrep;
-F, --fixed-strings, --fixed-regexp:grep -F至关于fgrep
-G, --basic-regexp:基本的正则表达式,egrep -G至关于grep
-P, --perl-regexp:使用PCRE(Perl Common Regular Expression)引擎;
-A NUM, --after-context=NUM:在显示匹配PATTERN的行的同时显示其后面的NUM行;
-B NUM, --before-context=NUM:在显示匹配PATTERN的行的同时显示其前面的NUM行;
-C NUM, -NUM, --context=NUM:在显示匹配PATTERN的行的同时显示其先后各NUM行;
PATTERN:
正则表达式元字符:
基本的正则表达式元字符:
GLOBBING-------简化版的正则表达式: [] ? *
字符匹配:
. :匹配任意单个字符;
[]:匹配指定范围内的任意单个字符;
[^]:匹配指定范围之外的任意单个字符;
下列全部的字符集均可以放置于[]之中用于匹配单个字符;
[:lower:]
[:upper:]
[:alpha:]
[:digit:]
[:space:]
[:alnum:]
[:punct:]
[:blank:]
[:xdigit:]:全部的十六进制数字;
a-z:全部的小写字母
A-Z:全部的大写字母
0-9:标识全部的十进制数字
[:alnum:](字母和数字), [:alpha:](字母), [:cntrl:](), [:digit:](数字),
[:graph:](), [:lower:](小写字母), [:print:](可打印字符), [:punct:](),
[:space:](空格), [:upper:](大写字母), [:xdigit:]
次数匹配:该类字符以前的那个字符能够出现的次数;
*:其前面的字符能够出现任意次(0次,1次或屡次);
\?:其前面的字符无关紧要(0次或1次);
\+:其前面的字符至少出现一次(1次或屡次);
\{m\}:其前面的字符必须出现m次;
\{m,n\}:其前面的字符至少出现m次,至多出现n次;(m<n)
\{,n\}:其前面的字符至少出现0次,至多出现n次;
\{m,\}:其前面的字符至少出现m次,×××;
在正则表达式中,表示任意长度任意字符的方式:.*
位置锚定字符:
行锚定:
行首锚定:^
行尾锚定:$
字锚定:
字首锚定:\<或\b
字尾锚定:\>或\b
\b:旧版本中的锚定方法,建议不使用;
对于正则表达式引擎来讲,字是由非特殊字符组成的连续字符串;
分组与引用字符:
\(PATTERN\):将此PATTERN所匹配到的全部字符看成一个不可分割的总体来处理
在正则表达式引擎之中,有一系列的内置变量,这些变量会保存全部分组内的字符信息,用于后向引用;这些变量依次是:\1, \2, \3, ...
pattern1\(pattern2\)pattern3\(pattern4\(pattern5\)\)
\1:pattern2
\2:pattern4
\3:pattern5
\1:第一组小括号中的pattern匹配到的字符;
\2:第二组小括号中的pattern匹配到的字符;
...
请找出在/etc/passwd中用户的UID和GID相同的用户帐户;
~]# grep '\(\<[[:digit:]]\+\>\).*\1' /etc/passwd
或:
\|
注意:\|将其左右两边的字符串看成总体对待;
A\|american :A或american
请找出ifconfig命令的执行结果中数值在100-255之间的整数;
第一位:1 2
第二位:0-9 0-4 5
第三位:0-9 0-9 0-5
ifconfig | grep '\<\(1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\>'
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
默认状况下,grep命令后面只容许有一个PATTERN;
若是想要在一次grep所搜过程当中写多个PATTERN,则须要使用-e选项;每一个-e选项只能使用一个PATTERN做为参数;
将所须要的PATTERN写入到一个文件中,保证每行只有一个PATTERN;咱们就可使用-f FILE方式来实现多PATTERN匹配;
egrep:
egrep [OPTIONS] PATTERN [FILE...]
扩展的正则表达式元字符:
字符匹配:
.
[]
[^]
次数匹配:
*
?
+
{m}
{m,n}
{m,}
{0,n}
位置锚定
^
$
\<,\b
\>,\b
分组和引用:
()
\1, \2, \3,...
或:
|
fgrep:PATTERN中全部的字符都被看成文本字符来处理;
其余的文本处理命令:
wc:
wc [OPTION]... [FILE]...
-l:只显示行数
-w:只显示字数
-c:只显示字符数
cut:remove sections from each line of files
可以被cut命令修剪的文件,通常都是具备必定结构或格式的文本文档;/etc/passwd
cut OPTION... [FILE]...
-d, --delimiter=DELIM:指定在实施修剪操做时所依赖的分隔符,默认是空白字符;
-f, --fields=LIST:根据定义的分隔符来指定字段的编号;
地址定界使用方法:
#:选择被指定的单个字段;
#,#:离散的多个被指定的单个字段;
#-#:连续的多个被指定的字段;
--output-delimiter=STRING:指定输出分隔符;
awk:
awk -F "DELIMITER" '[/PATTERN/]{print $1,$2,...$NF}' FILE...
-F "DELIMITER":指定字段分隔符,默认为空白字符;
$1,$2,...,$NF:根据字段分隔符切割出来的文本片断都存放在相应的内部变量中;
sort:sort lines of text files,将文本文件按行继续排序,默认排序规则是按照ASCII表中的字符顺序进行,这个排序标准可修改;
-r, --reverse:逆序排序
-R, --random-sort:随机排序,这种随机算法是很是简陋的,不适用于复杂环境;
-u, --unique:重复出现的行,只保留一行;(连续且彻底相同的行叫重复),祛重;
-n, --numeric-sort:以数字的数值大小进行排序;
-t, --field-separator=SEP:指定字段分隔符;
-k, --key=KEYDEF:指明根据哪一个关键字段进行排序,通常和-t同时使用;
uniq:report or omit repeated lines
-d, --repeated:只显示重复出现的行,并且每一组重复行只显示一行;
-u, --unique:只显示不重复的行;
-c, --count:在每行之前缀的方式显示重复行的重复次数;
diff:compare files line by line
同一文件的不一样修改版本;打补丁;
patch:apply changes to files
patch [-R][-i patchfile] [file]
... ...
python