linux正则表达式脚本实例,shell脚本专题二.正则表达式和文件操作

在专题一里面我们介绍了shell的基本语法和简单的案例.今天我们来稍微拔高一下,介绍shell的正则表达式和文件操作.

正则表达式

我们学习正则表达式是为了更好的操作文件.很多人看到正则表达式,甚至是听到都会觉得头疼,因为他没有规律可循,全靠死记硬背.其实我在工作中用到正则表达式的时候并不多,用到的时候搜一下资料就可以的,没有必要在这里死磕,在这里我们只介绍linux下常用的操作文件会用到的正则.

字符串类,就是一类字符的集合,用于匹配指定区间的数据.常用字符类如下:

表示

说明

\d

匹配数字,相当于[1-9]

\D

匹配非数字,相当于[^1-9]

\w

匹配数字,字母下划线,相当于[0-9a-zA-Z]

\W

匹配非数字,字母和下划线,相当于[^0-9a-zA-Z]

\s

匹配空白字符串(空格)

\S

匹配非空白字符串

.

匹配所有字符

数量限定符,限定指定字符串出现的次数,常用的限定符如下:

表示

说明

*

重复0到多次

+

重复1次到多次

?

重复0次到1次

{n}

匹配n次

{n,m}

匹配n到m次

{n,}

至少匹配n次

定位符,用来限制匹配数据的行首和行尾.

表示

说明

^ 数据

限定行首数据

$ 数据

限定行尾数据

文本操作

在工作中我们会经常要操作文本,下面将介绍一些常用的操作文件的指令.

grep,一种强大的文本搜索工具,可以结合正则表达式使用来查找我们关心的内容.下面将介绍他的用法.

语法:grep [参数] 要搜索的内容(正则) 要搜索的文件

参数介绍如下:

-c:只输出匹配行的计数。

-i:不区分大小写。

-h:查询多文件时不显示文件名。

-l:查询多文件时只输出包含匹配字符的文件名。

-n:显示匹配行及 行号。

-s:不显示不存在或无匹配文本的错误信息。

-v:显示不包含匹配文本的所有行。

--color=auto :可以将找到的关键词部分加上颜色的显示。

我们结合案例来练习一下:

案例1:匹配禁止登陆的用户

匹配禁止登陆的用户(高亮)

tab@tab:~/shell_workspace/regex$ grep 'nologin' /etc/passwd

daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

bin:x:2:2:bin:/bin:/usr/sbin/nologin

sys:x:3:3:sys:/dev:/usr/sbin/nologin

games:x:5:60:games:/usr/games:/usr/sbin/nologin

man:x:6:12:man:/var/cache/man:/usr/sbin/nologin

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

mail:x:8:8:mail:/var/mail:/usr/sbin/nologin

news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

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

proxy:x:13:13:proxy:/bin:/usr/sbin/nologin

www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

backup:x:34:34:backup:/var/backups:/usr/sbin/nologin

匹配禁止登陆的用户(高亮 + 行号 + 不区分大小写)

tab@tab:~/shell_workspace/regex$ grep -in 'nologin' /etc/passwd

2:daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

3:bin:x:2:2:bin:/bin:/usr/sbin/nologin

4:sys:x:3:3:sys:/dev:/usr/sbin/nologin

6:games:x:5:60:games:/usr/games:/usr/sbin/nologin

7:man:x:6:12:man:/var/cache/man:/usr/sbin/nologin

8:lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin

9:mail:x:8:8:mail:/var/mail:/usr/sbin/nologin

10:news:x:9:9:news:/var/spool/news:/usr/sbin/nologin

11:uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin

12:proxy:x:13:13:proxy:/bin:/usr/sbin/nologin

13:www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin

14:backup:x:34:34:backup:/var/backups:/usr/sbin/nologin

15:list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin

16:irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin

案例2:统计练习

统计禁止登陆用户个数

tab@tab:~/shell_workspace/regex$ grep -c nologin /etc/passwd

33

或者

tab@tab:~/shell_workspace/regex$ grep -in 'nologin' /etc/passwd | wc -l

33

统计正常登陆用户个数(多学一招:wc -l 路径及文件名 统计总行数)

tab@tab:~/shell_workspace/regex$ grep -in '/bin/bash' /etc/passwd | wc -l

3

案例3:正则练习

匹配用户编号在100-199之间的所有用户数据

tab@tab:~/shell_workspace/regex$ grep 'x:1[0-9]\{2\}:' /etc/passwd

systemd-network:x:100:102:systemd Network Management,,,:/run/systemd/netif:/usr/sbin/nologin

systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd/resolve:/usr/sbin/nologin

