在专题一里面我们介绍了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
news
uucp
proxy
www-data
backup
list
irc
gnats
--EOF--
发表于 2018-10-09 14:32:00
,并被添加「linux、shell」标签。
本站使用「署名 4.0 国际」创作共享协议,转载请注明作者及原网址。更多说明 »
提醒:本文最后更新于 934 天前,文中所描述的信息可能已发生改变,请谨慎使用。