grep,sed,awk简单使用说明

来源:互联网 发布:软件编程工具 编辑:程序博客网 时间:2024/05/18 02:05

个人学习linux系统正则表达式,三个工具grep,sed,awk,记录下个人学习

 

grep使用

语法: grep [-cinvABC] ‘关键字文件名称

-c :打印符合要求的行数

-i :忽略大小写

-n :在输出符合要求的行的同时连同行号一起输出

-v :打印不符合要求的行

-A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行

-B :后跟一个数字,例如 –B2则表示打印符合要求的行以及上面两行

-C :后跟一个数字,例如 –C2则表示打印符合要求的行以及上下各两行

实例:

打印出文件passwd中包含关键字root的所有行:grep –n ‘root’ /etc/passwd

打印出文件passwd中不包含关键字root的所有行:grep –vn ‘root’ /etc/passwd

打印出文件passwd中所有包含数字的行:grep [0-9] /etc/passwd

打印出文件passwd中所有不包含数字的行:grep –v [0-9] /etc/passwdgrep [^0-9] /etc/passwd(注:[0-9]也可以是大小写字母[a-b][A-Z],所有数字字母就可以写成[0-9a-zA-Z])

打印出文件passwd中以r字符开头的行:grep ‘^r’ /etc/passwd

打印出文件passwd中以r字符结尾的行:grep ‘r$’ /etc/passwd

(注:在正则表达式中,”^”表示行的开始,”$”表示行的结尾,那么空行则表示”^$”,如果你只想筛选出非空行,则可以使用 “grep -v ‘^$’ filename”得到你想要的结果)

打印出文件passwd中包含以r开头以t结尾的行:grep‘r..t’ /etc/passwd或者grep ‘r*t’ /etc/passwd(注:“.”表示任意一个字符,上例中,就是把符合ro之间有两个任意字符的行过滤出来。“*”表示零个或多个前面的字符)

 

sed使用

上面grep中使用的特殊字符,如’^’, ‘$’, ‘.’, ‘*’等同样也能在sed中使用。

主要用法有:p表示打印;s表示替换;d表示删除;

-n选项打印行数,-i选项直接更改文件中的内容

实例:

打印出文件passwd中第n行:sed –n ‘n’p /etc/passwd

打印出文件passwd中所有行:sed –n ‘1,$’/etc/passwd

打印出文件passwd中包含root的行:sed –n ‘/root/’p /etc/passwd

删除文件passwd中第1行:sed1d /etc/passwd

删除文件passwd中第1到第3行:sed1,3d /etc/passwd

删除文件passwd中包含root的行:sed ‘/root/’d /etc/passwd

文件passwd中将root替换为toor:sed ‘s/root/toor/g’ /etc/passwd(注:上例中的’s’就是替换的命令,’g’为本行中全局替换,如果不加’g’,只换该行中出现的第一个。除了可以使用’/’外,还可以使用其他特殊字符例如’#’或者’@’都没有问题。)

文件passwd中将中’/sbin/nologin’替换为’/bin/login’ sed's#sbin/nologin#bin/login#g' /etc/passwd

文件passwd中将中’/sbin/nologin’替换为’/bin/login’,并且保存进文件:sed –i  's#sbin/nologin#bin/login#g' /etc/passwd, 由于这个命令可以直接把文件修改,所以在修改前最好先复制一下文件以免改错。

文件passwd中将每一行第一个单词和最后一个单词替换位置:sed's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)#\1\5\3\4\2#'/etc/passwd(注:用’()’把所想要替换的字符括起来成为一个整体,因为括号在sed中属于特殊符号,所以需要在前面加脱意字符’\’,替换时则写成’\1’, ‘\2’, ‘\3’ 的形式。除了调换两个字符串的位置外,笔者还常常用到在某一行前或者后增加指定内容。)

 

awk使用

awk工具语法与sed相似,但增加了很多运算符的使用比如’==’就是等于,也可以理解为精确匹配。另外也有’>’, ‘>=’, ‘<’, ‘<=’,‘!=’ 等等,值得注意的是,即使关键字为数字,awk也不会把它当数字看待,它会认为是一个字符。所以不要妄图去拿关键字当数字去和数字做比较

-F 选项的作用是指定分隔符,如果不加-F指定,则以空格或者tab为分隔符

$n表示分隔符分隔后一行中第n段,$0表示整行

print为打印的动作,用来打印出某个字段, print的动作要用’{ }’括起来,否则会报错。print还可以打印自定义的内容,但是自定义的内容要用双引号括起来。

常用awk的内置变量有:

NF :用分隔符分隔后一共有多少段;

NR :行数

实例:

文件passwd中查找所有包含’bash’的行:awk '/bash/' /etc/passwd

文件passwd中用’:’作为分隔符,查找第三段等于0的行:awk -F':''$3=="0"' /etc/passwd

文件passwd中打印行数大于20的所有行: awk -F':' 'NR>20' /etc/passwd

文件passwd中用’:’作为分隔符,查找第一段为’root’的行,并把该段的’root’换成’toor’: awk -F':' '$1=="root"' /etc/passwd |sed's/root/toor/'

文件passwd中用’:’作为分隔符,打印第一段以及最后一段,并且中间用’@’连接:awk-F':' '{print $1"@"$NF}' /etc/passwd

文件passwd中用’:’作为分隔符,把整个文档的第四段相加,求和: awk -F':''{(sum+=$4)}; END {print sum}' /etc/passwd

0 0
原创粉丝点击