一、awk打印除某数据项/某列数/某些列数之外其它列数据的实现
偶尔碰到一个需求,我需要使用awk打印数据,但是只需要打印某列之后的其它列,比如我只要第2列及之后的所有数据,如何实现呢?实际很简单:
#将$1置成空,然后打印即可
awk '{ $1="";print}' filepath
awk '{ $1="";print $0}' filepath
这个能成功按我们的想法执行,说明awk命令中$0并不是在拿到原始数据之后进行行处理时的一行内容,而是最后将各$列相互拼接在一起的$0。而在此之前我一直在脑海里认为$0是awk一开始进行行处理时的原始整行内容,并且不会变化。所以这个命令的执行说明我原来的想法是错的,$0会随着你更改任何一项$列而进行变化。
[online@USER ~]$ cat some.log
year numbers others
2018 19281 kkk 0764 onlyline
2019 123213 kjkl 0987
[online@USER ~]$ awk '{$1="";print}' some.log
numbers others
19281 kkk 0764 onlyline
123213 kjkl 0987
[online@USER ~]$ awk '{print $0;$1="";print $0;}' some.log
year numbers others
numbers others
2018 19281 kkk 0764 onlyline
19281 kkk 0764 onlyline
2019 123213 kjkl 0987
123213 kjkl 0987
[online@USER ~]$ awk '{print $0;$1="";print $0;$5="yes";print}' some.log
year numbers others
numbers others
numbers others yes
2018 19281 kkk 0764 onlyline
19281 kkk 0764 onlyline
19281 kkk 0764 yes
2019 123213 kjkl 0987
123213 kjkl 0987
123213 kjkl 0987 yes
但有一点,即便设置了$1为空,但是在打印的结果中,$1和$2之间的分隔符(这里是空格)依然是存在的。
举一反三地看下以下几种情况:
- 如果我们不要最后一项的话怎么实现呢?也一样很简单,使用NF进行置空。
- 如果我们从某一项起向后几项都不需要时(需要连续去除多列)再打印怎么实现?使用for正循环进行数据置空。
- 如果每天的列数可能不一样,我们需要去掉最后的三列怎么实现?使用for反向循环,从NF起进行处理即可。
以上各项示例如下:
[online@USER ~]$ awk '{$NF="";print $0;}' some.log
year numbers
2018 19281 kkk 0764
2019 123213 kjkl
[online@USER ~]$ awk '{print $0;}' some.log
year numbers others
2018 19281 kkk 0764 onlyline
2019 123213 kjkl 0987
[online@USER ~]$ awk '{ for(i=1; i<=2; i++){ $i="" }; print $0 }' some.log
others
kkk 0764 onlyline
kjkl 0987
#如下,可能开始看不好理解,其作用就是删除每行的最后三列,所以第一行为空行。
[online@USER ~]$ awk '{ for(i=0; i<=2; i++){ $(NF-i)="" }; print $0 }' some.log
2018 19281
2019
二、Twemproxy(redis集群方案)的各配置参数详解
这是一个简单的Twemproxy的配置文件nutcracker.yml内容 publish:November 2, 2018 -Friday:
#Twemproxy的配置文件nutcracker.yml简化内容如下:
[root@123 twemproxy]# vim nutcracker.yml
localRedis:
listen: 127.0.0.1:22122
hash: fnv1a_64
hash_tag: "{}"
distribution: ketama
auto_eject_hosts: false
timeout: 400
redis: true
servers:
- 127.0.0.1:6379:1 server1
- 127.0.0.1:6380:1 server2
- 127.0.0.1:6381:1 server3
上面的Twemproxy(redis集群方案)的配置内容参数详解:
listen: 监听地址和端口(name:port 或者ip:port),也可以用sock文件(/var/run/nutcracker.sock)的绝对路径
hash:#hash函数的名字:
one_at_a_time
md5
crc16
crc32 (crc32 implementation compatible with libmemcached)
crc32a (correct crc32 implementation as per the spec)
fnv1_64
fnv1a_64(默认配置)
fnv1_32
fnv1a_32
hsieh
murmur
jenkins
hash_tag:#两个字符组成的字符串(比如{}),指定key的部分做hash运算。例如两个key aaaa,xxx:{aaaa}:xxxx;指定{}中间部分做hash运算他们将被分配到同一server(找不到的场景使用完整的key做hash)
distribution: #数据分配方式:
ketama:#一致性hash算法,根据server构造hash ring,为每个阶段分配hash范围它的优点是一个节点down后,整个集群re-hash,有部分key-range会跟之前的key-range重合,所以它只能合适做单纯的cache
modula:#根据key做hash值取模,根据结果分配到对应的server这种方式如果集群做re-hash,所有的key值都会目标错乱
random:#不管key值的hash结果是啥,随机选取一个server作为操作目标适合只读场景,需要配合数据加载?
timeout:#单位毫秒,等待到server建立连接的时间或者接收server相应过程的等待时间,默认是无限期等待,等待超时报错:SERVER_ERROR Connection timed out
backlog:#TCP backlog队列,默认512
preconnect: #在进程启动的时候,twemproxy是否需要预连接到所有的server,默认值是false
redis:#使用redis还是memcached协议,默认false(即memcached)
redis_auth: #连接redisserver的验证
server_connections:#每一个server能够打开的最大连接值,默认最大是1
auto_eject_host: #当连接一个server失败次数超过server_failure_limit值时,是否把这个server驱逐出集群,默认是false
server_retry_timeout:#单位毫秒,当auto_eject_host打开后,重试被临时驱逐的server之前的等待时间
server_failure_limit: #当auto_eject_host打开后,驱逐一个server之前重试次数
servers: #serverpool中包含的的server的地址、端口和权重的列表(name:port:weight or ip:port:weight)