Linux命令 awk

$ awk '条件类型 1{动作 1} 条件类型 2{动作 2} ...' filename  # awk 后面接两个单引号并加上大括号{} 来设定想要对数据进行的操作。

$ cat awk_file | awk '{print $1 " " $3}'  # 非变量部分需要使用双引号来括住。

 1 $ cat awk_file 
 2 dmtsai    pts/0    192.168.1.100    Tue Jul 14 17:32   still logged in
 3 dmtsai    pts/0    192.168.1.100    Thu Jul  9 23:36 - 02:58  (03:22)
 4 dmtsai    pts/0    192.168.1.100    Thu Jul  9 17:23 - 23:36  (06:12)
 5 dmtsai    pts/0    192.168.1.100    Thu Jul  9 08:02 - 08:17  (00:14)
 6 dmtsai    tty1                      Fri May 29 11:55 - 12:11  (00:15)
 7 $ cat awk_file | awk '{print $1 "	" $3}'
 8 dmtsai    192.168.1.100
 9 dmtsai    192.168.1.100
10 dmtsai    192.168.1.100
11 dmtsai    192.168.1.100
12 dmtsai    Fri

结果最后一行出现了问题。所以在使用awk时,需要事先确认数据,如果是连续性数据,不能有空格或tab在内。

在awk括号内,每行的每个字段都有变量名称,即$1、$2...;非变量部分需要使用双引号来表示。

$ cat awk_file | awk '{print $0}'  # 整行

批量杀死进程:

sudo ps -ef | grep python | grep -v 'grep' | awk '{print $2}' | xargs kill -9

NR:当前处理的是第几行

NF:每行有几个字段

FS:目前的分隔符,默认为空格

1 $ cat awk_file | awk '{print $1 "	 lines: " NR "	 column: " NF}'
2 dmtsai     lines: 1     column: 10
3 dmtsai     lines: 2     column: 10
4 dmtsai     lines: 3     column: 10
5 dmtsai     lines: 4     column: 10
6 dmtsai     lines: 5     column: 9

awk的逻辑运算符

passwd文件以':'为分隔符,

第一行没有正确显示。这是因为当读入第一行时,变数$1、$2... 默认还是以空格为分隔符的,所以虽然定义了FS=":",却只能在第二行后才开始生效。

解决方法:BEGIN

$ cat passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 " " $3}'

awk实现计算功能:

第1行只是说明,不参与运算(NR==1时不处理)

第2行以后参与运算(NR>=2时处理)

$ cat pay.txt | awk 'NR==1{printf "%10s %10s %10s %10s %10s ", $1, $2, $3, $3, "total"}  # Enter键
> NR>=2{total = $2 + $3 + $4  # Enter键
> printf "%10s %10d %10d %10d %10.2f ", $1, $2, $3, $4, total}'

如果有多个指令需要执行(例如,上面的total和printf),可用 ';' 或Enter 分开。

与bash shell 的变量不同,在awk中,变量可以直接使用,不需加$ 符号(例如,total)。

awk括号内,也支持if语句

$ cat pay.txt | awk '{if(NR==1) printf "%10s %10s %10s %10s %10s ", $1, $2, $3, $3, "total"}
> NR>=2{total = $2 + $3 + $4
> printf "%10s %10d %10d %10d %10.2f ", $1, $2, $3, $4, total}'

awk也支持循环计算,这一部分参考扩展阅读部分。

原文地址:https://www.cnblogs.com/yangxiaoling/p/10552329.html