$ 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也支持循环计算,这一部分参考扩展阅读部分。