linux运维

awk常用命令

2019-10-29  本文已影响0人  KN郑某某

1. 准备文件

准备文件test.log,内容如下。三项分别是:日期项目版本号

'2019年06月05日10:03:13' aaa                   0e604b6b7fa0a5610c96aee0a8407d9b89b6732a
'2019年06月25日15:14:36' bbb                   e5fa8f4d2b08867df8cf47e6f8a2bb269043c7cb
'2019年06月28日16:47:27' bbb                   0727437c9e4d52ce0fcdb5276d6507d1c6ad5d65
'2019年07月16日14:53:51' ccc                   972b9389fc25e8cef21377967961a43275d8f136
'2019年10月29日11:21:42' aaa                   4fae5956698f1cc5b223957cf7197b826faa7fef
'2019年10月29日11:33:38' bbb                   08ba46a814eae69d37b90f2d075eb27ce62bb07f

2. 基本打印

$ awk '{print $1}' test.log
$ awk '{print $0}' test.log

内置参数

NR:行号
NF:总列数
$0:整行
$1-n:代表列序 , $1第一列,$n第n列

默认按空格或TAB分割, 可以自定义,例如使用#作为分割符

$ awk -F '#' '{print $3}' test.log

3. 示例

awk 命令默认是按行扫描的,如果需要扫描的前后执行一些逻辑,可以按照以下的代码结构设置。

awk 'BEGIN {之前的逻辑} {中间的扫描逻辑} END {之后的逻辑}' test.log

可以将执行程序写到文件里面,执行时设置执行脚本文件。例如脚本文件是scriptfile,执行如下

$ awk -f scriptfile test.log

删除示例文件中重复的项目,保留最后一条

$ awk '{ line[$2] = $0 } END { for (key in line) { print line[key] } }' test.log

可以按照时间排序以下,用到 sort命令, -k1参数表示按照第一列排序。这里的变量line类似map,遍历输出。

$ awk '{ line[$2] = $0 } END { for (key in line) { print line[key] } }' test.log | sort -k1
$ awk '{ line[NR] = $0 } END { for (i = NR; i > 0; --i) print line[i] }' test.log

在BEGIN初始化内置的分割符,之后再打印

$ awk 'BEGIN {OFS="#"} {print $1,$2,$3}' test.log

打印结果

'2019年06月05日10:03:13'#aaa#0e604b6b7fa0a5610c96aee0a8407d9b89b6732a
'2019年06月25日15:14:36'#bbb#e5fa8f4d2b08867df8cf47e6f8a2bb269043c7cb
'2019年06月28日16:47:27'#bbb#0727437c9e4d52ce0fcdb5276d6507d1c6ad5d65
'2019年07月16日14:53:51'#ccc#972b9389fc25e8cef21377967961a43275d8f136
'2019年10月29日11:21:42'#aaa#4fae5956698f1cc5b223957cf7197b826faa7fef
'2019年10月29日11:33:38'#bbb#08ba46a814eae69d37b90f2d075eb27ce62bb07f
上一篇下一篇

猜你喜欢

热点阅读