shell编程(5)---正则表达式

20 篇文章 0 订阅

1  正则表达式

 

 

1.1 正则表达式 是什么?

    它主要用于 字符串的模式分割,匹配,  查找及替换操作。

 

1.2  正则表达式与通配符的区别 

 

正则表达式: 用来匹配文件中的字符串的,专门用来匹配数据的,正则是包含匹配。grep,awk,sed  等命令可以支持正则表达式。搜索字符串的命令支持正则

 

通配符 :  用来匹配文件名称的,通配符是完全匹配。搜索文件的命令支持通配符。

任意多个字符

?      #匹配任意一个字符

[]     #匹配中括号中的任意一个字符

 

 

[root@aliyun247 ~]# find . -name "abc*"

./test/abc

./test/abcd

[root@aliyun247 ~]# find . -name "abc?"

./test/abcd

 

 

 

1.3   基础正则表达式1 

 

 

  基础正则表达式

元字符

作用

*

前一个字符匹配0次或任意多次

.

匹配除了换行符之外任意一个字符

^

匹配行首。例如^hello 会匹配hello开头的行。

$匹配行尾。例如hello$ 会匹配以hello 结尾的行

[]

匹配中括号中任意一个指定的字符,只匹配一个字符。例如[aeiou]匹配任意一个元音字母,[0-9]匹配任意一个数字,[a-z][0-9]匹配一个小写字母和一个数字组成的2位字符

[^]

匹配除中括号以外的任意一个字符,
例如[^0-9] 匹配任意一个非数字的字符,
[^a-z] 表示任意一位非小写字母

\

转义符,用于取消。将特殊符号的含义取消

\{n\}

表示其前面的 字符 恰好出现 n次。
例如 [0-9]\{4\} 匹配4位数字。[1][1-8][0-9]\{9\} 匹配手机号码
\{n,\}表示 其前面的字符 出现不小于n次,
例如 [0-9]\{2,\} 表示2位及以上的数字 
\{n,m\}表示 其前面的字符 至少出现n次,最多出现m次,例如 [a-z]\{6,8\} 匹配6到8位的小写字母   

 

 

 

*   前一个字符匹配0次或任意多次

 

 

a*

#匹配所有内容 包括空白行

aa*

#匹配至少包含一个a的行

aaa*

#匹配最少包含2个连续a的字符串

aaaaa*

#匹配最少包含4个a的连续的字符串

 

 

[root@aliyun247 test]# grep   "a*"       abc

aa

aa

aaa

aaa

aaaa

bbbbb

bbbbbb

bbbbb

bbbbdb

abcdimooc

abcdeimooc

imoocabcsd

[root@aliyun247 test]# grep    "aa*"     abc

aa

aa

aaa

aaa

aaaa

abcdimooc

abcdeimooc

imoocabcsd

[root@aliyun247 test]# grep   "aaa*"   abc

aa

aa

aaa

aaa

aaaa

 

1.4   基础正则表达式2

 

".*"

#匹配所有行

 

 "^$" 

#匹配空白行

[root@aliyun247 test]# grep "^$" abc

 

 

[root@aliyun247 test]# grep -n  "^$" abc

4:

7:

 

 

[ ]: 匹配中括号中指定的 任意一个 字符 

注意:   ^ :  在中括号外部 代表 开头,在中括号里边 代表 取反

[a-z] 

[root@aliyun247 test]# grep -n    '^[0-9]'   abc

7:144bgggg

8:4444shhh

9:12322:

10:12223

11:2123

[root@aliyun247 test]# grep -n   '[0-9]$'   abc

11:2123

[root@aliyun247 test]# grep -n   '[^0-9]$'   abc

1:aa

2:aa

3:aaa

5:aaaa

6:bbbbb

7:144bgggg

8:4444shhh

9:123dddd22:

10:12223ddd

14:bbbbb

15:bbbbdb

16:abcdimooc

17:abcdeimooc

18:imoocabcsd

[root@aliyun247 test]# grep -n '[0-9$]' abc

7:144bgggg

8:4444shhh

9:123dddd22:

10:12223ddd

11:2123

 

 

^[^a-z]:   代表 非a-z 小写字母开头的行。

^[^a-zA-Z]: 代表 匹配不用字母开头的行。

 

 

 

1.5    基础正则表达式3

 \  ;取消特殊含义的字符

 

av\{2,3}\d

ac\{3}\x

v\{4,9}\d

 

正则是实验科学,需要多实验,这种模糊匹配加上 前后定界符比较准确。

 

 

[root@aliyun247 test]# grep "a\{2\}" abc

aa

aa

aaa

aaaa

[root@aliyun247 test]# grep "a\{2,4\}" abc

aa

aa

aaa

aaaa

[root@aliyun247 test]# grep "a\{1,4\}b" abc

abcdimooc

abcdeimooc

imoocabcsd

[root@aliyun247 test]# grep "a\{2,4\}b" abc

[root@aliyun247 test]# grep "b\{1\}" abc

bbbbb

144bgggg

bbbbb

bbbbdb

abcdimooc

abcdeimooc

imoocabcsd

[root@aliyun247 test]# grep "b\{1\}d" abc

bbbbdb

[root@aliyun247 test]# grep "b\{1,5\}d" abc

bbbbdb

[root@aliyun247 test]# grep "abc.i" abc

abcdimooc

[root@aliyun247 test]# grep "abc\.i" abc

 

 

 

2 字符截取命令

 

 

grep 命令 :在文件中提取符合条件的  行

grep  -v  [关键字]

#取反

 

 

 

[root@aliyun247 /]# grep "/bin/bash"  /etc/passwd 

root:x:0:0:root:/root:/bin/bash

nagios:x:500:500::/home/nagios:/bin/bash

dxm:x:501:501:dxm,bj,15801045721,15801045721:/home/dxm:/bin/bash

bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash

 

[root@aliyun247 /]# grep "/bin/bash"  /etc/passwd |   grep "root"

root:x:0:0:root:/root:/bin/bash

 

[root@aliyun247 /]# grep "/bin/bash"  /etc/passwd   |   grep -v  "root"

nagios:x:500:500::/home/nagios:/bin/bash

dxm:x:501:501:dxm,bj,15801045721,15801045721:/home/dxm:/bin/bash

bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash

[root@aliyun247 /]# 

 

 

 

 2.1 cut 命令

 

           cut  :列 提取命令  

 

          cut   [ 选项 ]   [文件名]

           

                    选项

 

                       -f  列号,提取第几列

                      -d 分隔符,按照指定分隔符 分割列

 

[root@aliyun247 /]# grep "/bin/bash"  /etc/passwd |grep -v  "root"    |cut  -f 1    -d ":"

nagios

dxm

bingbing

 

cut 失效了?????why ????

cut 命令比较简单  它适用于截取规则的文件    默认是制表符作为分隔符,如果文件中没有制表符,那么它把所有文件当成一列 内容。

 

[root@aliyun247 /]# df -h    |  cut   -f   1,3 

Filesystem      Size  Used Avail Use% Mounted on

/dev/xvda1       20G  7.0G   12G  38% /

tmpfs           7.8G     0  7.8G   0% /dev/shm

/dev/xvdb1      493G  4.0G  464G   1% /data

[root@aliyun247 /]# df -h |cut -f 1,3  -d " "

Filesystem 

/dev/xvda1 

tmpfs 

/dev/xvdb1 

  

 

 

2.2 printf 命令

  格式化 标准输出命令

 

  printf  ‘输出格式 输出类型’  输出内容

 

 输出类型: 

           

              %ns:输出字符串,n是数字 指代输出几个字符串

              %ni : 输出整数,n是数字 指代输出几个数字 

               %m.nf:输出浮点数,m和n是数字,指代输出的整数 位数和 小数位数。

        例如:%8.2f 代表共输出8位数字其中2位是小数 6位是整数。

 

 

输出格式:

 

  \a:输出警告音

  \b: 输出退格键,也就是backspace键

  \f: 清屏

  \n:换行

  \r: 回车

  \t :水平输出退格 也就是tab键

  \v: 垂直输出退格 也就是tab键

 

[root@aliyun247 ~]# printf %s 123456

123456[root@aliyun247 ~]# printf '%s\n' 123456

123456

[root@aliyun247 ~]# printf '%s\t'%s\t%s'\n' 123456

123456    t

[root@aliyun247 ~]# printf '%s\t%s\t%s\n' 123456

123456        

[root@aliyun247 ~]# printf '%s\t %s \t %s\n' 123456

123456           

[root@aliyun247 ~]# printf '%s\t%s\t%s\n'  1 2 3 4 5 6

1    2    3

4    5    6

 

 

 

 

 

 

 

 

 

 2.3 awk命令

 

awk ‘条件1{动作1}条件2{动作2}....’   文件名

 

条件(patern)

  一般使用关系表达式作为条件

   x>10  判断变量是否大于10

   x>=10  大于等于

   x<=10  小于等于

 

动作(action)

   格式化输出

   流程控制

 

 

 

