基于linux的shell文本处理三剑客{grep sed awk}

一:grep
1:grep
Global search regular expression and print out the line
全面搜索研究正则表达式并显示出来
grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模式”对目标文本进行匹配检查 , 打印匹配到的行,由正则表达式或者字符及基本文本字符所编写的过滤条件
2:grep 的格式
grep
                    匹配条件                  处理文件
例如
grep             root                         passwd              ####在passwd文件中检索含有root的行
grep            ^root                        passwd            ####在passwd文件中检索以root开头的行
grep            root$                        passwd            ####在passwd文件中检索以root结尾的行
grep -i          root                         passwd              ####-i为忽略大小写检索

grep -E      "root|ROOT"            passwd              ####-E 为扩展正则表达式####

#####在mnt里面写好实验用的文件


正规的 GREP 不支持扩展的正则表达式子 , 竖线是用于表示”或”的扩展正则表达式元字符 , 正规的 GREP 无法识别加上反斜杠 , 这个字符就被翻译成扩展正则表达式 , 就像 EGRP和GREP -E 一样

3:grep 中字符的匹配次数设定

###在mnt里面建立好实验所用文件

#######
*

字符出现 [0- 任意次 ]


?

字符出现 [0-1 次 ]


+

字符出现 [1- 任意次 ]


{n\}

字符出现 [n 次 ]


{m,n\}

字符出现 [ 最少出现 m 次,最多出现 n 次 ]


{0,n\}
字符出现 [0-n 次 ]
{m,\}
字符出现 [ 至少 m 次 ]
(xy\){n\}xy

关键字出现 [n 次 ]


.*

关键字之间匹配任意字符

4:grep 中字符的匹配位置设定

修改testfile文件内容


^ 关键字      #####匹配关键字在每一行的开头


关键字 $      #####。。。。。。。。。  结尾


\< 关键字     #####忽略关键字左边的内容


关键字 \>     #####。。。。。右边。。。


\< 关键字 \>  #####只匹配关键字

###############################################################################################


二:sed
1:sed行编辑器
stream editor
用来操作纯 ASCII 码的文本处理时 , 把当 前处理的行存储在临时缓冲区中 , 称为“模式空间” (pattern space) 可以指定仅仅处理哪些行
sed 符合模式条件的处理 不符合条件的不予处理处理完成之后把缓冲区的内容送往屏幕,接着处理下一行 , 这样不断重复 , 直到文件末尾

sed 对字符的处理
p显示
d删除
a添加
c替换
w写入
i插入

2:p 模式操作    ###显示操作

复制/etc/fstab到/mnt


sed     -n    '/\:/p' fstab            ###显示有“:”的行


sed    -n    '/UUID$/p' fstab    ###显示以UUID结尾的行

sed    -n    '/^UUID/p' fstab    ###显示以UUID开头的行


cat -n fstab | sed    -n    '2,6p'            ###显示fstab文件的2-6行


cat -n fstab | sed    -n    '2,6!p'        ###不显示fstab文件的2-6行



d 模式操作   ###删除操作

sed                '/^UUID/d'      fstab        ##删除以UUID开头的行


sed                '/^#/d'             fstab    ###删除以#开头的行


sed                '/^$/d'            fstab    ###删除fstab文件中的空白行(第一行)


sed                '1,4d'             fstab    ###删除1-4行



sed          '/^UUID/d'     fstab      ###删除以UUID开头的行


a 模式操作   ###添加操作(在指定行之后)

sed '/^UUID/ahello  fstab      ###在以UUID开头的行后添加hello



sed '/^UUID/ahello\nwestos‘  fstab       ####在以UUID开头的行后添加hello然后换行添加westos


i 模式操作   ###添加操作(在指定行之前)

sed '/^UUID/ihello'  fstab'     ###在以UUID开头的行之前添加hello


c 模式操作   ###替换操作    

sed '/^UUID/c\hello sed\nwestos /etc/fstab'     ###将以UUID开头的行替换为hello


w 模式操作        ###将输出写入文件

sed'/^UUID/w/tmp/fstab.txt'  fstab        ###将以UUID开头的行写入tmp/fstab.txtz中


sed-n'/^UUID/w /tmp/fstab.txt' /etc/fstab     ###屏蔽输出

sed'/^UUID/='/etc/fstab        ###给以UUID开头的行前面添加行号


sed'6r /etc/issue' /etc/fstab      ###将/etc/issue文件中的内容添加进fstab文件的第6行之后



sed 的其他用法

sed-n -e '/^UUID/p' -e '/^UUID/=' fstab    ###-e执行两步操作   显示以UUID开头的行并添加行号


sed-f rulesfile file

sed‘s/^\//#/'/etc/fstab            ###将以/开头的行替换成#
sed's@^/@#@g'/etc/fstab        ###@相当于/
sed's/\//#/'/etc/fstab            ###将/替换成#
sed's/\//#/g/'/etc/fstab            ###将全文的/替换成#
sed-e 's/brown/green/; s/dog/cat/' data        将brown替换成green并且将dog替换成cat


sed 的其他用法
sed'$!G' data       ####
sed'=' data | sed 'N; s/\n/ /'

sed-n '$p' data


############################################################################################


awk 报告生成器
awk 处理机制 :awk 会逐行处理文本 , 支持在处理第一行之前做一些准备工作 , 以及在处理完最后一行做一些总结性质的工作 , 在命令格式上分别体现如下 :
BEGIN{}: 读入第一行文本之前执行 , 一般用来初始化操作
{}: 逐行处理 , 逐行读入文本执行相应的处理 , 是最常见的编辑指令快

END{}: 处理完最后一行文本之后执行 , 一般用来输出处理结果

awk 基本用法       ##########-F为指定分隔符
linux 上面默认使用 gawk
awk '{print FILENAME}' passwd    
awk '{print 第 "NR" 行 , 有 "NF" 列 }'

awk 'BEGIN{print NAME}'                在文件的开头打印NAME

awk 'END{print WESTOS}'                在文件的结尾打印WESTOS
awk -F : 'BEGIN{print NAME}{print $1}END{WESTOS}'
awk '/bash$/'   ###打印以bash结尾的行

awk -F : '/bash$/{print $1}'      ####打印以bash结尾的行的第一列


awk 的基本用法
awk'BEGIN{a=34;print a+12}'        ###打印运算后的值
awk-F : '/^ro/{print}' /etc/passwd
awk-F : '/^[a-d]/{print $1,$6}' passwd.txt
awk-F : '/^a|nologin$/{print $1,$7}' passwd.txt
awk-F : '$6~/bin$/{print $1,$6}'
awk-F : '$7!~/nologin$/{print $1,$7}' passwd.txt





猜你喜欢

转载自blog.csdn.net/gd0306/article/details/80752653