Linux三剑客 之 awk学习与应用

最近在调gps模块,要把代码里打印的NMEA的msg给抓出来,单独存在一个文件里,素来听闻awk的强大,这次打算借这个机会学习一波:

也就是说,大概是从下面这样的log中,过滤出$开头的所有行,并删除每一行前面的无关内容:

2019年 02月 28日 星期四 12:02:04 CST
2019年 03月 03日 星期日 22:39:29 CST
hello sed
hello sed
test : djdhdhk 
test '$'NMEA: djdhdhk 
test \'$\'NMEA: djdhdhk 
$fjdshfkjhdjkf
896874h32gkjdsgfdsjf
dfsdu09we7r8923ycdsioyv-92yhgfihdlvhd0f9vu
$NmEA: ssfhgskvhdsk 
dfjskhvudisb
hjksghfgjdhojfoh $NMEA: hudkgciugs98yc0sudjlds

要想完成这件事,需要掌握以下知识:

 

 

 然后就是具体操作了:

awk '{for(i=1;i<NF;i++) {if($i ~ /\$/){ printf(" %s FIND %s %s\n",NR, $i, $(i+1)) } } }'  log.txt

输出以下内容:

 

 如果不想要行号和提示,则只需

awk '{for(i=1;i<NF;i++) {if($i ~ /\$/){ printf(" %s %s\n",  $i, $(i+1)) } } }'  log.txt

如果$后面有多个字段,我们都想输出出来,那么可以这样,因为代码稍长,我们写个awk脚本,然后在awk -f 指定这个脚本

#!/bin/awk
{
    for(i=1;i<NF;i++) {
        if($i ~ /\$/){
            for(j=i;j<=NF;j++)
                { printf("%s ",  $j) }
            printf("\n")
            break
        }
    }
}

使用的时候awk -f  awk.txt log.txt 这样就可以了

 

posted on 2022-08-27 18:44  疾速瓜牛  阅读(62)  评论(0编辑  收藏  举报

导航