文本处理正则表达式
grep
文本过滤命令:全面搜索研究正则表达式并显示出来
grep 命令是一种强大的文本搜索工具 , 根据用户指定的“模式”对目标文本进行匹配检查 , 打印匹配到的行
由正则表达式或者字符及基本文本字符所编写的过滤条件
默认贪婪模式 ##有就能过滤出来
egrep = grep -E
扩展正则表达式
grep 正则表达式与扩展正则表达式
正规的grep不支持扩展的正则表达式子 , 竖线是用于表示”或”的扩展正则表达式元字符 , 正规的 grep 无法识别.
加上反斜杠 , 这个字符就被翻译成扩展正则表达式 , 就像 egrp 和 grep -E 一样
格式
grep 匹配条件 处理文件
grep root passwd ##过滤有root的选项
grep ^root passwd ##以root开头的选项
grep root$ passwd ##以root结尾的选项
grep -i "root" passwd ##忽略大小写查找有root的项
grep -E "root|ROOT" passwd
##扩展正则表达式;‘|‘或的关系root|ROOT都可以被过滤出来
grep root passwd -n2 ##过滤并显示这一行的上下各两行
字符的匹配次数设定
加在字符后面
'.'表示一个字符
* ##字符出现0-任意次
\? ##字符出现0-1次
\+ ##字符出现1-任意次
\{n\} ##字符出现n次
|{m,n\} ##字符出现最少出现m次,最多出现n次
\{0,n\} ##字符出现 0-n次
\{m,\} ##字符出现至少m次
\(xy\)\{n\}xy ##关键字出现n 次
.* ##关键字之间匹配任意字符
grep -E "x{1}y" file ##过滤x字符出现一次的项
grep -E "(xy){1,}" file ##过滤xy至少出现1次的项
字符的匹配位置设定
^ 关键字 ##开头
关键字 $ ##结尾
\< 关键字 ##只以这个单词开头
关键字 \> ##只以这个单词结尾
\< 关键字 \> ##只含这个单词
sed
行编辑器:stream editor
用来操作纯 ASCII 码的文本
缓存空间
处理时 , 把当前处理的行存储在临时缓冲区中 , 称为“模式空间” (pattern space) 可以指定仅仅处理哪些行
sed符合模式条件的处理,不符合条件的不予处理
处理完成之后把缓冲区的内容送往屏幕
接着处理下一行 , 这样不断重复 , 直到文件末尾
p ##多显示
-n p ##单显示
d ##不显示
!d = -n p
i ##上插入
a ##下添加
c ##剪切
w ##将某一行导入某文件
\ ##表示转译
eg: \/ ##将有特殊含义的/转译为普通的/
N ##提前加载文件中下一行到sed程序中
-i ##保存修改
p模式
显示
sed -n '/\:/p' file
sed -n '/xx$/p' file
sed -n '/^xx/p^' file
sed -n '2,6p' file ##显示2-6行
sed -n '2;6!p' file ##不显示2和6行
d模式
不显示
sed '/^xx/d' file ##xx开头的不显示
sed '1,4d' file
sed -n '/^xx/!d' file ##显示xx开头的行
a模式
sed '/^xx/a\xxxx' file ##在xx开头的行下添加一行xxxx
sed '/^xx/a\xxxx\nxxxx' file ##在xx开头的行下添加两行xxxx
i模式
sed '/^UUID/i\hello sed\nwestos' file ##在UUID开头的行下添加两行
c模式
change
sed '/^UUID/c\hello sed\nwestos' file ##将UUID开头的行换成\hello sed\nwestos两行内容
w模式
sed '/^xx/w /文件路径' file ##将xx开头的写入文件
sed -n '/^xx/w /文件路径' file
sed '/^xx/=' file ##在xx开头的行上方添加行号
sed '6r /文件路径' file ##将文件的第六行写入file文件
其他用法
sed -n '/^UUID/=' file
sed -n -e '/^UUID/p' -e '/^UUID/=' fstab
sed -e 's/brown/green/; s/dog/cat/' data
sed -f rulesfile file ##根据rulesfile的内容对文件做更改
sed 's/^\//#/'/etc/fstab ##把开头的/变成#
sed 's@^/@#@g'/etc/fstab
sed 's/\//#/'/etc/fstab ##把每一行的第一个/变成#
sed 's/\//#/g/'/etc/fstab ##全文的/变成#
sed 'G' data ##在每一行下方加空行
sed '$!G' data ##最后一行不加
sed '=' file | sed 'N; s/\n/ /' ##在文件每一行开头加行号
sed -n '$p' file ##查看最后一行
awk
linux 上面默认使用 gawk
awk 处理机制 :awk 会逐行处理文本 , 支持在处理第一行之前做一些准备工作 , 以及在处理完最后一行做一些总结性质的工作 , 在命令格式上分别体现如下 :
BEGIN{}: 读入第一行文本之前执行 , 一般用来初始化操作
{}: 逐行处理 , 逐行读入文本执行相应的处理 , 是最常见的编辑指令
快
END{}: 处理完最后一行文本之后执行 , 一般用来输出处理结果
用法
awk '{print FILENAME}' file ##打印文件名
awk '{print NR/NF}' file ##第NR行,有NF列
awk -F : '/^ro/{print}' /etc/passwd
awk -F : 'BEGIN{print "NAME"} {peint $1} END{print "END"}' ##:做分隔符打印第一部分,并在开头加上NAME,结尾加上END
awk -F : '/^[a-d]/{print $1,$6}' /etc/passwd
awk -F : '/^a|nologin$/{print $1,$7}' /etc/passwd
awk -F : '$6~/bin$/{print $1,$6}' /etc/passwd ##打印第六列是以bin结尾的行的1,6列
awk -F : '$7!~/nologin$/{print $1,$7}' /etc/passwd
awk -F : '{print $0}' ##打印所有,带分隔符:
awk -F : '{print $1="";print $0}' ##第一列为0,打印剩下的,不带分隔符
eg:
ifconfig etho | awk '/inet\>/{print $2}' ##抓取eth0网卡的ip