【需求】
...|fieldA=11|fieldB=12|fieldC=13|time=14|...
...|fieldA=21|time=22|fieldB=23|fieldC=24|...
把 time=## 中,时间满足一定条件的,找出来(如小于5、小于4等等)
注意,其中time列的位置 不是固定的
$cat 99.txt
2012-01-13 00:00:22 +766 [INFO] [a02f0b90][src/service.c::3217]>> 2011 ok|time=1|ret=0|uNum=8613711167096|nRuleId=13|sRecDate=20120113|nMultiple=1|nClientId=486539264|nExtClientId=1426784256
2012-01-13 00:00:22 +766 [INFO] [a02f0b90][src/service.c::3217]>> 2011 ok|time=2|ret=0|uNum=8613711167096|nRuleId=13|sRecDate=20120113|nMultiple=1|nClientId=486539264|nExtClientId=1426784256
2012-01-13 00:00:26 +646 [INFO] [a0cf1b90][src/service.c::1102]>>
call_pro_modify_name time|uNum=15280360794|ret=0|time=3
2012-01-13 00:00:22 +766 [INFO] [a02f0b90][src/service.c::3217]>> 2011 ok|time=4|ret=0|uNum=8613711167096|nRuleId=13|sRecDate=20120113|nMultiple=1|nClientId=486539264|nExtClientId=1426784256
2012-01-13 00:00:26 +646 [INFO] [a0cf1b90][src/service.c::1102]>> call_pro_modify_name time|uNum=15280360794|ret=0|time=5
【很精准的办法】
第一步先用 -F参数,分隔符为竖线 '|'
第二步,轮询每个列,用 split 函数分割字段,分隔符为等号 "=";此时"="左边的为time,该列就是time列,只要再判断 time列中时间值,即可
awk -F '|' '{for (i=1;i<=NF;i++) {split( $i, array, "="); if( array[1]== "time" && array[2] < 6 )print $0}}' 99.txt
【举例】
[zhoushx@app2linux04 ~]$ awk -F '|' '{for (i=1;i<=NF;i++) {split( $i, array, "="); if( array[1]== "time" && array[2] < 6 )print $0}}' 99.txt | wc
5 30 751
[zhoushx@app2linux04 ~]$ awk -F '|' '{for (i=1;i<=NF;i++) {split( $i, array, "="); if( array[1]== "time" && array[2] < 5 )print $0}}' 99.txt | wc
4 23 629
[zhoushx@app2linux04 ~]$ awk -F '|' '{for (i=1;i<=NF;i++) {split( $i, array, "="); if( array[1]== "time" && array[2] < 4 )print $0}}' 99.txt | wc
3 16 438
[zhoushx@app2linux04 ~]$ awk -F '|' '{for (i=1;i<=NF;i++) {split( $i, array, "="); if( array[1]== "time" && array[2] < 3 )print $0}}' 99.txt | wc
2 14 382
[zhoushx@app2linux04 ~]$ awk -F '|' '{for (i=1;i<=NF;i++) {split( $i, array, "="); if( array[1]== "time" && array[2] < 2 )print $0}}' 99.txt | wc
1 7 191