`
qindongliang1922
  • 浏览: 2183824 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
7265517b-f87e-3137-b62c-5c6e30e26109
证道Lucene4
浏览量:117530
097be4a0-491e-39c0-89ff-3456fadf8262
证道Hadoop
浏览量:125921
41c37529-f6d8-32e4-8563-3b42b2712a50
证道shell编程
浏览量:59903
43832365-bc15-3f5d-b3cd-c9161722a70c
ELK修真
浏览量:71301
社区版块
存档分类
最新评论

跟散仙学shell编程(十)

阅读更多
上篇文章,散仙简单介绍了在linux中,使用sed和gawk编程的基础,本篇我们来复习下在正则表达式,当然不仅仅在我们的shell里面有正则,各个编程语言里面都有正则这一处理字符文本的神器。

在shell里面到处可见正则的身影:
[search@h1 820]$ ll
总用量 0
-rw-rw-r-- 1 search search 0 8月  21 02:40 ab.txt
-rw-rw-r-- 1 search search 0 8月  21 02:40 acb.txt
-rw-rw-r-- 1 search search 0 8月  21 02:40 bacb.txt
[search@h1 820]$ ls -al
总用量 8
drwxrwxr-x   2 search search 4096 8月  21 02:40 .
drwx------. 16 search search 4096 8月  21 02:22 ..
-rw-rw-r--   1 search search    0 8月  21 02:40 ab.txt
-rw-rw-r--   1 search search    0 8月  21 02:40 acb.txt
-rw-rw-r--   1 search search    0 8月  21 02:40 bacb.txt
[search@h1 820]$ ls -al a*
-rw-rw-r-- 1 search search 0 8月  21 02:40 ab.txt
-rw-rw-r-- 1 search search 0 8月  21 02:40 acb.txt
[search@h1 820]$ ls -al ab*
-rw-rw-r-- 1 search search 0 8月  21 02:40 ab.txt
[search@h1 820]$ 


在case语句里面,就充分使用了正则的表达式:
[search@h1 820]$ cat 1.sh 



read -p "请输入一个字符: " answer


case  "$answer" in

 one|1)  echo "你选择了1" ;;
 two|2)  echo "你选择了2" ;;
 three|3)  echo "你选择了3" ;;
 *)  echo "你输入了其他" ;;


esac




time=`date`
echo "结束:  $time"


[search@h1 820]$ sh 1.sh 
请输入一个字符: one
你选择了1
结束:  2014年 08月 21日 星期四 02:49:55 CST
[search@h1 820]$ sh 1.sh 
请输入一个字符: 1
你选择了1
结束:  2014年 08月 21日 星期四 02:49:58 CST
[search@h1 820]$ sh 1.sh 
请输入一个字符: ll
你输入了其他
结束:  2014年 08月 21日 星期四 02:50:01 CST
[search@h1 820]$


[search@h1 820]$ echo "this is a test" | sed -n '/test/p'
this is a test
[search@h1 820]$ echo "this is a test" | sed -n '/tesst/p'
[search@h1 820]$ echo "this is a test" | gawk  '/test/{print $0}'
this is a test
[search@h1 820]$ echo "this is a test" | gawk  '/tesst/{print $0}'
[search@h1 820]$ 

正则表达式是区分大小写和单复数的:
[search@h1 820]$ echo "Aa" | sed -n  '/Aa/p'
Aa
[search@h1 820]$ echo "Aa" | sed -n  '/AA/p'
[search@h1 820]$ 

[search@h1 820]$ echo "my name is hadoop" | sed -n '/me/p' 
my name is hadoop
[search@h1 820]$ 


匹配空格:
[search@h1 820]$ echo "my name is hadoop" | sed -n '/ /p' 
my name is hadoop
[search@h1 820]$ echo "my name is hadoop" | sed -n '/  /p' 

在正则里面的转义用反斜杠\,一般会对特殊字符进行转义
[search@h1 820]$ echo "3 /  2"  | sed -n '/\//p'
3 /  2
[search@h1 820]$


下面看在正则里的锚字符:
[search@h1 820]$ echo "a book " | sed -n '/^a/p'
a book 
[search@h1 820]$ echo "is is a book " | sed -n '/^a/p'
[search@h1 820]$ 

^代表必须以某个字符开头:
[search@h1 820]$ echo "a book"  | sed -n '/$k/p'
[search@h1 820]$ echo "a book"  | sed -n '/k$/p'
a book
[search@h1 820]$ echo "a book c"  | sed -n '/k$/p'
[search@h1 820]$ 


$代表以某个字符结尾
[search@h1 820]$ echo "a fish" | sed -n '/^a fish$/p'
a fish
[search@h1 820]$ echo "a b  fish" | sed -n '/^a fish$/p' 
[search@h1 820]$ 


如果以^开头以$结尾的表达式,代表必须匹配这样的模式,不能出现在字符串里的任意位置
[search@h1 820]$ cat v.txt 
this is a test of line
this cat is sleeping
this ia a very nice hat
this test is at line four
[search@h1 820]$ sed -n '/.at/p' v.txt 
this cat is sleeping
this ia a very nice hat
this test is at line four
[search@h1 820]$ 

.字符代表一个字符,必须匹配一个字符
下面看下字符组[],表示可以匹配方括号内的任意一个字符
[search@h1 820]$ echo "Yes" | sed -n '/[Yy]es/p'
Yes
[search@h1 820]$ echo "yes" | sed -n '/[Yy]es/p' 
yes
[search@h1 820]$ 



排除字符组[^]:
[search@h1 820]$ cat b.txt 
cat
hat
hadoop
oops
gat
mat
yat
[search@h1 820]$ sed -n '/[^hm]at/p' b.txt  
cat
gat
yat
[search@h1 820]$ 


当然我们也可以使用区间:
[search@h1 820]$ echo "90" | sed -n '/[0-8]0/p'
[search@h1 820]$ echo "90" | sed -n '/[0-9]0/p'
90
[search@h1 820]$ 


在shell里面还有一些特殊的字符组:
[[:alpha:]] 匹配任意字母字符,无论是大写还是小写
[[:alnum:]] 匹配任意字母数字字符0-9,a-Z,或a-z
[[:blank:]] 匹配空格或制表符
[[:digit:]] 匹配0-9之间的数字
[[:lower:]] 匹配小写字母字符a-z
[[:print:]] 匹配任意可打印字符
[[:punct:]] 匹配标点符号
[[:space:]] 匹配任意空白字符,空格,制表符,NL ,FF ,VT ,CR
[[:upper:]] 匹配任意大写字母字符A-Z
[search@h1 820]$ echo "abc" sed -n '/[[:digit:]]/p'
abc sed -n /[[:digit:]]/p
[search@h1 820]$ echo "abc" | sed -n '/[[:digit:]]/p'
[search@h1 820]$ echo "abc123" | sed -n '/[[:digit:]]/p'
abc123
[search@h1 820]$ 


下面看下*号,表示0个到多个字符:
[search@h1 820]$ echo "ik" | sed -n '/ie*k/p'
ik
[search@h1 820]$ echo "ik" | sed -n '/iee*k/p'
[search@h1 820]$ echo "iek" | sed -n '/iee*k/p'
iek
[search@h1 820]$ 

[search@h1 820]$ echo "bat" | sed -n  '/b[ba]*t/p'
bat
[search@h1 820]$ echo "bt" | sed -n  '/b[ba]*t/p' 
bt
[search@h1 820]$ echo "bta" | sed -n  '/b[ba]*t/p'
bta
[search@h1 820]$ echo "bta" | sed -n  '/^b[ba]*t$/p'
[search@h1 820]$ 


下面看下?号字符,代表0个或1个:

[search@h1 820]$ echo "bt" | gawk  '/bt?/{print $0}'
bt
[search@h1 820]$ echo "btt" | gawk  '/bt?/{print $0}'
btt
[search@h1 820]$ echo "btta" | gawk  '/bt?/{print $0}'


下面看下+号,表示字符必须出现一次:

[search@h1 820]$ echo "bt" | gawk  '/bt+/{print $0}'
bt
[search@h1 820]$ echo "bbt" | gawk  '/bt+/{print $0}'
bbt
[search@h1 820]$ echo "bbz" | gawk  '/bt+/{print $0}' 
[search@h1 820]$ 


下面看下如何使用大括号来控制范围:
{m}出现m次
{m,n}在一个m到n的范围内
{m,}至少出现m次
[search@h1 820]$ echo "bt" | gawk --re-interval '/be{1,2}/{ print $0}'
[search@h1 820]$ echo "bet" | gawk --re-interval '/be{1,2}/{ print $0}'
bet
[search@h1 820]$ echo "beet" | gawk --re-interval '/be{1,2}/{ print $0}'
beet
[search@h1 820]$ echo "beeet" | gawk --re-interval '/be{1,2}/{ print $0}'
beeet
[search@h1 820]$ 


[search@h1 820]$ echo "bt" | gawk --re-interval '/b[ae]{1,2}t/{ print $0 }'
[search@h1 820]$ echo "bat" | gawk --re-interval '/b[ae]{1,2}t/{ print $0 }'
bat
[search@h1 820]$ echo "bet" | gawk --re-interval '/b[ae]{1,2}t/{ print $0 }' 
bet
[search@h1 820]$ echo "baet" | gawk --re-interval '/b[ae]{1,2}t/{ print $0 }'
baet
[search@h1 820]$ echo "baaet" | gawk --re-interval '/b[ae]{1,2}t/{ print $0 }'
[search@h1 820]$ echo "baet" | gawk --re-interval '/b[ae]{1,2}t/{ print $0 }' 
baet
[search@h1 820]$ echo "baeat" | gawk --re-interval '/b[ae]{1,2}t/{ print $0 }'
[search@h1 820]$ echo "bat" | gawk --re-interval '/b[ae]{1,2}t/{ print $0 }'  
bat
[search@h1 820]$ echo "bant" | gawk --re-interval '/b[ae]{1,2}t/{ print $0 }'
[search@h1 820]$ echo "baaeet" | gawk --re-interval '/b[ae]{1,2}t/{ print $0 }' 
[search@h1 820]$ echo "baet" | gawk --re-interval '/b[ae]{1,2}t/{ print $0 }'   
baet
[search@h1 820]$ echo "baeaet" | gawk --re-interval '/b[ae]{1,2}t/{ print $0 }'
[search@h1 820]$ echo "baeaet" | gawk --re-interval '/b[ae]{1,4}t/{ print $0 }' 
baeaet
[search@h1 820]$ echo "baeaet" | gawk --re-interval '/b[ae]{1,3}t/{ print $0 }' 
[search@h1 820]$ 


注意这个范围的m,n,比如[ae]{1,2},后面的n代表匹配的最大次数,最多能同时出现ae,

也可以使用|符号:
[search@h1 820]$ echo "this is a dog" | gawk  '/cat|dog/ { print $0 }'
this is a dog
[search@h1 820]$ echo "this is a ddog" | gawk  '/cat|dog/ { print $0 }'
this is a ddog
[search@h1 820]$ echo "this is a ddoxg" | gawk  '/cat|dog/ { print $0 }'
[search@h1 820]$ echo "this is a cat" | gawk  '/cat|dog/ { print $0 }'     
this is a cat
[search@h1 820]$ 


如果想匹配整个字符串,需要使用()标识整体:
[search@h1 820]$ echo "satabcd" | gawk  '/sat(abc)?/ {print $1}'
satabcd
[search@h1 820]$ 


下面看个小实站例子,目录文件计数:
[root@h1 ~]# cat count.sh 





mypath=`echo $PATH  | sed 's/:/ /g'`

echo $mypath

count=0


for dir in $mypath

do


check=`ls $dir`



for item in  $check
  do
  count=$[ $count + 1  ]
  done

 echo "$dir的数量: $count"

count=0


done


[root@h1 ~]# sh count.sh 
. /usr/local/sbin /usr/local/bin /sbin /bin /usr/sbin /usr/bin /usr/local/jdk/bin /home/search/hadoop/bin /home/search/hadoop/sbin /usr/local/ant/bin /usr/local/maven/bin /home/search/hive/bin /home/search/hive/conf /root/bin
.的数量: 32
/usr/local/sbin的数量: 0
/usr/local/bin的数量: 0
/sbin的数量: 238
/bin的数量: 93
/usr/sbin的数量: 157
/usr/bin的数量: 588
/usr/local/jdk/bin的数量: 45
/home/search/hadoop/bin的数量: 11
/home/search/hadoop/sbin的数量: 27
/usr/local/ant/bin的数量: 13
/usr/local/maven/bin的数量: 6
/home/search/hive/bin的数量: 10
/home/search/hive/conf的数量: 4
ls: 无法访问/root/bin: 没有那个文件或目录
/root/bin的数量: 0
[root@h1 ~]# 


至此,我们统计文件的小脚本就完成了,有兴趣的朋友,可以在linux里面尝试一下电话号码和邮箱的验证的正则的使用!

0
0
分享到:
评论

相关推荐

    跟老男孩学Linux运维:Shell编程实战.pdf 高清 带书签

    资深运维架构实战专家及教育培训界*专家十多年的运维实战经验总结,全面系统地讲解运维工作中Shell编程所需的知识点和Shell编程的各种企业级案例。

    跟老男孩学Linux运维:Shell编程实战 PDF

    跟老男孩学Linux运维:Shell编程实战 PDF跟老男孩学Linux运维:Shell编程实战 PDF

    跟老男孩学Linux运维:Shell编程实战

    《跟老男孩学Linux运维:Shell编程实战》分为五大部分:部分为第1章~第4章,此部分着重介绍新手如何学好Shell编程。涉及的内容包括Shell编程的入门介绍、基础知识、运行原理、编程语法、编程习惯、变量知识以及变量...

    shell编程入门经典--LINUX与UNIX Shell编程指南 (中文pdf版)

    《LINUX与UNIX Shell编程指南》是一本专为初学者设计的shell编程教程,它深入浅出地介绍了在Linux和UNIX系统中如何使用Shell进行高效自动化任务处理。Shell编程是Linux和UNIX系统中的核心技术,它允许用户通过命令行...

    shell编程学习资料

    Shell编程是Linux/Unix系统中不可或缺的一部分,它是一种命令行解释器,允许用户与操作系统进行交互,执行系统命令,以及编写脚本自动化任务。在本文中,我们将深入探讨Shell编程的基础知识,包括基本命令、变量、...

    Windows Shell 编程.pdf

    Windows Shell 编程.pdf 看过一些对windows 外壳的扩展程序,在使用上一般都是直接利用windows的外壳API做一些工作,因为外壳操作需要一些比较专业的知识,因此,大部分编程人员特别是使用集成编程环境的程序人员对...

    Shell编程中文手册.pdf

    Shell 编程中文手册 本手册涵盖了 Shell 编程的基础知识,包括 Shell 概述、Shell 解析器、Shell 脚本入门、Shell 中的变量等。 Shell 概述 Shell 是一种命令行接口,允许用户与操作系统进行交互。学习 Shell ...

    shell编程入门教程+shell脚本专家指南+UNIX.shell编程24小时教程.rar

    《shell编程入门教程》、《shell脚本专家指南》以及《UNIX.shell编程24小时教程》会提供详尽的实例和练习,帮助你巩固所学并深化理解。 总之,Shell编程是Linux/Unix环境中不可或缺的技能,它能够提高工作效率,...

    shell编程题目练习

    shell编程题目练习,练习基本的shell编程,学习脚本语言,提高效率

    跟老男孩学Linux运维:Shell编程实战 完整版 pdf

    跟老男孩学Linux运维:Shell编程实战 完整版 pdf

    Linux与UNIX Shell编程指南.pdf

    "Linux与UNIX Shell编程指南" Linux与UNIX Shell编程指南是计算机科学领域中一本经典的指南手册,旨在帮助读者快速掌握Linux与UNIX操作系统下的shell编程技术。下面是从该书中生成的相关知识点: 1. Shell概述 ...

    shell十三问——学习shell编程的好书

    这个“Shell十三问”可能是指一系列关于Shell编程的问题,涵盖了基础到高级的主题。以下是一些关于Shell编程的核心知识点: 1. **什么是Shell**: Shell是一个命令解释器,它接收用户输入的命令并将其转化为操作...

    绝版经典 LINUX与UNIX SHELL编程指南 PDF 高清版 [16.3M]

    学完本书后,你将成为一名shell编程高手。 内容简介 本书共分五部分 ,详细介绍了SHELL编程技巧,各种UNIX命令及语法,还涉及了UNIX的文字处理以及少量的系统管理问题。本书内容全面,文字简洁流畅,适合SHELL编程...

    Shell编程高级进阶系列视频.zip

    13Linux下Shell编程之While case演练 14Linux下Shell编程之While case演练 15Shell编程之函数及脚本案例讲解 16Shell编程之函数及脚本案例讲解 17Linux下Shell编程FIND、SED命令实战 18Linux下Shell编程FIND、SED...

    UNIX命令及SHELL编程

    这是一套完整的Unix培训教材,包括Unix常用命令及SHELL编程基础与高级技巧,PDF格式,共30个文件。另有2个Word文档。包内文件清单如下: 01_Shell-文件安全与权限.PDF 02_Shell-使用find和xargs.PDF 03_Shell-...

    Windows Shell 编程指南与实例

    《Windows Shell 编程指南与实例》是一本深入探讨Windows操作系统壳层编程技术的专业书籍。在Windows系统中,Shell指的是用户界面,它为用户提供与操作系统交互的环境,包括桌面、开始菜单、快捷方式等。Shell编程则...

    Unix Shell Shell编程

    6本pdf及chm的shell 编程的书 6本pdf及chm的shell 编程的书 6本pdf及chm的shell 编程的书 6本pdf及chm的shell 编程的书 6本pdf及chm的shell 编程的书

    shell编程个人笔记

    shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人笔记shell编程个人...

    shell demo及编程pdf

    **Shell编程介绍** Shell编程是Linux/Unix操作系统中的一种脚本语言,用于自动化日常任务,交互式地控制操作系统,以及实现系统级别的程序间交互。它提供了命令行接口(CLI)来执行各种系统命令,使用户能够高效地...

Global site tag (gtag.js) - Google Analytics