Sed、Awk实用正则替换

2 篇文章 0 订阅

1、cat application-test.properties

spring.datasource.ip.map.driverClassName=com.mysql.jdbc.Driver
spring.datasource.ip.map.url=jdbc:mysql://192.168.12.22:3306/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull
spring.datasource.ip.map.username=root
spring.datasource.ip.map.password=123456

需要将文件中这行

spring.datasource.ip.map.url=jdbc:mysql://10.2.11.22:3306/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull

替换为

spring.datasource.ip.map.url=jdbc:mysql://10.5.45.134:3306/yukw?useUnicode=true&characterEncoding=utf-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull

sed替换语句

sed -i '/spring.datasource.url/s/[0-9]\{1,3\}.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}:[0-9]\{1,4\}\/.*?/10.5.45.134:3306\/yukw?/g' application-production.properties

2、cat database.php

................... 略 .......................

return [
// 数据库类型
'type'            => 'mysql',
// 服务器地址
'hostname'        => '192.168.35.101',
// 数据库名
'database'        => 'wxfat',
// 用户名
'username'        => 'wxfat',
// 密码
'password'        => 'test_wxfat',
// 端口
'hostport'        => '3306',
// 连接dsn
'dsn'             => '',

................... 略 .......................

将文件中 database对应的用户名 wxfat 修改为 yukw

$ sed -rn "s#('database'[ ]*=>)(.*$)#\1 'yukw',#gp" database.php 
'database'        => 'yukw',

3、awk 

简写实际功能
i++i=i+1 统计次数,计数
sum=sum+?? sum+=??? 求和,累加


需求:
1、统计aa.txt中 www.baidu.com、aa.baidu.com、bb.baidu.com三个域名分别出现的次数
分析:
2、实际上是统计www、aa、bb出现的次数

$ cat aa.txt 
http://www.baidu.com/index.html
http://aa.baidu.com/index.html
http://www.baidu.com/index.html
http://www.baidu.com/index.html
http://aa.baidu.com/index.html
http://www.baidu.com/index.html
http://bb.baidu.com/index.html
$ awk -F'[/.]+' '{array[$2]++}END{for (i in array) print i,array[i]}' aa.txt | sort -rnk2
www 4
aa 2
bb 1

sort为排序
-r 倒叙  n根据数字   -k2 表述根据第二列

awk的 for (i in array)  这种循环模式只用于数组,还有另外一种循环模式,在第四种可以看到
for(i=1;i<101;i++)
## array[ ]++ 你要统计什么 [ ]里面就是什么(某一列)
## 比如统计nginx access.log中ip出现的次数,就是 array[$1]++

四、求和

$ awk 'BEGIN{for(i=1;i<101;i++) sum+=i;print sum}'
5050

注意:awk使用多个条件的时候,第1个条件可以放在 '条件{动作}' 第二个条件 一般使用if

五、替换匹配行的下一行

处理办法:
先匹配到 NsyConfig行,然后替换下一行的内容 

sed -i '/NsyConfig/{n;s/"Domain".*$/"Domain": "https:\/\/www.baidu.com",/g;}' applicationconfig.json


## 自己研究的
[root@ZS-Jenkins02 resources]# sed -rn '/master/,+3p' application-test.yml 
          master:
            url: jdbc:mysql://127.0.0.1:3306/education?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
            username: root
            password: 'we@tencent'
[root@ZS-Jenkins02 resources]# sed -rn '/master/,+3s/username.*$/username: root/p' application-test.yml 
            username: root
[root@ZS-Jenkins02 resources]# sed -rn '/master/,+3s/password.*$/password: yukw.com/p' application-test.yml 
            password: yukw.com

六、竖线 |

竖线在中括号[]中没有 或 的意思,在小括号()中有

七、对日志常用的统计、求和、判断

查询mongodb日志 时间大于3000ms的语句
awk '$NF~/ms$/{print $NF, $0}' shard32.log | awk -F'm' '{if($1 > 3000) print $0}'

$ awk '$NF~/ms$/{print $NF, $0}' shard32.log | awk -F'm' '{if($1 > 5000) print $0}' | wc -l
53

$ awk '$NF~/ms$/{print $NF, $0}' shard32.log | awk -F'm' '{if($1 > 5000) print $0}' | sed -n '$='
53


统计nginx访问流量,利用awk求和
awk '{sum+=$10}END{print sum}' access.log

统计nginx访问日志中 每个ip的访问次数
awk '{array[$1]++}END{for(i in array)print i,array[i]}' access.log | sort -rnk2

统计nginx访问日志中 每个ip的访问次数,再加上过滤条件
awk '$1~/^103/{array[$1]++}END{for(i in array)print i,array[i]}' access.log | sort -rnk2 | column -t

 八、查看长度小于6的单词

# echo "i am oldboy teacher welcome to oldboy training class." | awk -F'[. ]+' '{for(i=1;i<=NF;i++)print $i}'
i
am
oldboy
teacher
welcome
to
oldboy
training
class

# echo "i am oldboy teacher welcome to oldboy training class." | awk -F'[. ]+' '{for(i=1;i<=NF;i++)if (length($i)<6) print $i}'
i
am
to
class


附加知识:

cat -A  显示文件中隐藏的标记
grep -o  显示匹配过程


2) 你可认知[]?
  []里面的内容去掉特殊含义
  [a-z|A-Z|0-9]  匹配大小写字母和数字,匹配 |
  [^abc]  取反,排除  排除a或b或c的内容,匹配a或b或c之外的内容

取IP
# ip a s eth0 | sed -n '3p' | sed -r 's#(.*t )(.*)(/.*)#\2#g'    
精简   # ip a s eth0 | sed -rn '3s#(.*t )(.*)(/.*)#\2#gp'
# ip a s eth0 | awk -F'[ /]+' 'NR==3{print $3}'

 

与查询


awk 'NR>=1&&NR<=5&&/(root|daemon)/' /etc/passwd

awk -F':' 'NR>=1&&NR<=5&&/(root|daemon)/{print $0,$1}' /etc/passwd

[root@publish1 yfbkf]# echo 1234 | passwd --stdin yukw
更改用户 yukw 的密码 。
passwd:所有的身份验证令牌已经成功更新。

其他学习地址:

sed 之 & 符号 - LiuYanYGZ - 博客园

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值