bash基础特性以及正则表达式和grep(第5天)

1:bash基础特性回顾:
命令行展开:~, {}
命令别名:alias/unalias
命令历史:history
命令和路径补全:$PATH
glob文件名通配: *, ?, [], [^]
快捷键:Ctrl+{a,e,l,c,u,k}
命令hash:hash

2:bash基础特性(3)
bash提供了编程的环境。程序是有数据和指令组成的。所以计算机发展到现在出现了两种不同的编程风格:一种是以指令为中心的,数据服务于指令,也称为过程式编程风格,另外一种是近来流行的对象式编程风格,该编程模式是以数据为中心,指令服务于数据。

计算机编程语言分为编译型语言和解释型语言。编译型语言要将高级语言写的代码通过编译器转换为目标代码,如果这些代码调用了glic库的话,还需要把目标代码和已经编译好的类库进行链接,最终才能成为可执行程序,这类语言有c,c++等;解释型语言则是通过解释器来解释源代码,通常是逐行解释的,解释一行源代码就执行一行,这类语言有perl,python等。

shell程序是属于过程式的,解释型的语言。既然是一种编程语言,shell也提供了编程需要的元素,比如有变量,数组,表达式,语句等等。

每一个shell程序,也成为shell脚本,都是普通的文本文件。规定shell脚本的首行必须是shell解释器的路径名称,这一行被称为shebang,写法如下:
#!/bin/bash
如此一来,bash就会读取该shell脚本的内容来执行。

举一个脚本的例子 first.sh:
#!/bin/bash
cat  /etc/fstab
wc -l /etc/fstab

通过chmod +x first.sh赋予脚本执行权限,然后通过./first.sh 来执行脚本。
或者直接通过bash first.sh 来执行脚本。

变量
变量表示命名的内存空间;
数据类型:数值型和字符型,数值型包括整型和浮点型
编程语言有强类型(不同类型的数据不能相互运算)和弱类型之分,bash把所有要存储的数据统统当作字符进行,并且bash不支持浮点数;

逻辑运算:true 和 false
与:1 && 1 = 1      1 && 0 = 0      0 && 1 = 0      0 && 0 = 0
或:1  ||    1 = 1      1   ||   0 = 1      0  ||    1 = 1      0   ||   0 = 0
非:! 1 = 0     ! 0 = 1
异或:1^0 = 1  0^1 = 1    0^0  = 1   1^1  =  0

短路运算:
与:
      第一个为0,结果必定为0;
      第一个为1,第二个必须要参与运算;
或:
      第一个为1,结果必定为1;
      第一个为0,第二个必须要参与运算;
例子:判断用户jerry是否存在?
id jerry &>  /dev/null  && echo "jerry exists" || echo "jerry no exists"

3:Linux上文本处理三剑客
grep:文本过滤(模式:pattern)工具;
      grep(基本正则), egrep(扩展正则), fgrep(不支持正则)
sed:stream editor,文本编辑工具;
awk:Linux上的实现gawk,文本报告生成器;

grep: Global search REgular expression and Print out the line.
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行;
模式:由正则表达式字符及文本字符所编写的过滤条件;
REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符字面意义,而表示控制或通配的功能;分两类如下:
      基本正则表达式:BRE
      扩展正则表达式:ERE,(grep -E和egrep)
正则表达式引擎:
grep [OPTIONS] PATTERN [FILE...]
--color=auto: 对匹配到的文本着色显示;
-v: 显示不能够被pattern匹配到的行;
-i: 忽略字符大小写;
-o: 仅显示匹配到的字符串;
-q: 静默模式,不输出任何信息;
-A #:after, 显示匹配到的行和后#行
-B #: before, 显示匹配到的行和前#行
-C #:context, 显示匹配到的行和前后各#行
-E:使用ERE,表示使用扩展的正则表达式;
-w 作为单词来匹配
-e  表示或

基本正则表达式元字符:
字符匹配有3种,如下:
      .     表示匹配任意单个字符;
      []   表示匹配指定范围内的任意单个字符
      [^] 表示匹配指定范围外的任意单个字符,支持[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]

匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数;
      *  表示匹配前面的字符任意次,即0次,或1次,或多次;记住,这和通配符的*完全不一样,例子  grep x*y /test.txt
      .*   表示匹配任意长度的任意字符
      \?  表示匹配其前面的字符0或1次;即前面的可有可无;
      \+  表示匹配其前面的字符至少1次;
      \{m\} 表示匹配前面的字符m次;
      \{m,n\}  表示匹配前面的字符至少m次,至多n次;
            \{0,n\}  表示匹配前面的字符至多n次;
            \{m,\}   表示匹配前面的字符至少m次;

位置锚定:
      ^  表示行首锚定;用于模式的最左侧;
      $  表示行尾锚定;用于模式的最右侧;
      ^PATTERN$  表示用于模式匹配整行;
            ^$  表示空行;
            ^[[:space:]]*$
      \< 或 \b  表示词首锚定;用于单词模式的左侧;
      \> 或 \b  表示词尾锚定;用于单词模式的右侧;
      \<PATTERN\>  表示匹配整个单词;

分组:
      \(\)  表示将一个或多个字符捆绑在一起,当作一个整体进行处理;例如  \(xy\)*ab
      Note: 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, ...
      \1  表示从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符;举个例子                 \(ab\+\(xy\)*\)中的\1就是ab\+\(xy\)* 和\2就是xy
      后向引用:引用前面的分组括号中的模式所匹配字符,(而非模式本身)
      例子:获取IP地址:    ifconfig | grep -E -o "([0-9]{1,3}\.){3}[0-9]{1,3}"

练习:
1、显示/proc/meminfo文件中以大小写s开头的行;(要求:使用两种方式)
# grep  -i "^s"  /proc/meminfo
# grep   "^[sS]" /proc/meminfo

2、显示/etc/passwd文件中不以/bin/bash结尾的行;
# grep -v "\(/bin/bash\)$" /etc/passwd

3、显示/etc/passwd文件中UID号最大的用户的用户名;
# sort -t: -k3  -n /etc/passwd | tail -1 |  cut -d: -f1

4、如果用户root存在,显示其默认的shell程序;
# id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7

5、找出/etc/passwd中的两位或三位数;
#  grep "\<[0-9]\{2,3\}\>" /etc/passwd

6、显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存非空白字符的行;
#  grep "^[['space']]\+[^[:space:]]" /etc/rc.d/rc.sysinit

7、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行;
#  netstat -tan | grep "LISTEN[[:space:]]*$"

8、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名和shell名称一样的行;
# grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd

练习:
1、写一个脚本,实现如下功能
如果user1用户存在,就显示其存在,否则添加之;
显示添加的用户的id号等信息;
#!/bin/bash
id user1 &> /dev/null && echo "user1 exists." || useradd user1
id user1

2、写一个脚本,完成如下功能
如果root用户登录了当前系统,就显示root用户在线;否则说明其未登录;
#!/bin/bash
who | grep "^root\>" &> /dev/null && echo "root online" || echo "root no login"



评论

此博客中的热门博文

OAuth 2教程

网格策略

apt-get详细使用