首页 / 正则 / shell函数与正则
shell函数与正则
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了shell函数与正则,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6950字,纯文字阅读大概需要10分钟。
内容图文
![shell函数与正则](/upload/InfoBanner/zyjiaocheng/939/aa13c8cee4b74f4da83afd60cfeed723.jpg)
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正则表达式 ? 正则表达式在每种语言中都会有,功能就是匹配符合你预期要求的字符串。 Shell 正则表达式分为两种:
- 基础正则表达式
- 扩展正则表达式:扩展的表达式有+、?、| 和()
- 正则表达式就是为了处理大量的文本|字符串而定义的一套规则和方法
- 通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。Linux正则表达式一般以行为单位处理。
- 不需要思考的判断方法:在三剑客awk,sed,grep,egrep都是正则,其他都是通配符
- 区别通配符和正则表达式最简单的方法:
符号 | 描述 | 实例 |
. | 匹配任意单个字符(必须存在) | 例子: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个字符 | 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 |
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:] | 十六进制 |
#!/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" ? 正则练习 ? 使用文件 /etc/init.d/functions ,下面可能有些部分题目匹配不到符合的情况。 1.?过滤出包含大写字母的行 2.?匹配非数字字符 3.?过滤出一行中a在前,b在后的行 4.?匹配a和b之间有最少2个c最多5个c的行 5.?过滤出以#?为开头,且第二个字符是空格的行 6.过滤出行首和行位字母相同的行 7.过滤出第一个字符是#,且第二个字符串是非空字符,而且结尾是数字的行 8.过滤出一行包含相同数字的行/etc/init.d/functions ? ? ? ? 答案: 1.? [root@ken ~]# grep "[A-Z]"? /etc/init.d/functions ? 2.? [root@ken ~]# grep "[^0-9]"? /etc/init.d/functions ? 3. [root@ken ~]#? grep? "a.*b" /etc/init.d/functions ? 4.(匹配不到) [root@ken ~]# grep "ac\{2,5\}b" /etc/init.d/functions ? 5. [root@ken ~]#? grep "^#[[:space:]]" /etc/init.d/functions ? 6.(匹配不到) [root@ken ~]# grep "^\([a-z]\).*\1$" /etc/init.d/functions ? 7.(匹配不到) [root@ken ~]# grep? "^#[^[:space:]].*[0-9]$" /etc/init.d/functions ? 8. [root@ken ~]# egrep ".*([0-9]).*\1" /etc/init.d/functions ? 补充:shell练习题 ? 1. 每一秒钟输出/root下的文件至屏幕 2. 打印出包含某个关键词的文件(关键词执行脚本时接收) 3. 统计系统中以.sh结尾的文件总大小,输出结果以kb为单位 ? ? ? ? 参考答案: 1.? #!/bin/bash
for file in `ls /root`
do
??????? echo $file
??????? sleep 1
done ? 2. #!/bin/bash
key=$1
for file in `find / -type f`
do
??????? grep "$key" $file &>/dev/null
??????? if [ $? -eq 0 ];then
??????????????? echo $file
??????????????? sleep 1
??????? fi
done ? 3. #!/bin/bash
sum=0
for size in `find /root -name "*.sh" -exec ls -l {} \; | cut -d " " -f 5`
do
??????? let sum+=$size
done
echo "$((sum/1024))kb"
内容总结
以上是互联网集市为您收集整理的shell函数与正则全部内容,希望文章能够帮你解决shell函数与正则所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。