简单介绍一下awk命令,awk方法的精髓,主要是对文本进行“列”的操作。
基本语法:
awk [-F] "field-operator" 'comand' inputfiles
-F和field-operator一起使用,field-operator是域分隔符,如果不使用-F选项,则默认的域分隔符为空格。后面命令一般需要用一堆“{}”括起来,然后进行必要的操作。
比较全一点的命令:
'{if($1~/^A/) print $1}'
意思是,如果第一列($1)里面有匹配(~)正则表达式(/^A/)的话,那么就输出(print)到标准输出。需要注意,条件必须要用一堆"()"括起来,正则表达式需要用“//”括起来。当然无条件匹配时,可以直接输出指定列,如:'{print $1}'。
现在我们来实操一下。
日记文件的一段内容,要求获取订单号字段为returnOrderId的值。如下:
"2022-01-20 16:26:13","server-0002.center.hzI","/home/admin/logs/error.log","1642667175","","2022-01-20 16:26:13.242 ERROR 13240-> [ConsumeMessageThread_17] [com.server.listener.ReturnOrderListener.consume,75] - consumer return-order audit mq error. mesBody : {""returnOrderId"":14595712960430400} | error:DefaultExceptionCodeMessage{code='TMS-1002', message='服务异常:获取门店信息异常}"
"2022-01-20 16:26:12","server-0002.center.hzI","/home/admin/logs/error.log","1642667175","","2022-01-20 16:26:12.906 ERROR 13240-> [ConsumeMessageThread_16] [com.server.listener.ReturnOrderListener.consume,75] - consumer return-order audit mq error. mesBody : {""returnOrderId"":14595712939458880} | error:DefaultExceptionCodeMessage{code='TMS-1002', message='服务异常:获取门店信息异常}"
"2022-01-20 16:08:32","server-0001.center.hzH","/home/admin/logs/error.log","1642666115","","2022-01-20 16:08:32.160 ERROR 6207-> [ConsumeMessageThread_20] [com.server.listener.ReturnOrderListener.consume,75] - consumer return-order audit mq error. mesBody : {""returnOrderId"":14595426447524160} | error:DefaultExceptionCodeMessage{code='TMS-1002', message='服务异常:获取门店信息异常}"
"2022-01-20 16:06:13","server-0002.center.hzI","/home/admin/logs/error.log","1642665975","","2022-01-20 16:06:13.139 ERROR 13240-> [ConsumeMessageThread_10] [com.server.listener.ReturnOrderListener.consume,75] - consumer return-order audit mq error. mesBody : {""returnOrderId"":14595712960430400} | error:DefaultExceptionCodeMessage{code='TMS-1002', message='服务异常:获取门店信息异常}"
1、根据 returnOrderId 字符串截取
命令:
cat 文件名 | awk -FreturnOrderId '{print $2}'
结果:
2、继续根据字符串 error 截取
命令:
cat 文件名 | awk -FreturnOrderId '{print $2}' | awk '{print $1}'
结果:
3、继续根据符号 : 截取
命令:
cat 文件名 | awk -FreturnOrderId '{print $2}' | awk '{print $1}' | awk -F: '{print $2}'
结果:
4、去掉重复的行
命令:
cat 文件名 | awk -FreturnOrderId '{print $2}' | awk '{print $1}' | awk -F: '{print $2}' | awk '!a[$0]++'
结果:
5、替换符号 } 为 ,
命令:
cat 文件名 | awk -FreturnOrderId '{print $2}' | awk '{print $1}' | awk -F: '{print $2}' | awk '!a[$0]++' | awk '{gsub(/}/,","); print $0}'
结果: