需求
通过awk 截取ping 命令的结果的时间返回值,通过返回值的大小控制打印大于3ms的结果显示;
数据源如下
64 bytes from 192.168.2.119: icmp_seq=24 ttl=64 time=4.157 ms
shell代码
ping 192.168.2.18 | awk '{times_part=$7; match(times_part, "[0-9]+");times=substr(times_part, RSTART, RLENGTH);if(times > 3) print $0}'
awk 16进制转数字
echo ff | awk '{a=strtonum("0x"$1);print a;}'
awk 位运算
# 与运算
echo 0x0f | awk '{print and(strtonum($1),0xff);}'
# 左移8位
echo 0xf0 | awk '{print lshift(strtonum($1), 8);}'
# 右移8位
echo 0x0f | awk '{printf("0x%02x\n", rshift(strtonum($1),8));}'
awk 字符串的比较
echo hello | awk -f cm.awk
{
# cm.awk
# 判断字符串是否为空
str=$0
if (str == "")
printf("hello,i'm empty str!\n");
if (str=="hello")
printf("i'm equal to hello!\n");
}
awk 字符串分割
echo "a b c d e" | awk -f cm.awk
{
# cm.awk
str=$0;
len=split(str, str_arr, " ");
for ( i = 1; i <= len; i++) {
printf(" [%d]:#%s# ", i, str_arr[i]);
}
}
注意点
- 使用
awk
的match
功能,match
后RSTART
和RLENGTH
值结合substr
函数使用;