linux基础(day26)

时间:2022-04-27
本文章向大家介绍linux基础(day26),主要内容包括9.1正则介绍_grep(上)、grep命令、9.2正则介绍_grep(中)、9.3正则介绍_grep(下)、特殊符号的总结、grep扩展、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

9.1正则介绍_grep(上)

正则介绍

  • 正则就是一串有规律的字符串
  • 掌握好正则对编写shell脚本帮助交大
  • 各种编程语言中都有正则,原理是一样的
  • grep/egrep、sed、awk

grep命令

  • grep命令,它是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
    • 格式:grep [-cinvABC] 'word' filename
    • -c 行数
    • -i 不区分大小写
    • -n 显示行号
    • -v 取反
    • -r 遍历所有子目录
    • -A 后面跟数字,过滤出符合要求的行以及 下面 n行
    • -B 同上,过滤出符合要求的行以及 上面 n行
    • -C 同上,过滤出符合要求的行以及 上下 各n行
[root@localhost ~]# mkdir grep
[root@localhost ~]# cd grep/
[root@localhost grep]# cp /etc/passwd .
[root@localhost grep]# ls
passwd
[root@localhost grep]# pwd
/root/grep
[root@localhost grep]# grep 'nologin' 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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
等等等,只截取了一部分
[root@localhost grep]# which grep
alias grep='grep --color=auto'
	/usr/bin/grep
  • grep命令在centos6中是不带颜色显示的
[root@localhost grep]# /usr/bin/grep 'nologin' 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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
等等等,只截取了一部分
[root@localhost grep]# 

grep命令的参数 -c

  • grep -c 显示行数
[root@localhost grep]# grep -c 'nologin' passwd
15
[root@localhost grep]# 

grep命令的参数 -n

  • grep -n 显示行号
[root@localhost grep]# grep -n 'nologin' passwd
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
等等等,只截取了一部分
会在最左侧绿色的数字显示行号

grep命令的参数 -i

  • grep -i 不区分大小写(grep命令是默认都是小写字母)
    • 就是在文件中的大写字母正常显示

grep命令的参数 -v

  • grep -v 取反
[root@localhost grep]# grep -nv 'nologin' passwd        //会显示除了nologin的那些行
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt

grep命令的参数 -r

  • grep -r 遍历所有子目录

例子

  • grep -r 'root' /etc/ 它匹配etc目录下,所有带root的文件
[root@localhost grep]# grep -r 'root' /etc/    //会匹配etc目录下所有带root的文件
/etc/pki/ca-trust/extracted/README:root CA certificates.
/etc/pki/ca-trust/extracted/java/README:root CA certificates.
/etc/pki/ca-trust/extracted/openssl/README:root CA certificates.
  • grep 'root' /etc 它会告诉你这是一个目录
[root@localhost grep]# grep 'root' /etc/
grep: /etc/: 是一个目录
[root@localhost grep]# 
  • grep 'root' /etc/passwd 针对文件做过滤
[root@localhost grep]# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost grep]# 

grep命令的参数 -A

  • grep -A 后面跟数字,过滤出符合要求的行以及下面n行
  • grep -A2 'root' passwd //过滤出passwd文件中的root行的下面两行
[root@localhost grep]# grep -A2 'root' 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
--
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
[root@localhost grep]# grep -nA2 'root' passwd    //显示passwd文件中的root行的下面两行,并显示行号
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost grep]# 

grep命令的参数 -B

  • grep -B 后面跟数字,过滤出符合要求的行以及 上面 n行
[root@localhost grep]# grep -nB2 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
--
8-halt:x:7:0:halt:/sbin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost grep]# 

grep命令的参数 -C

  • grep -C 后面跟数字,过滤出符合要求的行以及 上下 各n行
[root@localhost grep]# grep -nC2 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/nologin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
8-halt:x:7:0:halt:/sbin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost grep]# 

9.2正则介绍_grep(中)

