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