grep 用法详解
选项:
--color=auto: 对匹配到的文本着色显示;
-v: 显示不能够被pattern匹配到的行;
-i: 忽略字符大小写;
-o: 仅显示匹配到的字符串;
-q: 静默模式,不输出任何信息;
-A #:after, 后#行
-B #: before, 前#行
-C #:context, 前后各#行
-E:使用ERE;
基本正则表达式元字符:
字符匹配:
. :匹配任意单个字符
[]:匹配指定范围内任意单个字符
[^]:匹配指定范围外的单个字符
[:digit:] [:alpha:] [:lower:] [:upper:] [:alnum:] [:punct:] [:space:]
次数匹配:
*:匹配前面的字符任意次 --正则表达式默认工作在贪婪模式
.*:匹配任意长度的任意字符
grep 'a.*y' test.txt
\?:匹配前面的字符0次或一次(前面的字符可有可无)
grep 'x\?y' test.txt
\+:匹配前面的字符至少一次
grep 'x\+y' test.txt
\{m\}:匹配前面的字符m次
\{m,n\}:匹配前面的字符m到n次
\{,m\}:匹配前面的字符至多m次
\{n,\}:匹配前面的字符至少n次
位置锚定:
^:行首锚定
^root
$:行尾锚定
root$
^$:空行
^[[:space:]]*$
\<:词首锚定
\>:词尾锚定
分组:
\(\):
\(xy\)\+ --匹配xy至少一次
后向引用:引用前面的分组括号中的模式所匹配到的字符,
\1 引用最外侧分组括号之间的模式;\2引用次外侧...\n 引用...
练习题:
1、显示/proc/meminfo文件中以大小s开头的行(要求使用2中方式)--考点--①-i 忽略大小写②[]匹配指定范围内的字符③^行首锚定
[root@db01 ~]# grep -i '^[s]' /proc/meminfo
SwapCached: 0 kB
SwapTotal: 4063228 kB
SwapFree: 4063228 kB
Shmem: 156288 kB
Slab: 167192 kB
SReclaimable: 121572 kB
SUnreclaim: 45620 kB
[root@db01 ~]# grep '^[Ss]' /proc/meminfo
SwapCached: 0 kB
SwapTotal: 4063228 kB
SwapFree: 4063228 kB
Shmem: 156288 kB
Slab: 167192 kB
SReclaimable: 121572 kB
SUnreclaim: 45620 kB
You have new mail in /var/spool/mail/root
[root@db01 ~]#
2、显示/et/passwd文件中不以/bin/bash结尾的行 --考点--①$锚定行尾 ②-v 匹配取反
[root@db01 ~]# grep -v '/bin/bash$' /etc/passwd
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
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
saslauth:x:998:76:Saslauthd user:/run/saslauthd:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
You have new mail in /var/spool/mail/root
3、显示/etc/passwd文件中ID号最大的用户的用户名--考点--①sort -t:以:分割;②-k3指定第3拦③-n按大小排序④tail -1显示最后一行⑤cut -d:用:切割⑥-f1表示第一列⑦⑧⑨
[root@db01 ~]# sort -t: -k3 -n /etc/passwd|tail -1|cut -d: -f1
chenxu
同理如果用sort -in反向排列,则如下代码输出相同结果
[root@db01 ~]# sort -rnk 3 -t: /etc/passwd|head -1|cut -d: -f1
chenxu
=============由于前面的内容没看,后续再更新后面的题目===============
4、如果root存在,显示其默认的shell程序
5、找出etc/passwd中的两位或3位数
6、显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存在非空白字符的行
7、找出“netstat -tan”命令的结果中以‘LISTEN’后跟0,1或多个空白字符结尾的行
8、添加用户 bash,basher,以及nologin(其shell为/sbin/nologin):而后找出/etc/passwd文件中用户名同shell名的行
选项:
--color=auto: 对匹配到的文本着色显示;
-v: 显示不能够被pattern匹配到的行;
-i: 忽略字符大小写;
-o: 仅显示匹配到的字符串;
-q: 静默模式,不输出任何信息;
-A #:after, 后#行
-B #: before, 前#行
-C #:context, 前后各#行
-E:使用ERE;
基本正则表达式元字符:
字符匹配:
. :匹配任意单个字符
[]:匹配指定范围内任意单个字符
[^]:匹配指定范围外的单个字符
[:digit:] [:alpha:] [:lower:] [:upper:] [:alnum:] [:punct:] [:space:]
次数匹配:
*:匹配前面的字符任意次 --正则表达式默认工作在贪婪模式
.*:匹配任意长度的任意字符
grep 'a.*y' test.txt
\?:匹配前面的字符0次或一次(前面的字符可有可无)
grep 'x\?y' test.txt
\+:匹配前面的字符至少一次
grep 'x\+y' test.txt
\{m\}:匹配前面的字符m次
\{m,n\}:匹配前面的字符m到n次
\{,m\}:匹配前面的字符至多m次
\{n,\}:匹配前面的字符至少n次
位置锚定:
^:行首锚定
^root
$:行尾锚定
root$
^$:空行
^[[:space:]]*$
\<:词首锚定
\>:词尾锚定
分组:
\(\):
\(xy\)\+ --匹配xy至少一次
后向引用:引用前面的分组括号中的模式所匹配到的字符,
\1 引用最外侧分组括号之间的模式;\2引用次外侧...\n 引用...
练习题:
1、显示/proc/meminfo文件中以大小s开头的行(要求使用2中方式)--考点--①-i 忽略大小写②[]匹配指定范围内的字符③^行首锚定
[root@db01 ~]# grep -i '^[s]' /proc/meminfo
SwapCached: 0 kB
SwapTotal: 4063228 kB
SwapFree: 4063228 kB
Shmem: 156288 kB
Slab: 167192 kB
SReclaimable: 121572 kB
SUnreclaim: 45620 kB
[root@db01 ~]# grep '^[Ss]' /proc/meminfo
SwapCached: 0 kB
SwapTotal: 4063228 kB
SwapFree: 4063228 kB
Shmem: 156288 kB
Slab: 167192 kB
SReclaimable: 121572 kB
SUnreclaim: 45620 kB
You have new mail in /var/spool/mail/root
[root@db01 ~]#
2、显示/et/passwd文件中不以/bin/bash结尾的行 --考点--①$锚定行尾 ②-v 匹配取反
[root@db01 ~]# grep -v '/bin/bash$' /etc/passwd
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
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
saslauth:x:998:76:Saslauthd user:/run/saslauthd:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
You have new mail in /var/spool/mail/root
3、显示/etc/passwd文件中ID号最大的用户的用户名--考点--①sort -t:以:分割;②-k3指定第3拦③-n按大小排序④tail -1显示最后一行⑤cut -d:用:切割⑥-f1表示第一列⑦⑧⑨
[root@db01 ~]# sort -t: -k3 -n /etc/passwd|tail -1|cut -d: -f1
chenxu
同理如果用sort -in反向排列,则如下代码输出相同结果
[root@db01 ~]# sort -rnk 3 -t: /etc/passwd|head -1|cut -d: -f1
chenxu
=============由于前面的内容没看,后续再更新后面的题目===============
4、如果root存在,显示其默认的shell程序
5、找出etc/passwd中的两位或3位数
6、显示/etc/rc.d/rc.sysinit文件中,至少以一个空白字符开头的且后面存在非空白字符的行
7、找出“netstat -tan”命令的结果中以‘LISTEN’后跟0,1或多个空白字符结尾的行
8、添加用户 bash,basher,以及nologin(其shell为/sbin/nologin):而后找出/etc/passwd文件中用户名同shell名的行