[root@aliyun247 ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/xvda1       20G  7.1G   12G  38% /

tmpfs           7.8G     0  7.8G   0% /dev/shm

/dev/xvdb1      493G  4.0G  464G   1% /data

[root@aliyun247 ~]# df -h |awk '{print $2,$3}'

-bash: aw{print $2,$3}: command not found

[root@aliyun247 ~]# df -h |awk '{print $2,$3}'

Size Used

20G 7.1G

7.8G 0

493G 4.0G

[root@aliyun247 ~]# df -h|grep '/dev/sda5' | awk '{print $1,$2,$5}'

[root@aliyun247 ~]# df -h|grep "/dev/sda5" | awk '{print $1,$2,$5}'

[root@aliyun247 ~]# df -h|grep "/dev/xvda1" | awk '{print $1,$2,$5}'

/dev/xvda1 20G 38%

[root@aliyun247 ~]# df -h|grep "/dev/xvda1" |awk '{print $5}'|cut -d "%" -f 1

38

 

 

FS内置变量

 

BEGIN 用法:  

 

[root@aliyun247 ~]# grep  "/bin/bash" /etc/passwd |awk '{FS=":"}{print $1,$3}'

root:x:0:0:root:/root:/bin/bash 

nagios 500

dxm 501

bingbing 504

[root@aliyun247 ~]# grep  "/bin/bash" /etc/passwd |awk 'BEGIN{FS=":"}{print $1,$3}'

root 0

nagios 500

dxm 501

bingbing 504

 

 

END

 

 

关系运算符

 

 

 

 2.4    sed命令

 

   sed 是主要用来将数据进行选取,替换,删除,新增等命令。

 

  sed [选项] '动作' 文件名

 

选项

 

    -n  一般sed命令会把所有的数据输出到屏幕,如果经过此选项则只会把经过sed命令处理的行输出到屏幕。

     -e  容许对输入数据应用多条sed命令编辑。

     -i   用sed的修饰结果直接修改读取数据的文件,而不是由屏幕输出

 

 

动作

 

     -a  追加 在当前行后添加一行或多行

     -c  行替换,用c后面的字符替换原数据行

     -i  插入, 在当前行前 插入一行或多行。

     -d 删除 ,删除指定行

     -p  打印,输出指定的行

     -s  字符替换,用一个字符串替换另一个字符串。格式为“行范围s/旧字符/新字符/g”(和vim中替换格式类似)

 

 

 

p打印

[root@aliyun247 ~]# sed -n '3p' test/1.txt

roooooot

[root@aliyun247 ~]# sed -n '3,8p' test/1.txt

roooooot

roat

ro t

rtddddddddddddddddddddddddd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

[root@aliyun247 ~]# 

 

d 删除

 

sed  '2d' test/1.txt 

 

 

a 追加

[root@aliyun247 ~]# sed  '1a this is sed add' test/1.txt

 123455677,1324325,45434534,dgttg,vvgwefsf,sxx,

this is sed add

roooooooooasdvbt

roooooot

roat

bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash

 

这些操作 操作的是输出内容 而不是文件本身

 

 

[root@aliyun247 ~]# cat test/1.txt

 123455677,1324325,45434534,dgttg,vvgwefsf,sxx,

roooooooooasdvbt

roooooot

roat

bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash

 

i  插入

[root@aliyun247 ~]# sed  ' 1i  this is sed add '   test/1.txt

this is sed add

 123455677,1324325,45434534,dgttg,vvgwefsf,sxx,

roooooooooasdvbt

roooooot

roat

bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash

 

 

c  行替换

 

[root@aliyun247 ~]# sed  '2c  this is sed test c' test/1.txt

 123455677,1324325,45434534,dgttg,vvgwefsf,sxx,

this is sed test c

roooooot

roat

bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash

 

 

s  字符替换

 

 

[root@aliyun247 ~]# sed  '5s/bingbing/licheng/g' test/1.txt

 123455677,1324325,45434534,dgttg,vvgwefsf,sxx,

roooooooooasdvbt

roooooot

roat

licheng:x:504:889:bjbskf:/home/licheng:/bin/bash

 

[root@aliyun247 ~]# sed  's/o/f/g' test/1.txt

 123455677,1324325,45434534,dgttg,vvgwefsf,sxx,

rfffffffffasdvbt

rfffffft

rfat

bingbing:x:504:889:bjbskf:/hfme/bingbing:/bin/bash

 

[root@aliyun247 ~]# cat test/1.txt

 123455677,1324325,45434534,dgttg,vvgwefsf,sxx,

roooooooooasdvbt

roooooot

roat

bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash

 

操作的是数据输出,而不是文件本身

 

如果要操作文件本身 则加 -i

 

[root@aliyun247 ~]# sed  -i  's/o/f/g' test/1.txt

[root@aliyun247 ~]# cat test/1/txt

cat: test/1/txt: No such file or directory

[root@aliyun247 ~]# 

[root@aliyun247 ~]# cat test/1.txt

 123455677,1324325,45434534,dgttg,vvgwefsf,sxx,

rfffffffffasdvbt

rfffffft

rfat

bingbing:x:504:889:bjbskf:/hfme/bingbing:/bin/bash

 

 

3 字符处理命令

 

 

 

3.1sort 排序命令 

 

sort [选项] 文件名

 

选项

  -f  忽略大小写

  -n 以数值进行排序,默认使用字符串排序

  -r 取反

  -t  指定分割符,默认分隔符是制表符

  -k n[,m] :按照指定的字段范围 排序。从第n字段开始,到m字段结束,(默认到行尾)

 

 

[root@aliyun247 ~]# sort   /etc/passwd

abrt:x:173:173::/etc/abrt:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

dxm:x:501:501:dxm,bj,15801045721,15801045721:/home/dxm:/bin/bash

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

haldaemon:x:68:68:HAL daemon:/:/sbin/nologin

halt:x:7:0:halt:/sbin:/sbin/halt

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

mysql:x:27:27::/home/mysql:/sbin/nologin

nagios:x:500:500::/home/nagios:/bin/bash

nobody:x:99:99:Nobody:/:/sbin/nologin

nscd:x:28:28:NSCD Daemon:/:/sbin/nologin

ntp:x:38:38::/etc/ntp:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

root:x:0:0:root:/root:/bin/bash

saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

tcpdump:x:72:72::/:/sbin/nologin

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

[root@aliyun247 ~]# 

 

 

 

-r 取反

 

[root@aliyun247 ~]# sort -r  /etc/passwd

vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

tcpdump:x:72:72::/:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin

root:x:0:0:root:/root:/bin/bash

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

ntp:x:38:38::/etc/ntp:/sbin/nologin

nscd:x:28:28:NSCD Daemon:/:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

nagios:x:500:500::/home/nagios:/bin/bash

mysql:x:27:27::/home/mysql:/sbin/nologin

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

halt:x:7:0:halt:/sbin:/sbin/halt

haldaemon:x:68:68:HAL daemon:/:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

dxm:x:501:501:dxm,bj,15801045721,15801045721:/home/dxm:/bin/bash

dbus:x:81:81:System message bus:/:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

bin:x:1:1:bin:/bin:/sbin/nologin

bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash

adm:x:3:4:adm:/var/adm:/sbin/nologin

abrt:x:173:173::/etc/abrt:/sbin/nologin

 

 

 

-t 指定分割符

-k

[root@aliyun247 ~]# sort -t ":" -k "3,3" /etc/passwd

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

abrt:x:173:173::/etc/abrt:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin

mysql:x:27:27::/home/mysql:/sbin/nologin

nscd:x:28:28:NSCD Daemon:/:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

ntp:x:38:38::/etc/ntp:/sbin/nologin

lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin

sync:x:5:0:sync:/sbin:/bin/sync

nagios:x:500:500::/home/nagios:/bin/bash

dxm:x:501:501:dxm,bj,15801045721,15801045721:/home/dxm:/bin/bash

bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

haldaemon:x:68:68:HAL daemon:/:/sbin/nologin

vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

halt:x:7:0:halt:/sbin:/sbin/halt

tcpdump:x:72:72::/:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

 

 

 

-n  排序字段 按照 数字而不是字符处理

-k "3,3"  

 

 

[root@aliyun247 ~]# sort -n  -t ":" -k "3,3" /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

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

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

mysql:x:27:27::/home/mysql:/sbin/nologin

nscd:x:28:28:NSCD Daemon:/:/sbin/nologin

ntp:x:38:38::/etc/ntp:/sbin/nologin

haldaemon:x:68:68:HAL daemon:/:/sbin/nologin

vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

tcpdump:x:72:72::/:/sbin/nologin

sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

postfix:x:89:89::/var/spool/postfix:/sbin/nologin

nobody:x:99:99:Nobody:/:/sbin/nologin

abrt:x:173:173::/etc/abrt:/sbin/nologin

saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin

nagios:x:500:500::/home/nagios:/bin/bash

dxm:x:501:501:dxm,bj,15801045721,15801045721:/home/dxm:/bin/bash

bingbing:x:504:889:bjbskf:/home/bingbing:/bin/bash

 

3.2   wc 统计命令

 

 

wc [选项]  文件名

 

 

 选项

 

 -l 只统计行数

 -w  只统计单词数

 -m  只统计字符数

 

[root@aliyun247 ~]# wc /etc/passwd

  29   39 1297 /etc/passwd

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值