您的位置:首页 > 运维架构 > Linux

文本处理 grep 与 sed

2015-12-27 01:53 501 查看
Linux上的三个强大的文本处理工具:

grep

sed

awk

首先说一下grep:
grep是文本过滤工具 可细分为

grep: 基本正则表达式

egrep: 支持扩展正则表达式

fgrep: 不支持正则表达式

grep通常用于搜索指定的文件或在文本中搜索指定的字串等 通常会与其命令一起使用

要搜索指定的文本 那必须得要有相应的搜索条件 所以 先介绍一下设置搜索条件的方法

grep的使用格式
grep [OPTIONS] PATTERN [FILE....]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...] ---可给定多个pattern或者从文件中读取实现准备好的pattern

grep的常用选项

--color=auto:着色 对搜索到的文本进行高亮显示
-i:ignorecase 不区分大小写 默认严格区分
-o:仅显示匹配到的字符串本身 -默认是显示该字符串所在的行
-v:显示匹配不到的行
-E:支持扩展的正则表达式元字符
-q:静默模式--不输出任何信息 不论有没有匹配到

-A #把所在行的下#行也显示
-B # #代表数字把所在到的上#行也显示
-C #前后各#行一起显示
建议 在/etc/profile.d/ 中写一个配置文件.给 grep --color=auto设置快捷方式


在使用的时候会很方便

在grep中经常会用到globbing(文件名通配)的方式
globbing中的匹配模式有:
[]匹配指定范围内的任意单个字符
有几种特殊模式:匹配一个
[a-z],[A-Z],[0,9],[a-z0-9],[abcxyz]
错误用法:[10-99] 不能这么用.查询不到10-99的结果.因为即使是数字格式 存储类型 还是字符串 所以无法数字的大小范围来查找
[[:upper:]]:所有大写字母 外层中括号是匹配范围 内部中括号是格式
[[:lower:]]:所有小写字母
[[:alpha:]]:所有字母
[[:digit:]]:所有数字
[[:alnum:]]:所有的字母和数字
[[:space:]]:空白字符
[[:punct:]]:所有标点符号
[^]:匹配指定范围外的任意单个字符
[^[:upper:]]:非大写字母
[^0-9]:0-9之外的单个字符

基本正则表达式元字符:注: 空白包含space及tab
字符匹配:
.: 匹配任意单个字符例:grep "r..t" /etc/passwd
[]: 匹配指定范围内的任意单个字符
[^]: 匹配指定范围外的任意单个字符
匹配次数: 用在要制定其出现的次数的字符的后面,限制其前面的字符出现的次数
*: 匹配其前面的字符任意次
.*: 匹配任意长度的任意字符
\?: 匹配其前面的字符0此或1次
\+: 匹配其前面的字符1次或多次
\{m\} : 匹配其前面字符m次
\{m,n\ }: 匹配其前面字符至少m次,至多n此
\{0,n\}\{m,\}

位置锚定:制定出现位置和只能是某个完全的单词
^:行首用于模式左侧 如 ^root
$:行尾用于模式右侧如 root$
单词:非特殊字符组成的连续字符(字符串)
\<或\b : 词首锚定用词单词模式的左侧:\<root
\>或\b : 词尾锚定用于单词模式的右侧root\>

分组及引用:
\(\): 将一个或多个字符捆绑在一起.当作一个整体进行处理 \转义符的作用
分组括号中的模式匹配到的内容会被正则表达式引擎自动记录与内部的变量中,这 些变量为

\1: 记录模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到结果
\2:
\3:
...

egrep 扩展正则表达式:
与基本grep基本正则表达式的区别就是 不用\转义符以及多了个 (| 或条件)
a|b :a 或b
注意: C|cat: C或cat
(c|C)at: cat或Cat

fgrep:不支持正则表达式元字符
当无需要用到元字符去编辑模式时,使用fgrep必能更好

一些grep的常见小应用:

^$: 空白行--什么都不能有包括空格
^[[:space:]]*$空白或包含空白字符的行
一些练习:
在一个自定义的文本中寻找以1开头 并且以1结束的字符 grep "^1.*1$"

寻找/etc/passwd中所有用户的UID

grep -o ":[[:digit:]]\{1,5\}:" /etc/passwd | grep "[[:digit:]]\{1,5\}"
grep通常会与 | 管道组合一起使用

ls /media/Packages | grep "^php"