syslog:x:102:106::/home/syslog:/usr/sbin/nologin

messagebus:x:103:107::/nonexistent:/usr/sbin/nologin

_apt:x:104:65534::/nonexistent:/usr/sbin/nologin

uuidd:x:105:111::/run/uuidd:/usr/sbin/nologin

avahi-autoipd:x:106:112:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/usr/sbin/nologin

usbmux:x:107:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin

dnsmasq:x:108:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin

rtkit:x:109:114:RealtimeKit,,,:/proc:/usr/sbin/nologin

speech-dispatcher:x:110:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/false

whoopsie:x:111:117::/nonexistent:/bin/false

kernoops:x:112:65534:Kernel Oops Tracking Daemon,,,:/:/usr/sbin/nologin

saned:x:113:119::/var/lib/saned:/usr/sbin/nologin

pulse:x:114:120:PulseAudio daemon,,,:/var/run/pulse:/usr/sbin/nologin

avahi:x:115:122:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin

colord:x:116:123:colord colour management daemon,,,:/var/lib/colord:/usr/sbin/nologin

hplip:x:117:7:HPLIP system user,,,:/var/run/hplip:/bin/false

geoclue:x:118:124::/var/lib/geoclue:/usr/sbin/nologin

gnome-initial-setup:x:119:65534::/run/gnome-initial-setup/:/bin/false

gdm:x:120:125:Gnome Display Manager:/var/lib/gdm3:/bin/false

sshd:x:121:65534::/run/sshd:/usr/sbin/nologin

匹配用户含test的所有用户

tab@tab:~/shell_workspace/regex$ grep test /etc/passwd

testuser:x:1001:1001::/home/testuser:/bin/bash

grep亦可以用来匹配目录下面的文件内容

案例:找出当前目录下所有包含#! /bin/bash字符串的文件,这里使用的新语法是grep -r

tab@tab:~/shell_workspace/regex$ grep -rin '#! /bin/bash' ./

./a.txt:1:#! /bin/bash

./e.txt:1:#! /bin/bash

./b.txt:1:#! /bin/bash

./d.txt:1:#! /bin/bash

./c.txt:1:#! /bin/bash

sed,一种文本编辑工具,可以操作匹配到的行数据

语法:sed 参数 '规则' 路径和文件名

参数:

默认是-n,不修改源文件,打印修改的内容

-i,不打印,修改源文件

规则:

a append 追加 /旧数据/a \新数据 当前行追加文本(后面写入数据)

i insert 插入 /旧数据/i \新数据 当前行上面插入文本(前入)

d delete 删除 /旧数据/d

s replace 替换 s/旧数据/新数据/g 注:不写g则只处理每行匹配的第一个结果

案例演示:

#append

tab@tab:~/shell_workspace/regex$ sed '/test/a \testUpdate' passwd_cp

testuser:x:1001:1001::/home/testuser:/bin/bash

testUpdate

#insert

tab@tab:~/shell_workspace/regex$ sed '/test/i \testUpdate' passwd_cp

testUpdate

testuser:x:1001:1001::/home/testuser:/bin/bash

#replace

tab@tab:~/shell_workspace/regex$ sed 's/test/testUpdate/g' passwd_cp

testUpdateuser:x:1001:1001::/home/testUpdateuser:/bin/bash

注意:如果sed后面加上参数-i的话会修改源文件的内容.

awk,是一个文本报告生成器,作用是用来提取列的数据

语法说明:

语法:awk '条件{动作1},...,条件2{动作2}' 路径及文件名

说明:默认制表符分隔每列,更改{FS=“:”}

说明:文件扫描前进行的操作BEGIN{} 或 后面扫描后进行的操作END{}

案例1:输出当前系统所有进程的用户和pid列

tab@tab:~/shell_workspace/regex$ ps aux | awk '{print $1 "-" $2}'

tab-1757

tab-1778

tab-1856

tab-1861

root-1883

tab-1924

root-1930

tab-1971

root-2905

tab-2975

tab-2976

root-3259

案例2:输出/etc/passwd的第一列

#{FS=":"}修改默认的分隔符为`:`可以将每列分割开来

tab@tab:~/shell_workspace/regex$ awk '{FS=":"}{print $1}' /etc/passwd

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

daemon

bin

sys

sync

games

man

lp

mail

news

uucp

proxy

www-data

backup

list

irc

gnats

--EOF--

发表于 2018-10-09 14:32:00

,并被添加「linux、shell」标签。

本站使用「署名 4.0 国际」创作共享协议,转载请注明作者及原网址。更多说明 »

提醒:本文最后更新于 934 天前,文中所描述的信息可能已发生改变,请谨慎使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值