grep
- Linux上文本出来三剑客
- grep:文本过滤(模式:pattern)工具;
- grep ,egrep ,fgrep
- sed:stream,editor,文本编辑工具;
- awk:Linux上的实现gawk ,文本报告生成器;
-
grep:
Global search REgular expression and Print out the line
- 作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配搭配的行;
- 模式:由正则表达式字符及文本字符所编写的过滤条件;
- 正则表达式(REGEXP
):由一类特殊字符及文本字符所编写的模式,其中有些字符不表达字符字面意义,而表示控制或通配的功能;
- 正则表达式分两类
- 基本正则表达式;BRE
- 扩展正则表达式:ERE
- 这两类有些元字符式相同的有些是不相同的
- grep一般的时候只支持基本正则表达式的、
- 所以我们要用egrep或grep -E 他们才能支持扩展的正则表达式
- 而fgrep 不支持正则表达式
- 正则表达式引擎:
如grep ,sed,awk,他们都支持正则表达式
但是他们所匹配时候的算法也就式引擎各不相同
或者是有细微差别
-
grep使用格式
- grep [OPTIONS] PATTERN [FILE...]
-
选项:
- -- color=auto:对匹配到的文本着色显示;
- -v 显示不能够被pattern匹配到的行;
- -i 忽略字符大小写
- -o 仅显示匹配到的字符串
- -q 静默模式,不输出任何信息:(可以用echo $? 来查看)
- -A #:after,后#行
- -B #:before,前#行
- -C #:context ,前后各#行
- -E:使用(ERE)扩展正则表达式
基本正则表达式
字符匹配
.
:任意单个字符[ ]
:范围内的任意单个字符[^ ]
: 范围外的单个字符次数匹配
*
:任意长度的任意字符\?
:匹配其前面的字符0或1次:即前面的可有可无\+
: 匹配其前面的字符至少1次\{m\}
: 匹配前面的字符m次\{m.n\}
:匹配前面的字符至少m次,至多n次\{0,n\}
: 匹配前面的字符至多n次:可以没有\{m,\}
: 匹配前面的字符至少m次-
位置锚定
$
:锚定行尾:模式的最右侧^
:锚定行首:用于模式的最左侧^PATTERN$
: 用于模式匹配整行:^$
空行:\<,\b
:词首锚定:用于单词模式的左侧:-
\>,\b
:词尾锚定:用于单词的右侧
-\<PATTERN\>
: 匹配正则单词- 分组
\(\) :\(\)
将一个或多个字符捆绑在一起,当作一个整体进行处理,如:(root)+后向引用 \1,\2,\3......
后向引用:引用前面的分组括号中的模式所匹配字符,(而非模式本身)
NOte:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命令方式为:\1,\2,\3.......
\1:从左侧起,第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
如:(ab+(xy)*);
\1:ab+(xy)*
\2:xy
egrep及扩展的正则表达式
grep = grep -E
- grep [OPTIONS] PATTERN [FILE...]\
- 扩展正则表达式的元字符:
- 字符匹配:
-
.
:匹配单个字符 -
[ ]
:范围之外 -
[^]
:范围之内 - 次数匹配:
- *:
- ?:0或多次:
- {m}:匹配m次
- {m/n}:至少m,至多n次
- 锚定:
- ^ :锚定行首
- $:锚定行尾
- <,\b:词首锚定
- >,\b:词尾锚定
- 分组:
( )
后向引用:\1,\2,.......
或者:
a|b
c|cat: C或cat
练习:
1,显示当前系统root,centos或user1用户的默认shell和UID:
答案:grep -E "^(root|centos|user1)>" /etc/passwd|cut-d: -f1,3,7
2,找出/etc/rc.d/init.d/functions文件(centos6)中某单词后面跟一个小括号的行
答案“grep -E -o "[_[:alpha:]]+() /etc/rc.d/init.d/functiosns"
3,使用echo 输出一绝对路径,使用egrep取出其基名:
答案:echo "/mnt/sdc" | grep -E -o "[^/]+/?$|cut-d”/" -f1
4,找出ifconfig命令结果中1-255之间的数值:
5,找出ifconfig命令结果中的ip地址
bash的基础特性
变量类型:
数据存储格式,存储空间大小,参与运算种类:
字符型、
数值型
他们分为整型和浮点型
强类型:定义变量时必须指定类型,参与运算必须符合类型要求,调用未声明的变量会产生错误
弱类型 :无须指定类型,默认均为字符型:参与运算会自动进行隐式类型转换,变量无效事先定义可直接调用
bash就式弱类型的编程语言
bash中的变量种类:
根据变量的生效范围等标准:
本地变量:生效范围为当前shell进程,对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效
环境变量:生效范围为当前shell进程及子shell
局部变量:生效范围为当前shell进程中某代码片段(通常指函数)
位置变量:
$1
,$2
,........来表示,用于让脚本在脚本代码中调用通过命令行传递给他的参数特殊变量
$?
,$0``$*
,$#
,#@
pstree进程树
本地变量:
- 变量赋值:name=`value`
- 可以使用引用:
- value:
(1)可以式直接字符串:name="username"
(2)变量引用:name="$username"
(3)命令引用:name=COMMAND`,name=$(COMMAND)
- 变量引用:${name},或-$name
- " ":弱引用,其中的变量引用会被替换为变量值
- ·· :强引用,其中的变量引用不会被替换为变量值,而保持原字符串:
- 显示已定义的所有变量
set
命令 - 销毁变量
unset name
命令
环境变量
- 变量声明,赋值:
- export name=VALUE
- declare -x name=VALUE
- 变量引用:$name,${name}
- 显示所有环境变量:
- export
- env
- printenv
- 销毁:
- unset name
bash由许多内建的环境变量:PATH,SHELL,UID,HISTSIZE,HOME,PWD,OLD,PS1,HISTFILE
变量命名法则:
1,不能使用程序中的关键字或保留字:if ,for 等等
2,只能使用数字,字面及下划线,且不能以数字开头;
3,尽量做到见名知义,
- 只读变量:
- readonly name
- declare -r name
位置变量
- 位置变量主要在脚本代码中调用通过命令行传递给脚本的参数
-
$1
,$2
......对应调用第1.第2等参数:$0命令本身:shift[n] -
$*
:传递给脚本的所有参数当做一个字符串 -
$@
:传递给脚本的所有参数每一个参数当做一个独立的字符串 -
$#
:传递给脚本的参数的个数:
元字符 | 定义 |
---|---|
^ | 行首 |
$ | 行尾 |
. | 任意单一字符 |
[ ] | [ ]范围内的任意单一字符 |
[^ ] | 除[ ^] 内的任意单一字符 |
* | *前面字符重复不确定次数 |
+ | +前面字符重复一次以上不确定次数 |
? | ?前面字符重复0或1次 |
\ | 转义符 |
.* | 任意长度字符 |
{ n} | 前面字符重复n次 |
{n,} | 前面字符重复n次以上 |
元字符 | 定义 |
---|---|
[:alnum:] | 字母和数字 |
[:alpha:] | 代表任何英文大小写字符,亦即 A-Z, a-z |
[:lower:] | 小写字母 |
[:upper:] | 大写字母 |
[:blank:] | 水平空白字符(空格和制表符) |
[:space:] | 所有水平和垂直的空白字符(比[:blank:]包含的范围广) |
[:cntrl:] | 不可打印的控制字符(退格、删除、警铃...) |
[:digit:] | 十进制数字 |
[:graph:] | 可打印的非空白字符 |
[:print:] | 可打印字符 |
[:punct:] | 标点符号 |
[:xdigit:] | 十六进制数字 |