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参数则是可以的
- 不能在第一次取反的时候,加-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/
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法