grep用法

  • grep -n 'root' /etc/passwd
  • grep -nv 'nologin' /etc/passwd
  • grep '[0-9]'/etc/inittab
  • grep -v '[0-9]'/etc/inittab
  • grep -v '^#' inittab
  • grep -v '^#' /etc/inittab|grep -v '^$'
  • grep '^[^a-zA-Z]' test.txt
  • grep 'r.o' test.txt
  • grep 'oo*' test.txt
  • grep '.*' test.txt
  • grep 'o{2}' /etc/passwd
  • egrep 'o{2}' /etc/passwd
  • egrep 'o+' /etc/passwd
  • egrep 'oo?' /etc/passwd
  • egrep 'root|nologin' /etc/passwd
  • egrep '(oo){2}' /etc/passwd

grep命令 '[0-9]'

  • grep '[0-9]' passwd 表示数字,从0到9的数字
    • 这里的[] 方括号表示一个范围
[root@hf-01 grep]# grep '[0-9]' passwd        //过滤出所有带数字的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
mysql:x:1000:1000::/home/mysql:/bin/bash
等等,只截取了一部分
[root@hf-01 grep]# 

grep命令 -v '[0-9]'

  • grep -vn '[0-9]' /etc/passwd //列出所有不带数字的行
    • -n 表示显示行号
[root@hf-01 grep]# grep -v '[0-9]' /etc/passwd
[root@hf-01 grep]# 
  • 在vim编辑文件的时候,列出行号
    • 命令 /set nu //列出每一行的行号

grep命令 -v '^#'

  • grep -vn '^#' inittab //列出文件中所有不以 #号 开头的文件
    • -v 表示取反
    • ^# 表示以#号开头的文件
[root@hf-01 grep]# cp /etc/inittab ./        //不能直接改动,因为/etc/inittab是系统开机配置问件
[root@hf-01 grep]# vim inittab
[root@hf-01 grep]# grep -nv '^#' inittab
5:fadfdfasfas
7:113465142111
12:%$#@$#*&^$%$#

grep命令两次取反 -v

  • grep -v '^#' inittab |grep -v '^1' // 第一次列出不以#号 开头的文件,第二次列出不以数字1开头的文件
    • 不能在第一次取反的时候,加-n 参数显示行号
      • 因为在第一次取反后列出行号,在第二次取反后,会把第一次取反的行号也当做文件中的内容
      • 若是在第二次处加-n参数则是可以的
[root@hf-01 grep]# grep -v '^#' inittab|grep -v '^1'
fadfdfasfas
%$#@$#*&^$%$#
[root@hf-01 grep]# grep -v '^#' inittab|grep -v '^f'
113465142111
%$#@$#*&^$%$#
[root@hf-01 grep]# grep -v '^#' inittab|grep -v '^%'
fadfdfasfas
113465142111

在第一次取反 加入-n ,会把显示的行号默认成内容
[root@hf-01 grep]# grep -nv '^#' inittab|grep -nv '^1'
1:5:fadfdfasfas
2:7:113465142111
在第二次取反的时候,加-n参数,会看到显示的行号新的星号
这是因为第二次取反会把第一次取反后得出的结果,输入到第二次取反(默认是一个新文件)
[root@hf-01 grep]# grep -v '^#' inittab |grep -nv '^1'
1:fadfdfasfas
3:%$#@$#*&^$%$#
[root@hf-01 grep]# grep -v '^#' inittab|grep -nv '^%'
1:fadfdfasfas
2:113465142111
  • 取反总结:
  • 加 -n 参数 在两次(或多次)取反的时候,只能在最后一次取反加 -n 参数,因为取反的时候,会把列出的行号被默认成文件内容,所以取反的时候慎用 -n参数

grep命令 '^[^a-zA-Z]'

  • grep '[^0-9]' inittab //表示非0到9,只要不是数字,就都会匹配出来
    • 只要其中1个字符符合要求就会匹配出来
