grep,sed,awk与简单正则表达式应用#


这里使用的测试文件是linux /etc/passwd文件,最好是复制一份进行练习,方式对文件内容造成损坏。感觉还是要多练习才能很好的使用,习题这里就不贴了,网上一找一大把。


**grep: **   -o 用作计算出现多少次字段   -c 打印符合要求的行数   -n 在输出符合要求的行的同时也打印行号   -v 打印不符合要求的行   -A 后跟一个数字 ps -A2表示打印符合要求的行及下面两行   -B 后跟一个数字 ps -B2表示打印符合要求的行及上面两行   -C 后跟一个数字 ps -C2 表示打印符合要求的行及上下各两行   -r 会把目录下面的所有文件全部遍历

过滤出带有某个关键字的行并且输出行号 grep -n 'root' passwd
过滤出不带有某个关键字的行并且输出行号 grep -n -v 'root' passwd
过滤出所有包含数字的行并且输出行号 grep -n '[0-9]' passwd
过滤出所有不带有数字的行  grep -n -v '[0-9]' passwd
去除所有以#号开头的行:grep -n -v '^#' passwd
去除所有以#号和空行:grep -v '^#'|grep -v '^$'
过滤出以非数字开头的行 grep '^[^0-9]' 1.txt
过滤出所有以英文字母开头的行 grep '[a-zA-Z]' passwd
过滤任意一个或多个字符 grep 'r.o' passwd;grep 'r*t' passwd; grep 'r.*t' passwd


^一般表示开头,但是当在[^]时候会表示排除字符)
[^a]表示“匹配除了a的任意字符”。
[^a-zA-Z0-9]表示“找到一个非字母也非数字的字符”。
[\^abc]表示“找到一个插入符或者a或者b或者c”。
[^\^]表示“找到除了插入符外的任意字符。

* 0个或多个*前面的字符
. 任意一个字符(包括多个字符)
? 表示0个或一个?前面的字符
+ 表示一个或多个+前面的字符
.*表示任意字符不限制数量

注意:

+ ? | grep不支持(要使用-E选项),egrep才支持
(oo)* 0个或多个oo
(oo){1,2} 表示大于1次或2次

sed:(-n和p组合,其他不用)

打印指定行sed '10p' -n passwd; sed '1,4p' -n passwd; sed '5,$p'  -n 1.txt
打印包含某个字符串的行 sed -n '/root/p' passwd 可以使用^ . * $
-e 可以实现同时进行多个任务 sed -e '/root/p' -e '/body/p' -n passwd
也可以用;隔开 实现 sed '/root/p'; /body/p' -n passwd
删除行 sed ‘/root/d’  passwd; sed '1d' passwd; sed '1,10d' passwd
替换 sed '1,2s/ot/to/g' passwd 其中s是替换的意思,g是全局替换,否则只是替换一次,/也可以为#,@等
删除所有的数字 sed 's/[0-9]//g' passwd
删除所有的非数字 sed '/[^0-9]//g' passwd
调换2个字符串的位置 head -n2 passwd | sed 's/\(root\)\(.*\)\(bash\)/\3\2\1/'
直接修改文件内容 sed -i 's/ot/to/g' passwd
sed 's/[a-z]/\u&/g' passwd将小写字母全局转换为大写字母
sed 's/[A-Z]/\l&g' passwd 将大写字母全部转换为小写字母

awk:

截取文档中的某段 awk -F ':' '{print $1}' passwd
也可以使用自定义字符串连接每个段 awk -F ':' '{print $1"#"$2"#"$3"#"$4}' passwd
匹配字符或者字符串 awk '/oo/' passwd
针对某个段匹配 awk -F ':' '$1~/oo/' passwd
多次匹配 awk -F ':' '/root/ {print $1,$3};$1 ~/test/;$3 ~/20/' passwd
条件操作符: == > < != >= <= 
	awk -F ':' '$3==0' passwd
	awk -F ':' '$3>500' passwd
	awk -F ':' '$7!="/sbin/nologin"' passwd
	awk -F ':' '$3<$4' passwd
	awk -F ':' '$3>$5 && $3<$7' passwd
	awk -F ':' '$3>$4 || $7="/bin/bash"' passwd

awk内置变量 NF(段数) NR(行数)
	head -n3 1.txt | awk -F ':' '{print NF}'
	head -n3 1.txt | awk -F ':' '{print $NF}' 显示最后一段
	head -n3 1.txt | awk -F ':' '{print NR}' 显示行数
	打印20行之后的行 awk 'NR>20' passwd
	awk -F ':' 'NR>20 && $1~/ssh/' passwd
	更改某个字段的值awk -F ':' '$1="root"' passwd
	数学计算,把第三段和第四段的值相加,并且赋予第七段
		awk -F ':' '{$7=$3+$4;print $0}' passwd
	计算第三段的总和 awk -F ':' '{(tot=tot+$3)}; END {print tot}' passwd
	awk中也可以使用if关键词 awk -F ':' '{if($1=="root")print $0}' passwd