linux学习--grep与sed

蹉跎莫遣韶光老,人生唯有读书好。这篇文章主要讲述linux学习--grep与sed相关的知识,希望能为你提供帮助。
grep
作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查;打印匹配到的行
模式:由正则表达式字符及文本字符所编写的过滤条件
语法

grep [OPTIONS] PATTERN [FILE...]

选项
-color=auto 对匹配到的文本着色显示 -m# 匹配#次后停止 -v 显示不被pattern匹配到的行,即取反 -i 忽略字符大小写 -n 显示匹配的行号 -c 统计匹配的行数 -o 仅显示匹配到的字符串 -q 静默模式,不输出任何信息 -A # after, 后#行 -B # before, 前#行 -C # context, 前后各#行 -e 实现多个选项间的逻辑or关系,如:grep –e ‘cat-e ‘dog file -w 匹配整个单词 -E 使用ERE,相当于egrep -F 不支持正则表达式,相当于fgrep -f file 根据模式文件处理 -r递归目录,但不处理软链 -R递归目录,但处理软链接


[root@localhost AppStream]# [root@localhost date]# df | tr -s " " "%"|grep -E ^/dev/sd|cut -d% -f5|sort -nr|head -1#统计分区情况取出最大值 [root@centos8 ~]#ss -nt | grep "^ESTAB" |tr -s: |cut -d: -f6|sort |uniq - c|sort -nr|head -n3#统计链接最多得前三位地址 [root@centos8 ~]#ifconfig eth0 | grep -Eo ([0-9]{1,3}\\.){3}[0-9]{1,3}|head -1 10.0.0.8 [root@centos8 ~]#cat regex.txt ([0-9]{1,3}\\.){3}[0-9]{1,3} [root@centos8 ~]#ifconfig | grep -oEf regex.txt 10.0.0.8 255.255.255.0 10.0.0.255 127.0.0.1 255.0.0.0 [root@centos8 ~]#grep "^\\(.*\\)\\> .*\\< \\1$" /etc/passwd#匹配开头结尾相同 sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt bash:x:1008:1008::/home/bash:/bin/bash nologin:x:1011:1011::/home/nologin:/sbin/nologin [root@centos8 ~]#grep -E "^(.*)\\> .*\\< \\1$" /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt bash:x:1008:1008::/home/bash:/bin/bash nologin:x:1011:1011::/home/nologin:/sbin/nologin[root@localhost date]# cut -d"=" -f2 year.txt|tr \\n + | grep -Eo ".*[0-9]"|bc [root@localhost date]# grep -Eo "[0-9]+" year.txt | tr \\n + | grep -Eo ".*[0-9]"|bc#计算和

sed
sed与vi不同sed为行编辑器
sed从文件中按行读取、处理、输出直到最后,没处理一行就把当前处理得存储在临时缓冲区称为模式空间
语法
sed [option]... script; script; ... [inputfile...]

选项
-n 不输出模式空间内容到屏幕,即不自动打印 -e 多点编辑 -f FILE 从指定文件中读取编辑脚本 -r, -E 使用扩展正则表达式 -i.bak 备份文件并原处编辑#-i为直接编辑不显示到终端 -s将多个文件视为独立文件,而不是单个连续的长文件流 #说明: -ir 不支持 -i -r 支持 -ri支持 -ni会清空文件

script格式
1. 不给地址:对全文进行处理 2. 单地址: #:指定的行,$:最后一行 /pattern/:被此处模式所能够匹配到的每一行 3. 地址范围: #,##从#行到第#行,3,6 从第3行到第6行 #,+##从#行到+#行,3,+4 表示从3行到第7行 /pat1/,/pat2/ #,/pat/ /pat/,# 4. 步进:~ 1~2 奇数行 2~2 偶数行

命令
p 打印当前模式空间内容,追加到默认输出之后 Ip 忽略大小写输出 d 删除模式空间匹配的行,并立即启用下一轮循环 a [\\]text 在指定行后面追加文本,支持使用\\n实现多行追加 i [\\]text 在行前面插入文本 c [\\]text 替换行为单行或多行文本 w file 保存模式匹配的行至指定文件 r file 读取指定文件的文本至模式空间中匹配到的行后 = 为模式空间中的行打印行号 ! 模式空间中匹配行取反处理 q结束或退出sed

查找替代
s/pattern/string/修饰符 查找替换,支持使用其它分隔符,可以是其它形式:s@@@,s### 替换修饰符: g 行内全局替换 p 显示替换成功的行 w/PATH/FILE 将替换成功的行保存至文件中 I,i忽略大小写


