小红帽第5集:
shell编程初步及正则表达式
bash基础及shell编程初步
bash基础特性回顾
命令行展开:~,{}
命令别名:alias/unalias
命令历史:history
命令和路径补全:$PATH
glob:*,?,[]
快捷键:ctrl+{a,e,u,k,c,l,<–,–>}
命令hash:hash
bash的基础特性(3)
提供了编程环境
程序:由指令加数据组成(这个概念已经提过好多好多次了呜呜)
程序编程风格:
过程式:以指令为中心,数据服务于指令
对象式:以数据为中心,指令服务于数据
shell程序:提供了编程能力,解释执行,主要是调用当前系统上的可用二进制程序,组织罗列解释执行
shell脚本:文本文件
对于shell脚本来说,第一行开头要写#!/bin/bash这样的代码,这个代码就做shebang。shebang的意义在于对于内核来说只能运行二进制文件,脚本文件中都为接近人类语言的代码,所以如果直接提交给内核运行内核是无法识别的。所以当shell脚本提交内核之后发现shebang标志符则会将代码交由shell解释器去执行,让shell解释器将代码解释为二进制程序再提交给内核进行运行,这就是shebnag的意义。通常对于shell脚本文件来说,也有自己的magic number(魔数),内核也可以通过魔数来分析该文件为shell脚本文件。
运行脚本:
1、给予执行权限,通过具体的文件路径指定文件执行
2、直接运行解释器,将脚本作为解释器程序的参数运行
程序中的变量:
变量:命名的内存空间
数据存储方式:
字符型:
数值型:
整形
浮点型
对于shell脚本语言来说,shell为弱类型的编程语言即某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过显性强制转换。同时shell会把所有要存储的数据全部当作字符串来进行,同时shell不支持浮点数,可以看出shell的作用是命令的堆砌,而不是要进行复杂的数值运算的语言。
grep及正则表达式
grep:
Linux上文本处理三剑客:
grep:文本过滤工具(基于模式:pattern)
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, –invert-match:显示不能被pattern匹配到的行
-i, –ignore-case:忽略字符大小写
-o, –only-matching:仅显示匹配到的字符串
-q, –quiet:静默模式,不输出任何信息
-A #:affter,后#行
-B #:before,前#行
-C #:context,前后各#行
-E :使用扩展的正则表达式
基本正则表达式元字符
字符匹配:
.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
注意:这里的字符即合和glob的模式是一样的
匹配次数(默认工作在贪婪模式下):用在要指定次数的字符后面,用于指定前面的字符要出现的次数
*:匹配前面的字符任意次
.*:表示任意长度的任意字符
\?:匹配前面的字符0次或1次,即前面的字符可有可无
+:匹配其前面的字符至少1次
{m\}:匹配其前面的字符m次
{m,n\}:匹配其前面的字符至少m次,至多n次
{0,n\}:匹配前面的字符至多n次
{m,\}:匹配前面的字符至少m次
位置锚定:
^:行首锚定,用于模式的最左侧
$:行尾锚定,用于模式的最右侧
^PATTERN$:用于模式匹配整行
^$:匹配空白行
^[[:space:]]*$:匹配只有空白的行
\<或\b:词首锚定,用于单次模式的左侧
>或\b:词尾锚定,用于单次模式的右侧
\<PATTERN>:匹配整个单次
分组:\(\):将一个或多个字符捆绑再一起当作一个整体进行处理
比如:”\(xy\)\+”表示匹配一个或多个xy字符串
后向引用:引用前面的分组括号中的模式所匹配字符(而非模式本身)
注意:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1,\2,\3,…
\1:表示从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
正则表达式举例:
[zhangshuo@localhost ~]$ #1、显示/proc/meminfo文件中以大小s开头的行(使用两种方式) [zhangshuo@localhost ~]$ grep -i "^s" /proc/meminfo SwapCached: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Shmem: 7304 kB Slab: 50244 kB SReclaimable: 23724 kB SUnreclaim: 26520 kB [zhangshuo@localhost ~]$ grep "^[Ss]" /proc/meminfo SwapCached: 0 kB SwapTotal: 2097148 kB SwapFree: 2097148 kB Shmem: 7304 kB Slab: 50244 kB SReclaimable: 23724 kB SUnreclaim: 26520 kB [zhangshuo@localhost ~]$ #2、显示/etc/passwd文件中不以/bin/bash结尾的行 [zhangshuo@localhost ~]$ grep -v "/bin/bash$" /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync [zhangshuo@localhost ~]$ #3、显示/etc/passwd文件中ID号最大的用户的用户名 [zhangshuo@localhost ~]$ sort -n -t : -k 3 /etc/passwd | tail -1 | cut -d : -f 1 nfsnobody [zhangshuo@localhost ~]$ #4、如果用户root存在,显示其默认的shell程序 [zhangshuo@localhost ~]$ id root &> /dev/null && grep "^\<root\>" /etc/passwd root:x:0:0:root:/root:/bin/bash [zhangshuo@localhost ~]$ id root &> /dev/null && grep "^\<root\>" /etc/passwd | cut -d : -f 7 /bin/bash [zhangshuo@localhost ~]$ #5、找出/etc/passwd中的两位或三位数 [zhangshuo@localhost ~]$ grep "\<[0-9]\{2,3\}\>" /etc/passwd mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin games:x:12:100:games:/usr/games:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin [zhangshuo@localhost ~]$ #6、显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存在非空白字符的行 [root@localhost ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg load_env set default="${next_entry}" set next_entry= save_env next_entry set boot_once=true set default="${saved_entry}" menuentry_id_option="--id" menuentry_id_option="" [zhangshuo@localhost ~]$ #7、找出“netstat -tan”命令的结果中以“LISTEN”后跟0个1个或多个空白字符结尾的行 [zhangshuo@localhost ~]$ netstat -tan | grep "LISTEN[[:space:]]*$" tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp6 0 0 :::21 :::* LISTEN tcp6 0 0 :::22 :::* LISTEN tcp6 0 0 ::1:631 :::* LISTEN tcp6 0 0 ::1:25 :::* LISTEN [zhangshuo@localhost ~]$ #8、添加用户bash,testbash,basher以及nologin(其shell为/sbin/nologin)而后找出/etc/passwd文件中用户名同shell名的行 [zhangshuo@localhost ~]$ #首先找用户名 [zhangshuo@localhost ~]$ grep "^[[:alnum:]]\+\>" /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync [zhangshuo@localhost ~]$ #再找用户名同shell名的行 [zhangshuo@localhost ~]$ grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt
|
-EOF