文本处理三剑客

文本处理三剑客

grep sed awk

sed是可以不打开文件进行增删改查,vim的缺点是打开文件会把文件加载到我们的内存中,占用我们的内存,sed不会把文件加载到内存当中。

要先观察格式

格式

sed 选项 sed命令 文件名

sed选项

-n 不输出模式空间里的内容

-e 执行多条sed命令

-r 使用拓展正则时用-r

-i 直接修改文件内容

sed命令

a 追加在指定行的下面

如何追加多行

sed ‘2i ok\nok1\nok3’ 文件名

c 取代指定行

d 删除,可以支持多行,比如1,3就是第一行和第三行

删除所有行

sed ‘d’ 文件名

i 插入在指定行的上面

p 输出指定内容c

一般结合-n使用,sed ‘/root/p’ –n /etc/passwd

! 取反,放在命令前面

sed用法总结

1.查找指定的字符串

例子:显示/etc/passwd中保含root的行(显示模式空间中的内容)

方法1:sed '/root/p' /etc/passwd

方法2:cat /etc/passwd | sed '/root/p'

 

2.在指定的位置做增删

例子:删除以root为开头的行

# sed '/^root/d' a.txt

例子:在包含root的行后添加一行 i am ken

# sed '/root/a i am ken' a.txt

 

3.按行替换

例子:将5到9行的内容替换为 i am ken

# sed '5,9c i am ken' a.txt

 

4.按照字符替换

例子:将/etc/selinux/config中的SELINUX=enforcing改成 disabled

写法1:# sed -i 's/SELINUX=disabled/SELINUX=enforcing/g' config

写法2:# sed -r -i 's/(SELINUX=)disabled/\1enforcing/g' config

 

5.查找指定的内容再做替换

例子:将以r开头的行中的oo替换为qq

# sed '/^r/{s/oo/qq/g}' passwd

 

6.多点编辑

例子:去除文件中的注释行和空白行

# grep -v -E "(^#)|(^$)" passwd.bak >passwd

# cat passwd.bak | sed -e '/^#/d' -e '/^$/d' >passwd

 

7.取反操作

显示非1-3行

# sed -n '1,3!p' passwd

 

awk不仅是系统命令,也是编程语言

格式

awk awk参数 ‘匹配的是什么东西{对这个东西做什么}’ file

常用参数只有一个 –F 指定分隔符

几个小概念

记录(record):一行就是一个记录

分隔符(field separator):进行对记录进行切割的时候所使用的字符

字段(field):将一条记录分割成的每一段

FILENAME:当前处理文件的文件名

FS(Field Separator):字段分隔符(默认是以空格为分隔符=)

NR(Number of Rrecord):记录的编号(awk每读取一行,NR就加1==)

NF(Number of Field):字段数量(记录了当前这条记录包含多少个字段==)

 

1. 结合内置变量,打印指定的几行,以及字段数量

例子;输出有多余5个字段的行的第三个字段

# cat a.sh | awk -F ":" 'NF>=5{print $3}'

例子:输出每行行号和该行有几个字段

# cat a.sh | awk -F ":" '{print NR,NF}'

例子:输出用户名,要求所有用户显示在同一行,而且用空格分隔

# cat mypwd | awk 'BEGIN{FS=":"; ORS=" "}{print $1}'

 

2. 结合正则来匹配一行或者某个字段

例子:输出用户名以s为开头的用户的uid

# cat mypwd | awk -F ":" '/^s/{print $}'

例子:输出第五个字段是以t为结尾的用户的姓名

# cat mypwd | awk -F ":" '$5~/t$/{print $1}'

 

3. 采用比较符号来进行打印指定的某些行

例子:实现仅仅输出3-5的内容,每行前面添加一个行号

# cat mypwd | awk 'NR>=3&&NR<=5{print NR,$1}'

# cat mypwd | awk 'NR==3,NR==5{print NR,$1}'

例子:实现仅仅输出3 和 5 和 7行的内容,每行前面添加一个行号

# cat mypwd | awk 'NR==3||NR==5||NR==7{print NR,$1}'

 

4. END

例子:统计mypwd中以#开头的行有多少行

# cat mypwd | awk 'BEGIN{n=0}/^#/{n+=1}END{print n}'

统计:mypwd中,以:为分隔符,字段数量在3-5的行的数目

# cat mypwd  | awk 'BEGIN{FS=":"}NF>=3&&NF<=5{n+=1}END{print n}'

 

5. ip

例子:统计IP

[root@ken]# cat url.txt | awk -F "/+" '{urls[$2]++}END{for(key in urls)print key, urls[key]}’

www.baidu.com 12

haha.baidu.com 1

ftp.baidu.com 6

mail.baidu.com 7

上一篇:使用sort,uniq去重并统计出现次数


下一篇:linux运维-基础命令