[root@hf-01 grep]# grep '[^0-9]' inittab
# inittab is no longer used when using systemd.
#
fadfdfasfas
# multi-user.target: analogous to runlevel 3
%$#@$#*&^$%$#
等等等,只截取了一部分
  • grep -v '[^0-9]' inittab //列出以数字开头的行
    • 分析:就是 [^0-9] 先列出非数字的开头的行,然后 -v 取反,列出数字开头的行
[root@hf-01 grep]# grep -v '[^0-9]' inittab
113465142111
  • grep '^[^a-zA-Z]' inittab 非数字的字符开头的行
[root@hf-01 grep]# grep '^[^0-9]' inittab
# inittab is no longer used when using systemd.
#
fadfdfasfas
# multi-user.target: analogous to runlevel 3
%$#@$#*&^$%$#
# graphical.target: analogous to runlevel 5
#
等等等,只截取了一部分
  • grep -nv '^[^0-9]' inittab 非数字的行列出,然后取反显示行号
[root@hf-01 grep]# grep -nv '^[^0-9]' inittab
7:113465142111
  • 总结: 符号 ^ 表示以什么什么开头
  • 若放在方括号里面去 [^0-9] 就表示这个方括号里面的反义,取非 的意思
  • 若^符号放在[] 方括号外面 ^[^0-9] 表示以什么什么开头

9.3正则介绍_grep(下)

grep用法

  • grep 'r.o' test.txt
  • grep 'oo*' test.txt
  • grep '.*' test.txt
  • grep 'o{2}' /etc/passwd
  • egrep 'o{2}' /etc/passwd
  • egrep 'o+' /etc/passwd
  • egrep 'oo?' /etc/passwd
  • egrep 'root|nologin' /etc/passwd
  • egrep '(oo){2}' /etc/passwd

grep命令 'r.o'

  • grep 'r.o' passwd 匹配出包含r 和o 的字符
    • 其中的 . 表示匹配任意的一个字符,只能是一个字符
    • 这个点可以是字符,英文字母,数字,特殊符号(包括 . )
[root@hf-01 grep]# grep 'r.o' passwd    //会匹配出包含ro的字符,其中的点表示任意一个字符
[root@hf-01 grep]# grep 'r.o' passwd
root:x:0:0:root:/root:/bin/bash
adas:124:bdsf:rto:pass
halt:x:7:0:halt:/r.o:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin

grep命令 'r*o'

  • grep 'h*n' passwd //表示匹配星号左边的h字符,重复0到N次
    • 星号* ,表示* 前面需要有一个字符 表示0个或多个*前面的字符 跟后面有啥没有关系
    • h* 可以是啥都没有啊(包括0个h)
    • h*n 只要有n就匹配
[root@localhost grep]# grep 'h*n' inittab
# inittab is no longer used when using systemd.
hhhhan
haaaaannnn
wannnnnnn
# Ctrl-Alt-Delete is handled by /etc/systemd/system/ctrl-alt-del.target
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
# To set a default target, run:
# ln -sf /lib/systemd/system/<target name>.target /etc/systemd/system/default.target
[root@hf-01 grep]# 

总结grep 'hn' passwd 过滤的时候,跟号前面的字符相关,可以是0个或多个,跟后面的字符没有什么关系,若是在一行中无 h 而有 n 也会匹配出来(这就表示0个h)

grep命令 '.*'

  • grep '.*' inittab // 会匹配任意个任意字符(包括空行)
    • 零个字符也可以匹配
  • 若想匹配某一行,则可以写成grep 'inittab.*' inittab
[root@localhost grep]# grep '# inittab.*' inittab
# inittab is no longer used when using systemd.

grep命令 'h{2}' 连续匹配两次h

  • grep 'h{2}' inittab //表示 h 连续出现两次匹配出来(只要是成对的 h 就都会匹配出来)
    • 表示脱义,若不加脱义符号,则无法匹配出来
[root@localhost grep]# grep 'h{2}' inittab
hhhhan
[root@localhost grep]# 
  • 在匹配的时候,加个范围'h{0,4}' 匹配0到 3次
  • grep 'h{0,4}' inittab //匹配
