awk基础篇——Shell 文本处理利器

awk

sed倾向于以行为单位进行处理,而awk更擅长将一行分为几段进行处理。

awk的语法

awk用法

| awk '条件类型1{动作1} 条件类型2{动作2} ...' 
awk '条件类型1{动作1} 条件类型2{动作2} ...' filename

awk支持两种数据来源,既可以通过管道获取数据,也可以从文件获取数据。
awk主要是处理每一行的字段内的数据,而默认的字段分割符为空格或tab。分割后的每一个字段都有一个变量名来指代。第一个是$1,第二个是$2,以此类推。$0指代当前这一整行。

awk格式化输出实例

awk格式化输出

[nigel@/vbird_linux]$ last -n 5
nigel    pts/32       10.41.52.111     Wed Sep 12 09:24   still logged in
tris     pts/26       10.41.69.55      Tue Sep 11 22:51   still logged in
tris     pts/24       10.41.69.55      Tue Sep 11 22:46   still logged in
tris     pts/21       10.41.69.55      Tue Sep 11 22:41   still logged in
tris     pts/20       10.41.69.55      Tue Sep 11 22:41   still logged in
[nigel@/vbird_linux]$ last -n 5 | awk '{print $1 "\t" $3}'
nigel   10.41.52.111
tris        10.41.69.55
tris        10.41.69.55
tris        10.41.69.55
tris        10.41.69.55

awk是以行为一次处理的单位,而以字段为最小的处理单位。

awk的特殊变量

awk内置了一些特殊变量,用来存储特殊信息:

  • NF 每一行拥有的变量总数
  • NR 目前awk所处理的行数
  • FS 目前的分割字符,默认是空格

awk条件输出实例

awk条件输出

[nigel@ /vbird_linux]$ head -n 5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[nigel@ /vbird_linux]$ head -n 5 /etc/passwd | awk '{FS=":"} $3<10{print $1 "\t" $3}'
root:x:0:0:root:/root:/bin/bash             
bin     1
daemon  2
adm     3
lp      4

第一行没有处理,是因为此时分割符还是默认的空格,从第二行开始才是”:”
解决方法是使用BEGIN关键字:

[nigel@ /vbird_linux]$ head -n 5 /etc/passwd | awk 'BEGIN {FS=":"} $3<10{print $1 "\t" $3}'
root    0
bin     1
daemon  2
adm     3
lp      4

需要特别注意,自定的风格符从第二行开始才会生效,所以通常我们需要加上BEGIN来让其从第一行就开始生效。

awk计算功能实例

awk也可以进行一些简单的计算

[nigel@DevTJ-todo-1507091995 ~/app/vbird_linux]$ cat pay.txt
Name    1st     2nd     3th
VBird   23000   24000   25000
DMTsai  21000   22000   23000
Bird2   43000   42000   41000                                                                                 
[nigel@/vbird_linux]$ cat pay.txt | awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"} NR>=2{total=$2+$3+$4; printf "%10s %10d %10d %10d %10.2f\n",$1,$2,$3,$4,total}'
      Name        1st        2nd        3th      Total
     VBird      23000      24000      25000   72000.00
    DMTsai      21000      22000      23000   66000.00
     Bird2      43000      42000      41000  126000.00

在使用过程中需要注意以下几点:

  1. 所有awk动作,如果需要多个命令辅助时,可利用分号“;”间隔,或者直接以Enter换行。
  2. 格式化输出时,要加上\n,才能进行分行

awk高级特性

awk还有很多高级特性,如if、循环等。暂时先不接触,把基础用熟练了再说。

PS:本文章内容学习自《鸟哥的linux私房菜 基础学习篇(第三版)》,文章中的所有实例都是亲手操作,保证有效。

猜你喜欢

转载自blog.csdn.net/zhoucheng05_13/article/details/82658103