在ifconfig中寻找ip地址

ifconfig | egrep -o "addr:(([[:digit:]]{1,3}).){3}([[:digit:]]){1,3}" | grep -v "127.0.0.1"
遇见的错误:
分组引用时 引用的是对查询结果的引用 而不是查询格式的引用 所以以下命令匹配不到

ifconfig | egrep "addr:(([[:digit:]]{1,3}).){3}\1"


===========================================================================================
sed 行编辑器 每次从文件中读取一行 复制出来 放在自己的专用空间



sed [options]...'script' file

常用选项:
-n : 不输出模式空间中的内容至标准输出
-e script: --expression=script -e script -e script
f /path/to/sed_script_file 从脚本文件中读取数据 每行一个命令
-r : 支持使用扩展正则表达式 默认是支持普通正则表达式
i[SUFFIX],--in-place[=suffix] : 直接编辑源文件 危险操作
sed在默认情况下不会对源文件进行直接操作

地址定界:
(1) 空地址--不给地址;对全文进行处理
(2) 单地址
#: 指定行
/pattern/ : 被此模式匹配到的每一行
(3) 地址范围:
#,#:
#,+5#: 第#开始一空+#行 包括第#行
# ,/pat1/: 从指定行还是到第一次被条件匹配到的行
/par1/,/pat2/ 第一次配匹配到条件1开始到第一次配条件2匹配到的行之间
$: 最后一行
(4) 步进地址:~
1~2: 1 3 5 7 9 行
常用编辑命令:
d : 删除
p : 显示模式空间中的内容 没有-n时 因为模式空间本来就默认输出 加上p 就再显示一遍
行首行尾为数字中间不是数字的行


a \text : 在匹配到的行后面追加文本text 支持使用\n能实现多行追加
i \text : 在匹配到的行前面插入文本text 支持使用\n能实现多行插入
c \test : 替换匹配到的行 支持使用\n能实现多行插入



w /path/to/somefile : 匹配到的行保持到指定文件中
r /PATH/FROM/SOMEFILE : 读取指定文件中的内容到当前模式匹配到的位置 文件合并
= : 为模式匹配到的行加入行号



注意: 在加入-n选项时 只会显示模式所匹配到的行 并不显示相应行的内容

如果只对匹配到的行进行输出并且显示内容的时候就需要使用-e选项



! : 取反

sed -n '2! command'
对不是第二行的进行相关操作

s///: 查找替换 其分隔符可自行制定 s@@@ s### s@查找内容@替换内容@



默认情况下只对第一个匹配到的进行替换.之后的不会替换
g: 全局替换



w /path/to/somefile 替换成功的结果保存至指定文件
我遇到过的问题: 在sed语法中条件之后必须要跟一个编辑命令,而sed的默认处理为标准输出,
刚开始我感觉这两句话有点矛盾.之后想明白 此处指的默认处理标准输出的意义为 在使用例如替换命令的时候就选后面不跟p选项也会进行默认输出. 如果你也有这种疑惑可以看看.没有的话就当我的语文白学了.
高级编辑命令: --感觉是个很鸡肋的功能 有其他更方便的命令可以使用
有点类似于数据结构中堆 栈 :

h: 把模式空间中的内容覆盖至保持空间中
H: 把模式空间中的内容追加至保持空间中
g: 把保持空间中的内容覆盖至模式空间中
G: 把保持空间中的内容追加至模式空间中
x: 把模式空间中的内容与保持空间中的内容互换
n: 覆盖读取匹配到的行的下一行至模式空间中
N: 追加读取匹配到的行的下一行至模式空间中
d: 删除模式空间中的行
D: 删除多行模式空间中的所有行
使用练习:
由于在sed中会默认把不匹配的内容也标准输出 .所以通常会使用 -n 选项.否则条件筛选就配

除了是删除操作之外一般会和-n选项一起使用

并没有什么实际用处的技巧:

sed -n 'n;p' FILE 显示偶数行 第一行读取以后读取第三行了
sed '1!G;h;$!d' FILE 逆序显示文件内容 数据结构中的栈
sed '$!d' FILE 取出最后一行
sed '$!N;$!D' FILE 保留文件后两行
sed '/^$d;G' FILE 删除原有的所有空白行 为所有的非空白行添加一个空白 -因为保持空间中 是什么都没有 所以加入的就是空白行
sed 'n;d' FILE 显示奇数行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息