[root@localhost grep]# grep 'h{0,4}' inittab    //匹配文件中h出现0到4次的都会匹配出来
# inittab is no longer used when using systemd.
hhhhan
haaaaannnn
wannnnnnn
waaaaaal
# Ctrl-Alt-Delete is handled by /etc/systemd/system/ctrl-alt-del.target
#
等等等,只截取了一部分
  • 若不想加脱义符号,则可以使用
    • 方法一:grep -E 'h{2}' inittab 连续匹配h两次
    • 方法二:egrep 'h{2}' inittab 连续匹配h两次
[root@localhost grep]# grep -E 'h{2}' inittab
hhhhan

egrep命令 'h{2}' 连续匹配两次h

  • egrep 'h{2}' inittab 连续加匹配两次h
    • {}花括号表示前面的字符重复范围
[root@localhost grep]# egrep 'h{2}' inittab
hhhhan
[root@localhost grep]# 

grep命令 -E参数 '(hh){2}'

  • grep -E '(hh){2}' inittab //表示连续的hh出现两次匹配打印出来
[root@localhost grep]# grep -E '(hh){2}' inittab    //表示连续的hh出现两次匹配打印出来
hhhhan
  • 或者使用egrep命令
  • egrep '(hh){2}' inittab //表示连续的hh出现两次匹配打印出来
[root@localhost grep]# egrep '(hh){2}' inittab
hhhhan

grep -E等于egrep命令,若是在连续匹配字符的时候,不使用 grep -E或 egrep 命令,只使用grep命令,其中的符号则需要脱义。

grep命令 'h+h'

  • grep 'h+h' inittab
  • egrep 'h+h' inittab
    • +加号,表示加号前面的字符,一次或多次
      • 对比 号,区别是号是0次或多次
[root@localhost grep]# egrep 'h+h' inittab
hhhhan
[root@localhost grep]# egrep 'h+a' inittab
hhhhan
haaaaannnn
# Ctrl-Alt-Delete is handled by /etc/systemd/system/ctrl-alt-del.target
[root@localhost grep]# 

grep命令 'h?1f'

  • grep 'h?1f' inittab //匹配h和n字符,若h没有,则匹配1f字符
  • egrep 'h?1f' inittab
    • ?问号,表示?前面的字符重复次数为0或1
[root@localhost grep]# egrep 'h?1f' inittab    //匹配h和1f字符,若文件没有h字符,则匹配1f字符
h1f:gfdgfg
hghjhk:1f:hjjkuhhj
[root@localhost grep]# 

grep命令 'root|nologin'

  • grep 'h|1f' inittab //在文件中匹配出h或1f(可以同时出现h和1f)
  • egrep 'h|1f' inittab
    • | 竖线表示 或者 是意思
    • 可以连续匹配匹配,比如 egrep 'h|1f|use' inittab
    • 若想不区分大小写,则可以加 -i 参数
[root@localhost grep]# egrep 'h|1f' inittab
# inittab is no longer used when using systemd.
hhhhan
haaaaannnn
h1f:gfdgfg
hghjhk:1f:hjjkuhhj
# Ctrl-Alt-Delete is handled by /etc/systemd/system/ctrl-alt-del.target
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
# graphical.target: analogous to runlevel 5
[root@localhost grep]# 

特殊符号的总结

  • 小数点 . 表示任意一个任意字符
  • 星号 * 表示0个或多个星号*前面的字符
  • .* 表示通配,所有的都匹配,(不管是否有字符,都会匹配)
  • {} 一个范围,表示{}花括号前面的一个范围
  • +号,表示一个或或多个+号前面的字符
  • ?号,表示?问号前面0个或一个问号前面的字符
  • |竖线,表示或者

grep扩展

  • 扩展
  • 把一个目录下,过滤所有*.php文档中含有eval的行
  • grep -r --include="*.php" 'eval' /data/