sed是Stream Editor(字符流编辑器的缩写),简称流编辑器
sed是操作、过滤和转换文本内容的强大工具。常用功能包括对文件实现快速增删改查,其中查询的功能中最常用的两大功能是过滤、取行。
sed [选项] [sed内置命令] [输入文件
-n #取消默认的sed输出,常与sed内置命令p连用
-i #输出方向从终端改到硬盘源文件
-e #允许多次编辑
-r #启用扩展正则表达式
a #append追加文本,在指定行后添加内容
i #insert插入文本,在指定行前添加内容
p #print,打印匹配行的内容,通常与选项-n连用
d #delete,表示删除匹配行的文本
c #匹配内容整行替换
s #取代,可以直接进行取代的工作
s/被取代/取代/gi
g #全局替换
i #被取代不区分大小写
准备练习的文档
[root@xiaowu ~]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 ./ip.txt
[root@xiaowu ~]# cat ip.txt
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=eth0
UUID=5203e6a7-733f-407b-85a2-6aa4ce21f7d5
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.15.200
PREFIX=24
GATEWAY=192.168.15.2
DNS1=223.5.5.5
DNS2=1.2.4.8
取ip.txt文件14-19行(-n取消默认输出,p打印匹配行的内容)
[root@xiaowu ~]# sed -n "14,19p" ip.txt
DNS1=223.5.5.5
DNS2=1.2.4.8
##为什么只有两行?因为一共就15行数据
取ip.txt文件14和19行(-n取消默认输出,p打印匹配行的内容)
[root@xiaowu ~]# sed -n "14p;1p" ip.txt
TYPE=Ethernet
DNS1=223.5.5.5
匹配ip.txt文件中含有IPA的行(-n取消默认输出,p打印匹配行的内容)
[root@xiaowu ~]# sed -n "/IPA/p" ip.txt
IPADDR=192.168.15.200
[root@xiaowu ~]# sed "/IPA/d" ip.txtTYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=noneDEFROUTE=yesIPV4_FAILURE_FATAL=noNAME=eth0UUID=5203e6a7-733f-407b-85a2-6aa4ce21f7d5DEVICE=eth0ONBOOT=yesPREFIX=24GATEWAY=192.168.15.2DNS1=223.5.5.5DNS2=1.2.4.8
[root@xiaowu ~]# sed '2d' ip.txtTYPE=EthernetBROWSER_ONLY=noBOOTPROTO=noneDEFROUTE=yesIPV4_FAILURE_FATAL=noNAME=eth0UUID=5203e6a7-733f-407b-85a2-6aa4ce21f7d5DEVICE=eth0ONBOOT=yesIPADDR=192.168.15.200PREFIX=24GATEWAY=192.168.15.2DNS1=223.5.5.5DNS2=1.2.4.8
[root@xiaowu ~]# sed '2,5d' ip.txtTYPE=EthernetIPV4_FAILURE_FATAL=noNAME=eth0UUID=5203e6a7-733f-407b-85a2-6aa4ce21f7d5DEVICE=eth0ONBOOT=yesIPADDR=192.168.15.200PREFIX=24GATEWAY=192.168.15.2DNS1=223.5.5.5DNS2=1.2.4.8
将IPADDR=192.168.15.200替换成IPADDR=192.168.15.201(s:取代 g:全局替换 )
[root@xiaowu ~]# sed "s#IPADDR=192.168.15.200#IPADDR=192.168.15.201#g" ip.txtTYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=noneDEFROUTE=yesIPV4_FAILURE_FATAL=noNAME=eth0UUID=5203e6a7-733f-407b-85a2-6aa4ce21f7d5DEVICE=eth0ONBOOT=yesIPADDR=192.168.15.201PREFIX=24GATEWAY=192.168.15.2DNS1=223.5.5.5DNS2=1.2.4.8
将第2行的none改成666(s:取代 g:全局替换 )
[root@xiaowu ~]# sed "2s#none#e666#g" ip.txtTYPE=EthernetPROXY_METHOD=e666BROWSER_ONLY=noBOOTPROTO=noneDEFROUTE=yesIPV4_FAILURE_FATAL=noNAME=eth0UUID=5203e6a7-733f-407b-85a2-6aa4ce21f7d5DEVICE=eth0ONBOOT=yesIPADDR=192.168.15.200PREFIX=24GATEWAY=192.168.15.2DNS1=223.5.5.5DNS2=1.2.4.8
sed -i "s#IPADDR=192.168.15.200#IPADDR=192.168.15.201#g" ip.txt
小声bb:在sed命令使用i选项前,最好先把命令进行测试
将含有none的行替换成123(c:匹配并整行替换)
sed "/none/c 123" ip.txt
[root@xiaowu ~]# sed "15a DNS3=114.114.114..14" ip.txtTYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=noneDEFROUTE=yesIPV4_FAILURE_FATAL=noNAME=eth0UUID=5203e6a7-733f-407b-85a2-6aa4ce21f7d5DEVICE=eth0ONBOOT=yesIPADDR=192.168.15.201PREFIX=24GATEWAY=192.168.15.2DNS1=223.5.5.5DNS2=1.2.4.8DNS3=114.114.114..14
[root@xiaowu ~]# sed "15i DNS0=5.5.5.5" ip.txtTYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=noneDEFROUTE=yesIPV4_FAILURE_FATAL=noNAME=eth0UUID=5203e6a7-733f-407b-85a2-6aa4ce21f7d5DEVICE=eth0ONBOOT=yesIPADDR=192.168.15.201PREFIX=24GATEWAY=192.168.15.2DNS1=223.5.5.5DNS0=5.5.5.5DNS2=1.2.4.8
[root@xiaowu ~]# sed "1i DNS2=223.5.5.5\nDNS3=223.6.6.6" ip.txtDNS2=223.5.5.5DNS3=223.6.6.6TYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=noneDEFROUTE=yesIPV4_FAILURE_FATAL=noNAME=eth0UUID=5203e6a7-733f-407b-85a2-6aa4ce21f7d5DEVICE=eth0ONBOOT=yesIPADDR=192.168.15.201PREFIX=24GATEWAY=192.168.15.2DNS1=223.5.5.5DNS2=1.2.4.8
[root@xiaowu ~]# sed -e "s#NAME#NAMES#g" -e "s#eth0#eth1#g" ip.txtTYPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=noneDEFROUTE=yesIPV4_FAILURE_FATAL=noNAMES=eth1UUID=5203e6a7-733f-407b-85a2-6aa4ce21f7d5DEVICE=eth1ONBOOT=yesIPADDR=192.168.15.201PREFIX=24GATEWAY=192.168.15.2DNS1=223.5.5.5DNS2=1.2.4.8
在处理庞大文件时不会出现内存溢出和处理缓慢的问题。awk对文件的处理过程,依次对每一行进行处理。
awk -F"=" 'NR==10 {print $2}' ip.txt 选项 条件 动作 文件
-F 指定分隔符 同时制定多个分隔符“[=,]”
$0 当前一整行的内容(满足条件后的所有列)$n 满足条件后的第n列NR 行号NF 以-F指定的分隔符分割的总段数&& 逻辑与|| 逻辑或! 逻辑非
条件表达式在使用中,字符比较时必须加“”,数字比较时不加“”
== 等于(精确匹配)!= 不等于> 大于< 小于>= 大于等于<= 小于等于// 匹配代码块//,// 范围匹配
[root@sholdboy ~]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 ./eth0.txt[root@sholdboy ~]# cat -n eth0.txt 1 TYPE=Ethernet 2 PROXY_METHOD=none 3 BROWSER_ONLY=no 4 BOOTPROTO=none 5 DEFROUTE=yes 6 IPV4_FAILURE_FATAL=no 7 NAME=eth0 8 UUID=5203e6a7-733f-407b-85a2-6aa4ce21f7d5 9 DEVICE=eth0 10 ONBOOT=yes 11 IPADDR=192.168.15.200 12 PREFIX=24 13 GATEWAY=192.168.15.2 14 DNS1=114.114.114.114 15 DNS2=1.2.4.8
[root@sholdboy ~]# awk 'NR==5' eth0.txtDEFROUTE=yes
[root@sholdboy ~]# awk 'NR==2,NR==6' eth0.txtPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=noneDEFROUTE=yesIPV4_FAILURE_FATAL=no
[root@sholdboy ~]# awk '{print NR,$0}' eth0.txt1 TYPE=Ethernet2 PROXY_METHOD=none3 BROWSER_ONLY=no4 BOOTPROTO=none5 DEFROUTE=yes6 IPV4_FAILURE_FATAL=no7 NAME=eth08 UUID=5203e6a7-733f-407b-85a2-6aa4ce21f7d59 DEVICE=eth010 ONBOOT=yes11 IPADDR=192.168.15.20012 PREFIX=2413 GATEWAY=192.168.15.214 DNS1=114.114.114.11415 DNS2=1.2.4.8
[root@sholdboy ~]# awk 'NR==2,NR==6 {print NR,$0}' eth0.txt2 PROXY_METHOD=none3 BROWSER_ONLY=no4 BOOTPROTO=none5 DEFROUTE=yes6 IPV4_FAILURE_FATAL=no
[root@sholdboy /etc]# awk -F ":" '{print $1,$3,$NF}' /etc/passwdroot 0 /bin/bashbin 1 /sbin/nologindaemon 2 /sbin/nologinadm 3 /sbin/nologinlp 4 /sbin/nologinsync 5 /bin/syncshutdown 6 /sbin/shutdownhalt 7 /sbin/haltmail 8 /sbin/nologinoperator 11 /sbin/nologingames 12 /sbin/nologinftp 14 /sbin/nologinnobody 99 /sbin/nologinsystemd-network 192 /sbin/nologindbus 81 /sbin/nologinpolkitd 999 /sbin/nologintss 59 /sbin/nologinabrt 173 /sbin/nologinsshd 74 /sbin/nologinpostfix 89 /sbin/nologinntp 38 /sbin/nologinmysql 1000 /bin/bashnginx 998 /sbin/nologinwww 666 /sbin/nologinapache 48 /sbin/nologin
正则表达式是一套适用于三剑客命令使用的具有特殊含义的符号。正则表达式分为:基础正则&扩展正则。
方便我们更快的实现对文本的增删改查。
1.正则表达式,是为了处理大量文本而产生的一整套规则。2.正则表达式处理以行为单位,一次处理一整行。3.使用正则可以提高效率4.Linux三剑客之一都支持正则
目前只是提及一下,学习shell编程是会详细讲正则和扩展正则
^ 以xx为开头来进行匹配。$ 以xx为结尾来进行匹配。^$ 匹配空行. 任意一个字符* 重复前一个字符0到多次.* 表示匹配所有内容\ 转义字符,让有意义的特殊符号变得没有意义(还原符号本事含义)^. 以任意字符开头的行$. 以任意字符结尾的行[] 匹配[]内任意一个字符[^] 括号内内容不匹配(取反)
grep是linux操作系统中最重要的命令之一,其功能是从文本文件或者管道数据流中帅选匹配的行及数据,如果再配合正则表达式一起使用,则功能更加强大。
grep [options] [pattern] [file]grep [参数] [匹配模式] [查找的文件]
-v 排除指定内容不显示-i 在匹配过程中不区分大小写-n 显示匹配内容在文件中的行号-o 只显示匹配内容(文件中满足条件的其余内容不显示)--color=auto 匹配内容高亮显示(红色)-E 使grep支持正则表达式(让grep可以解析具有特殊含义的字符) egrep ====== grep -E 缩写 简写-w 只匹配过滤的单词-c 统计匹配的行数
[root@sholdboy ~]# grep '^root' /etc/passwdroot:x:0:0:root:/root:/bin/bash
[root@sholdboy ~]# grep -n 'bash$' /etc/passwd1:root:x:0:0:root:/root:/bin/bash22:mysql:x:1000:1000::/home/mysql:/bin/bash
[root@sholdboy ~]# grep -nv "sbin" /etc/passwd1:root:x:0:0:root:/root:/bin/bash22:mysql:x:1000:1000::/home/mysql:/bin/bash
[root@sholdboy ~]# grep -c "sbin" /etc/passwd23
[root@sholdboy ~]# grep -o "root" /etc/passwdrootrootrootroot