awk常用命令

1. 准备文件
【awk常用命令】准备文件test.log,内容如下。三项分别是:日期项目版本号

'2019年06月05日10:03:13' aaa0e604b6b7fa0a5610c96aee0a8407d9b89b6732a '2019年06月25日15:14:36' bbbe5fa8f4d2b08867df8cf47e6f8a2bb269043c7cb '2019年06月28日16:47:27' bbb0727437c9e4d52ce0fcdb5276d6507d1c6ad5d65 '2019年07月16日14:53:51' ccc972b9389fc25e8cef21377967961a43275d8f136 '2019年10月29日11:21:42' aaa4fae5956698f1cc5b223957cf7197b826faa7fef '2019年10月29日11:33:38' bbb08ba46a814eae69d37b90f2d075eb27ce62bb07f

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

    推荐阅读