shell脚本:文本文件
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
grep 文本过滤器
-v:显示不能被匹配到的行
-i:忽略字符大小写
-o:仅显示匹配到的字符串
-E:使用扩展正则表达式(ERE)
\{m\}:匹配前面的字符m次; grep '\{m\}' a.txt
\{m,n\}:匹配前面的字符至少m次,至多n次;
\{m,\}:匹配前面的字符至少m次;
位置锚定:
^:行首锚定
$:行尾锚定
^PATTERN$:用于模式匹配的行
^$:空行
^[[:space:]]*$ 匹配空格
BRE:基本正则表达式
字符匹配:.单个字符 []范围内单个字符 [^]除...外单个字符
[[:digit:]]表示所有数字
[[:lower:]]所有小写字符
[[:upper:]]所有大写字符
[[:alpha:]]所有字符
[[:alnum:]]所有字符及数字
[[:punct:]]所有标点符号
[[:space:]]空格
次数匹配: * \?0次或1次 \+至少一次 \{m\}至少m次 \{m,n\}
位置锚定:^ $ \< \b \> \b
分组: \(\) 将一个或多个字符捆绑在一起,当作一个整体进行处理
例如:\(xy\)*ab
Note:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命令方式为\1,\2,\3....
\1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
例如:\(ab\+\(xy\)*\)
\1:ab\+(\xy\)* #表示一个变量
\2:xy
后向引用(引用前面的分组括号中的模式所匹配的字符):\1,\2,...
练习:
1.如果root用户存在,显示其默认的shell程序:
grep "^root\>" /etc/passwd > /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7
2.找出/etc/passwd中的两位数或三位数:
grep "\<[0-9]\{2,3\}\>" /etc/passwd
3.显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存在非空白字符的行
grep "^[:space:]\+[^[:space:]]" /etc/rc.d/rc.sysinit
4.找出"netstat -tan"命令的结果以"LISTEN"后跟0、1或多个空白字符结尾的行
netstat -tan | grep "LISTEN[[:space:]]*$" #[[:space:]]表示空格
5.添加用户bash testbash basher以及nologin(其shell为/sbin/nologin):而后找出/etc/passwd文件中用户名同shell名的行
grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd #[[:alnum:]]表示仅看数字及字符串 "\(\)"里面的内容为一组
6.写一个脚本,实现
如果user1用户存在,就显示其存在,否则添加该用户;显示添加的用户的id号等信息
#!/bin/bash
id user2 &> /dev/null && echo 'user2 is exists!' || useradd user2 #“&”表示如果为真则执行 “&&”表示并且,即前一步成功才执行,否则不执行 “||”表示否则 即前面不为真则执行
id user2
7.如果root用户登录的当前系统,就显示root用户在线,否则说明其未登录;
grep "root\>" &>/dev/null && echo "root login" || echo"root is not login in"
egrep
-v:显示不能被匹配到的行
-i:忽略字符大小写
-o:仅显示匹配到的字符串
目录名 dirname 是目录的路径
#dirname /etc/sysconfig/network-scripts/
/etc/sysconfig
基名 basename 是最后的路径
#basename /etc/sysconfig/network-scripts/
network-scripts
1.显示当前系统root、centos或user1用户的默认shell和UID
grep -E '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,7
2.找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
grep -E -o '[_[:alpha:]]+\(\)' /etc/rc.d/init.d/functions
3.使用echo输出一绝对路径,使用egrep取出其基名
echo /etc/sysconfig/network | grep -E -o "[^/]+$"
4.找出ifconfig命令结果中的IP地址
ifconfig | grep "Bcast" | cut -d: -f2| cut -d " " -f1
ifconfig | grep "Bcast" | cut -d: -f2| awk '{print $1}'