shell中允许将一组命令集合或语句形成一段可用代码,这些代码块称为shell函数。给这段代码起个名字称为函数名,后续可以直接调用该段代码。
格式
func() { #指定函数名 command #函数体 }
实例1:
#!/bin/bash func() { echo "This is a function." } func # bash test.sh This is a function.
Shell 函数很简单,函数名后跟双括号,再跟双大括号。通过函数名直接调用,不加小括号。
示例 2:函数返回值
#!/bin/bash func() { VAR=$((1+1)) return $VAR echo "This is a function." } func echo $? # bash test.sh 2
return 在函数中定义状态返回值,返回并终止函数,但返回的只能是 0-255 的数字,类似于 exit。
示例 3:函数传参
#!/bin/bash func() { echo "Hello $1" } func world # bash test.sh Hello world
通过 Shell 位置参数给函数传参。
正则表达式在每种语言中都会有,功能就是匹配符合你预期要求的字符串。
Shell 正则表达式分为两种:
(1)文件目录名===>通配符
(2)文件内容(字符串,文本【文件】内容)===>正则表达式
下面是一些常用的正则表达式符号,我们先拿 grep 工具举例说明。
注意:在匹配模式中一定要加上引号
符号 | 描述 | 实例 |
. | 匹配任意单个字符(必须存在) | 例子:l..e
可以表示 love like leee 不可以表示的 labcde le lee |
^ | 匹配前面字符串开头 | 匹配以 abc 开头的行:
echo -e “abc\nxyz” |grep ^abc |
$ | 匹配前面字符串结尾 | 匹配以 xyz 结尾的行:
echo -e “abc\nxyz” |grep xyz$ |
* | 匹配前一个字符的零个或多个 | a* 表示出现任意个a的情况
a*b 表示b前面有任意个a的情况(包括没有a的情况) |
.* |
表示任意长度的任意字符 | 例子:过滤出一行中a在前,b在后的行
条件: 包含 a 和 b 字母 a 必须在 b前面
# grep –color “a.*b” b.txt |
+(扩展正则) | 表示其前面的字符出现最少一次的情况 | 匹配 abc 和 abcc:
echo -e “abc\nabcc\nadd” |grep -E ‘ab+’ 匹配单个数字:echo “113” |grep -o ‘[0-9]’ 连续匹配多个数字:echo “113” |grep -E -o ‘[0-9]+’ |
?(扩展正则) | 表示其前面的字符出现最多一次的情况(可以0个) | 匹配 ac 或 abc:
echo -e “ac\nabc\nadd” |grep -E ‘a?c’ |
[] | 表示范围内的一个字符 | 例子:过滤出包含小写字母的行 grep [a-z] a.txt
例子:过滤出包含大写字母的行 grep [A-Z] a.txt 例子:过滤出包含数字的行 grep [0-9] a.txt 例子:过滤出包含数字和小写字母的行 grep [0-9a-z] a.txt 例子:过滤出包含字母asf的行 grep [asf] a.txt |
[ .-.] | 匹配中括号中范围内的任意一个字符 | 匹配所有字母
echo -e “a\nb\nc” |grep ‘[a-z]’ |
[^] | 匹配[^字符]之外的任意一个字符 | 匹配 a 或 b:
echo -e “a\nb\nc” |grep ‘[^c-z]’ 匹配末尾数字:echo “abc:cde;123” |grep -E ‘[^;]+$’ |
^[^] | 匹配不是中括号内任意一个字符开头的行 | 匹配不是#开头的行:
grep ‘^[^#]’ /etc/httpd/conf/httpd.conf |
{n}或者{n,} | {n}:表示严格匹配n个字符
{n,}匹配花括号前面字符至少 n个字符 |
echo “aadadccc” | egrep “a{2}”
echo “aadadccc” | egrep “a{1}” |
{n,m} | 匹配花括号前面字符至少 n个字符,最多 m 个字符 | 例子:
“ac\{2,5\}b” 匹配a和b之间有最少2个c最多5个c的行 “ac\{,5\}b” 匹配a和b之间有最多5个c的行 “ac\{2,\}b” 匹配a和b之间有最少2个c的行 |
\< | 锚定单词首部(单词一般以空格或特殊字符做分隔) | # echo “hi,root,iamroot” | grep “\<root” hi,root,iamroot # echo “hi,root,iamroot” | grep “root\>” hi,root,iamroot # echo “hi,root,iamroot” | grep “\<root\>” hi,root,iamroot
|
\> | 锚定单词尾部(单词一般以空格或特殊字符做分隔,) | # echo “hi,root,iamroot” | grep “\<root” hi,root,iamroot # echo “hi,root,iamroot” | grep “root\>” hi,root,iamroot # echo “hi,root,iamroot” | grep “\<root\>” hi,root,iamroot |
() | \1 调用前面的第一个分组 |
例子:过滤出一行中有两个相同数字的行 # grep “\([0-9]\).*\1” inittab
例子:过滤出行首和行位字母相同的行 # grep “^\([a-z]\).*\1$” inittab
|
|(扩展正则) | 匹配竖杠两边的任意一个 |
例子:过滤出cat 或者Cat
# grep “cat|Cat” a.txt
# grep “(C|c)at” a.txt
|
一、字符匹配
.
[]
[^]
二、次数匹配
*
\{m,n\}
三、锚定
^
$
\<
\>
四、分组
\(\)
\1
grep -E
egrep
一、字符匹配
.
[]
[^]
二、次数匹配
*
{m,n}
+ 表示其前面的字符出现最少一次的情况
?表示其前面的字符出现最多一次的情况
三、锚定
^
$
\<
\>
四、分组
()
\1
\2
五、或
|
一.、正则表达式中的{}以及()都需要加上\进行转义,而扩展正则表达式不需要
二 、|, ?,+是扩展正则独有的
三、 锚定单词首部和尾部在扩展正则以及正则中都需要加上\
Posix字符 | 描述 |
[:alnum:] |
等效a-zA-Z0-9 |
[:alpha:] | 等效a-zA-Z |
[:lower:] | 等效a-z |
[:upper:] | 等效A-Z |
[:digit:] | 等效0-9 |
[:space:] | 匹配任意空白字符,等效\t\n\r\f\v |
[:graph:] | 非空白字符 |
[:blank:] | 空格与定位字符 |
[:cntrl:] | 控制字符 |
[:print:] | 可显示的字符 |
[:punct:] | 标点符号字符 |
[:xdigit:] | 十六进制 |
注意:使用这些字符的时候需要在外面还要加一个[]括号
说一下[:space:]
[root@ken ~]# cat test #文本内容 #!/bin/bash if [ 1 -eq 1 ]; then echo "yes" else echo "no" fi AJDLAJDL LAJLDJA JDKAJkjskdjklaskj lsdjal0dlkakm [root@ken ~]# grep ‘[[:space:]]‘ test #过滤出包含空格的行,[:space:]括号外面还要再包含一个[] if [ 1 -eq 1 ]; then echo "yes" else echo "no"
[root@ken ~]# grep ‘ ‘ test #也可以使用一个空格来代替[:space:] if [ 1 -eq 1 ]; then echo "yes" else echo "no"
1。 一个点. 表示含义匹配单个字符且该字符必须存在(相当与通配符中的问号)
例子1:
[root@ken ~]# cat test
ac
abc
abbc
anmcc
[root@ken ~]# grep “a.c” test
abc
[root@ken ~]# grep -o “a..c” test
abbc
anmc
2. ^ 表示匹配以某个字符开头的行
例子1:匹配以root开头的行
[root@ken ~]# cat test1
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@ken ~]# grep “^root” test1
root:x:0:0:root:/root:/bin/bash
[root@ken ~]# grep “^r” test1
root:x:0:0:root:/root:/bin/bash
例子2:找到所有#号开头的行
[root@ken ~]# grep “^#” test1
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
3. $ 表示匹配以什么字符结尾的行
例子1:找到所有以bash结尾的行
[root@ken ~]# grep “bash$” test1
root:x:0:0:root:/root:/bin/bash
例子2:找到所有空白行
[root@ken ~]# vim test1
[root@ken ~]# grep “^$” test1
4. * 表示的是匹配前面的一个字符出现0次或者多次
例子1:
[root@ken ~]# cat test | grep -o “a*b”
ab
ab
b
aab
aaab
aaaaab
b
例子2:
[root@ken ~]# cat test
abc
abbc
aab
aaab
aaaaab
acab
[root@ken ~]# cat test | grep -o “a*b”
ab
ab
b
aab
aaab
aaaaab
ab
例子3:
[root@ken ~]# cat test
abc
abbc
aab
aaab
aaaaab
acab
[root@ken ~]# grep -o “a.*b” test
ab
abb
aab
aaab
aaaaab
acab
5. [] 表示匹配括号内的一个字符
例子1:
[root@ken ~]# cat test | grep -o “[ab]”
a
b
a
b
b
a
a
b
a
a
a
b
a
a
例子2:匹配以字母开头的行
[root@ken ~]# cat test1 | grep “^[a-z]”
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
operator:x:11:0:operator:/root:/sbin/nologin
例子3:
[root@ken ~]# cat test1 | grep “^[a-zA-Z]”
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
Ooperator:x:11:0:operator:/root:/sbin/nologin
例子4:
[root@ken ~]# cat test1 | grep “^[a-zA-Z0-9]”
root:x:0:0:root:/root:/bin/bash
3bin: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
Ooperator:x:11:0:operator:/root:/sbin/nologin
6. ^[^] 表示匹配非括号内的行
例子1:
[root@ken ~]# cat test1 | grep “^[^a-z]”
3bin:x:1:1:bin:/bin:/sbin/nologin
Sync:x:5:0:sync:/sbin:/bin/sync
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
$mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
Ooperator:x:11:0:operator:/root:/sbin/nologin
7.锚定 单词首部:\< 特殊字符,空格
锚定单词尾部: \>
例子1:
[root@ken ~]# cat test1 | grep “\<root”
root:x:0:0:root:/root:/bin/bash
Ooperootrator:x:11:0:operator:/root:/sbin/nologin
例子2:
[root@ken ~]# cat test1 | grep “\<root\>”
root:x:0:0:root:/root:/bin/bash
rootooperootrator:x:11:0:operator:/root:/sbin/nologin
基础正则:中的{}。以及()前面都要加上\
使用格式:\{\} \(\)
8. \{m,n\} 表示匹配前面的字符出现至少m次,至多n次
例子1:
[root@ken ~]# cat test | grep -o “a\{1,2\}b”
ab
ab
aab
aab
aab
ab
例子2:
[root@ken ~]# cat test | grep -o “a\{1,\}b”
ab
ab
aab
aaab
aaaaab
ab
9. \(\) \1表示的对某个单词进行分组,\1表示对第一个分组进行调用
[root@ken ~]# sed -i ‘s/\(SELINUX=\)disabled/\1enforcing/g’ /etc/sysconfig/selinux
扩展正则使用:
1.egrep
2.grep -E
10.+ 表示前面的字符出现一次的情况
例子1:
[root@ken ~]# cat test | egrep “a+b”
abc
abbc
aab
aaab
aaaaab
acab
例子2:
[root@ken ~]# cat test | grep -E “a+b”
abc
abbc
aab
aaab
aaaaab
acab
11.| 或
例子1:
[root@ken ~]# echo “cat jdkajk Cat” | grep -E “(cat)|(Cat)”
cat jdkajk Cat
例子2:
[root@ken ~]# echo “cat jdkajk Cat” | grep -E “(c|C)at”
cat jdkajk Cat
12.?表示前面的字符出现最多一次的情况
例子1:
[root@ken ~]# cat test | grep -E -o “a?b”
b
ab
ab
b
ab
ab
ab
ab
原文:https://www.cnblogs.com/1011cjk/p/11002370.html