shell脚本之正则表达式、grep、sed、awk(2)

语法:sed '/正则匹配条件/s/old/new/g' 文件
sed 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-eth1 ##只是显示,不修改
sed -i 's/dhcp/static/g' /etc/sysconfig/network-scripts/ifcfg-eth1 ##只修改,不显示
sed -i 's/dhcp/static/g' ip ##将所有的dhcp替换为static
sed -i '/^IP1/s/static/dhcp/g' ip ##将IP1开头的行替换
sed -i '2s/static/dhcp/g' ip ##指定特定行号2行替换
cat -n /etc/selinux/config ##查看并显示行号
sed -i '7s/disabled/enforcing/g' /etc/selinux/config ##开启selinux

2.删:

语法:sed '/表达式/d' 文件
vim ip ##添加空行
sed '/^$/d' ip ##删除空行并显示在屏幕上
sed -i '/IP1/d' ip ##删除包含IP1的行
sed -i '/^IP2/d' ip ##删除以IP2开头的行
sed -i '2d' ip ##删除第二行

3.增:

语法:sed ' /表达式/a "需要添加的文字"' 文件
sed 'a IP3=static' ip ##每一行后都加上IP3=static
sed '3a IP3=static' ip ##只在第3行后加上IP3=static,并显示不修改
sed '3i IP3=static' ip ##只在第3行前加上IP3=static,显示不修改
sed -i '3a IP3=static' ip ##修改,不显示
sed -i '/^IP3/a "test add"' ip ##在以IP3开头的行后添加

4.查:

语法:sed -n '/表达式/p' 文件 sed -n '2p' /etc/hosts ##查看第二行 sed -n '/www/p' /var/named/chroot/var/named/linuxfan.cn.zone ##查看包含www的解析记录 sed -n '/.100$/p' /var/named/chroot/var/named/linuxfan.cn.zone ##查看以.100结尾的行 sed -n '2~2p' ip ##从第二行,每隔两行显示 ifconfig eth0|sed -n '2p'|sed 's#.*dr:##g'|sed 's# Bc.*##g' ##注:当sed命令处理的内容为多行内容,则以/作为表达式的分隔,若sed命令处理的内容为单行内容,作为截取的作用,以#号作为分隔符; 10.0.0.9 ifconfig eth0|sed -n '2p'|sed -r 's#(.*dr:)(.*)(Bc.*$)#\2#g' ##-r支持扩展正则,\2将2转义,打印出第二个范围(.*) 10.0.0.9 ifconfig eth0|sed -n '2p'|sed -r 's#.*dr:(.*) Bc.*$#\1#g' 10.0.0.9 ifconfig eth0|sed -nr '2s#^.*dr:(.*) Bc.*$#\1#gp' 10.0.0.9 ifconfig eth0|sed -nr '1s#^.*dr (.*)#\1#gp' 00:0C:29:33:C8:75 ifconfig eth0|sed -n '1p'|sed -r 's#(^.*dr )(.*)#\2#g' 00:0C:29:33:C8:75 ifconfig eth0|sed -n '1p'|sed 's#^.*dr ##g' 00:0C:29:33:C8:75 ifconfig eth0|sed -nr '1s#^.*t (.*) 00.*$#\1#gp' HWaddr stat /etc/hosts|sed -n '4p' Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) stat /etc/hosts|sed -n '4p'|sed 's#^.*ss: (##g'|sed 's#/-.*$##g' 0644 stat /etc/hosts|sed -n '4p'|sed -r 's#^.*s: \((.*)/-.*$#\1#g' 0644 stat /etc/hosts|sed -nr '4s#^.*s: \((.*)/-.*$#\1#gp' 0644 stat /etc/hosts|sed -nr '4s#(^.*s: \()(.*)(/-.*$)#\2#gp' 0644 --awk--

语法:
awk [选项] '模式{动作(action)}' 文件1 文件2 ...
选项: -F   指定输入分隔符,可以是字符串或正则表达式
常用动作: print、printf

chkconfig --list |grep 3:启用 |awk '{print $1}' tail -1 /etc/passwd |awk -F ':' 'BEGIN{OFS="---"}{print $1,$6,$7}' ##OFS指定输出分隔符 ifconfig eth1 |awk -F '[ :]+' 'NR==2 {print $4}' ifconfig eth1 |awk -F '[ :]+' 'NR==2 {print "eth1_ip="$4}' ##可以加入显示内容 awk 'BEGIN {print "line one \nline two\nline three"}'

匹配范围(ranges):指定的匹配范围,格式为part1,part2

awk -F : '$3==3,$3==10{print $1,$3,$7}' /etc/passwd awk -F : '$1=="root",$1=="adm"{print $1,$3,$7}' /etc/passwd awk -F : '/^r/,/^a/{print $1,$3,$7}' /etc/passwd

awk区块原理:

区域构成:

BEGIN { 动作 } ##开始处理第一行文本之前的操作
{ 动作 } ##针对每一行文本的处理操作
END { 动作 } ##处理完最后一行文本之后的操作
执行流程:
 首先执行 BEGIN { } 区块中的初始化操作;
 然后从指定的数据文件中循环读取一个数据行(自动更新 NF、 NR、 $0、 $1…… 等内建变量的值),并执行'模式或条件{ 动作 }';
 最后执行 END { } 区块中的后续处理操作。

案例:

awk -F : 'BEGIN{printf "%-10s%-10s%-20s\n","UserName","ID","Shell"}{printf "%-10s%-10s%-20s\n",$1,$3,$7}' /etc/passwd ##在awk处理之前打印头部BEGIN{}

ifconfig eth0 |awk -F':' 'NR==2{print $2,$4}'|awk 'BEGIN{OFS=" / "}{print "IP="$1,"MASK="$3}'

awk的变量:
awk变量:
FS:列分隔符,默认位空白
RS:行分隔符,默认位换行符
OFS:输出列分隔符
ORS :输出行分隔符
awk内置变量:
NR:处理中行数
FNR:单个文件的行数
NF:列的个数

案例:

ifconfig eth1 |awk '{print NR}' ifconfig eth1 |awk '{print NF}'


自定义变量案例:

awk 'BEGIN{test="www.linuxfan.cn";print test}' awk -v test="linuxfan.cn" 'BEGIN{print test}'

printf的使用:

格式:printf "格式",列表1,列表2 ...

特征:

a.必须指定format(格式),用于指定后面item(列表)的输出格式

b.printf语句不会自动打印换行符:\n

c.format格式以%加一个字符,如下:

%c:显示字符的ASCII码
%d,%i:十进制整数
%f:显示浮点数(小数)
%s:显示字符串
%u:无符号整数
%%:显示%

d.修饰符:N:显示宽度,-:左对齐,+:显示数值符号,如%-c(左对齐)

案例:

chkconfig --list |grep 3:启用 |awk '{printf "%-10s",$1}' ##在统一行显示
awk -F : '{printf "%-15s %-10d %-10s\n",$1,$3,$7}' /etc/passwd

awk的操作符:

算数操作符: x^y、x/y、x+y、x-y、x%y
比较操作符:>、<、>=、<=、==、!=
逻辑操作符:&&、||、!

awk常见的模式类型

正则表达式(regexp):awk -F : '/^u/{print $1}' /etc/passwd

表达式(expression):值位非0或位非空是满足条件,如$1 ~ /foo/或 $1 == "root"

案例:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjxpwf.html