[root@centos8 ~]#seq 10 | sed -n 3,$p#显示从第三行开始到最后 3 4 5 6 7 8 9 10 [root@centos8 ~]#seq 10 |sed -n 1~2p#显示从第一行开始步长为2得行(奇数行) 1 3 5 7 9 [root@centos8 ~]#seq 10 |sed -n 2~2p#显示从地二行开始步长为2得行(偶数行) 2 4 6 8 10 [root@centos8 ~]#seq 10 |sed1~2d#删除从第一行开始步长为2得行(显示偶数行) 2 4 6 8 10 [root@centos8 ~]#seq 10 |sed2~2d#删除从第二行开始步长为2得行(显示奇数行) 1 3 5 7 9 [root@centos8 ~]#sed -e 2d -e 4d seq.log#多行编辑删除第二行与第四行 1 3 5 6 7 8 9 10 [root@centos8 ~]#sed 2d; 4d seq.log#删除第二行和第四行 1 3 5 6 7 8 9 10 [root@localhost date]# cat a.txt 1 2 3[root@localhost date]# sed -i.bak 2d a.txt#备份 [root@localhost date]# ls a.txta.txt.bak [root@localhost date]# cat a.txt 1 3 [root@localhost date]# cat a.txt.bak 1 2 3 1 [root@localhost date]# df | sed -En /^\\/dev\\/sd/s@.* ([0-9]+)%.*@\\1@p #分区利用率 3 1 17 # 取IP地址 [root@localhost date]# ifconfig eth0 | sed -n 2s/^.*inet //p | sed -n s/netmask.*//p 192.168.1.44 [root@localhost date]# ifconfig eth0 | sed -rn 2s/(.*inet )([0-9].*)(netmask.*)/\\2/p 192.168.1.44 #去目录名 [root@centos8 ~]#echo /etc/sysconfig/ | sed -rn s#(.*)/([^/]+)/?#\\1#p /etc #取基名 [root@centos8 ~]#echo /etc/sysconfig/ | sed -rn s#(.*)/([^/]+)/?#\\2#p sysconfig [root@localhost conf]# sed-ri-e "s#^Listen 80#Listen 8080#"-e "s@^#(ServerName).*@\\1 `hostname`:8080@g" /etc/httpd/conf/httpd.conf #修改配置文件 #修改网卡名称 [root@centos8 ~]#sed -i /GRUB_CMDLINE_LINUX=/s#quiet#& net.ifnames=0# /etc/default/grub [root@centos8 ~]#sed -ri /^GRUB_CMDLINE_LINUX=/s@"$@ net.ifnames=0"@ /etc/default/grub [root@centos8 ~]#grub2-mkconfig -o /boot/grub2/grub.cfg #ubuntu [root@ubuntu ~]#grub-mkconfig -o /boot/grub/grub.cfg

练习
1、删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符
[root@centos8 ~]#sed-ri.bak s/^[[:blank:]]+//g /etc/grub2.cfg

2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
[root@localhost date]# sed -ri.bak s/^#[[:blank:]]+//g /etc/fstab

3、在centos6系统/root/install.log每一行行首增加#号
sed s/^Installing/#Installing/ /root/install.log

4、在/etc/fstab文件中不以#开头的行的行首增加#号
[root@localhost date]# sed -ri.bak s/^[^#](.*)/#\\1/g fstab [root@localhost date]# sed -r s/^([^#])/#\\1/g fstab

5、处理/etc/fstab路径,使用sed命令取出其目录名和基名
[root@localhost date]# echo /etc/fstab | sed -r s@^(/.*/)([^/].*/?)$@\\1@ /etc/ [root@localhost date]# echo /etc/fstab | sed -r s@^(/.*/)([^/].*/?)$@\\2@ fstab

6、利用sed 取出ifconfig命令中本机的IPv4地址
[root@localhost date]# ifconfig eth0 |sed -nr 2s#.*inet (([0-9]+\\.){3}[0-9]+).*#\\1#p [root@localhost date]# ifconfig eth0 | sed -rn 2s/(.*inet )([0-9].*)(netmask.*)/\\2/p

7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
[root@localhost Packages]# ls /date/AppStream/Packages/ | sed -rn s@^.*\\.(.*).rpm$@\\1@p|sort -nr|uniq -c 2825 x86_64 2196 noarch 949 i686

8、统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)
[root@localhost date]# grep -Eo [[:alpha:]]* functions | sort -nr | uniq -c |sort -nr [root@localhost date]# sed -re s/[^[:alpha:]]+/\\n/g functions| sort -nr |uniq -c | sort -nr

【linux学习--grep与sed】9、将文本文件的n和n+1行合并为一行,n为奇数行
[root@localhost date]# sed N; s/\\n// number.txt


    推荐阅读