Linux三剑客之—AWK

来源:互联网 发布:gta5挽歌rh8改装数据 编辑:程序博客网 时间:2024/05/16 15:47

这里写图片描述

AWK工具是一种报表生成器,就是对文件进行格式化处理的工具,这里的格式化不是文件系统的格式化,而是对文件内容进行各种“排版”,进而格式化显示。

在Linux上我们使用的事GNU awk也就是gawk,awk文件其实就是gawk的软链接,所以awk和gwak是一样的。我们可以通过命令 man gawk 获得gawk的相关功能说明—gawk - pattern scanning and processing language (模式扫描及处理语言),gawk是一种过程式编程语言。gawk还支持条件判断、数组、循环等各种编程语言中所有可以使用的功能,因此我们还可以吧gawk成为一种脚本语言解释器。

awk的运行方式有3种:

(1)awk命令行
   # awk
(2)awk程序文件
   # awk -f /path/from/awk_script
(3)awk脚本
   # !/bin/awk -f

awk的基本用法:

awk [OPTIONS] 'program' FILE1 FILE2...

   其中program:PATTERN{ACTION STATEMENT}
       program:编程语言
       PATTERN:模式
       ACTION STATEMENT:动作语句,可以是由多个语句组成,各语句间使用分号分隔

   OPTIONS:

       -F[]:指明输入字段分隔符
       -v VAR_NAME=VALUE:变量赋值
       -f /PATH/FROM/AWK_SCRIPT

awk在处理文本时也是一次读取一行文本,然后输入分隔符(默认为空格字符)进行切片,切成n个片段,然后将每一个片段都赋予awk内部的一个变量当中来进行保存,这些变量为12、$3等等一直到最后一个,awk就可以对这些片段进行单独处理,比如显示某一段、特定段,甚至可以对某些偏多进行额外的加工处理,比如运算和基数等。
 
 

1. awk的输入命令:print

用法:print item1,item2,…
      item:字符串,用引号引用
         

print "hello",awk"

这里写图片描述

      变量:显示变量值,可以直接使用变了名进行引用;
         

print name

这里写图片描述

      数值:无须加引号

这里写图片描述

要点:
(1)各 item 之间需要使用逗号分隔;而输出时的分隔符为默认的空白字符;
(2)输出的各 item 可以为字符串或数值、当前记录的字段($#)、变量或awk的表达式;数值会被转换为字符串进行输出;
(3)print 后面的 item 省略时,相当于运行“print $0”,用于输出整行;
(4)输出空白字符:print“ ”

2. 变量

   变量分为內建变量和自定义变量

2.1 内置变量

      FS: Input Field Seperator,输出字段分隔符默认为空白;
         如:

awk -v FS=':' '{print \$1,FS,\$3}' /etc/passwd

      RS:Input Record Seperator,输入时的行分隔符,默认分隔符;
         如:

awk -v RS=' ' '{print }' /etc/passwd

      OFS:Output Field Seperator,输出时字段分隔符,默认为空白字符
         如:

awk -v FS=':' -v OFS=':' '{print \$1,\$3,\$7}' /etc/passwd

      ORS:Output Record Seperator,输出记录分隔符,输出时用指定符号代替换行符
         如:

awk -v RS=' ' -v ORS='###'  '{print }' /etc/passwd

      NF:number of field in current record,当前行字段数量
         如:

awk -F'{print NF}' /etc/fstab     引用内置变量不用\$awk -F: '{print $(NF-1)}' /etc/passwd`

      NR:number of records,行数;命令后跟所有文件将统一合并计数;
         如:

awk '{print NR}' /etc/fstab ; awk END'{print NR}' /etc/fstab

      FNR:行数,各文件单独计数;
         如:

awk '{print FNR}' /etc/fstab /etc/inittab

      FILENAME:当前正在被awk读取的文件的文件名;
         如:

awk '{print FILENAME}' /etc/fstab

      ARGC:awk命令行中的参数个数;
         如:

awk '{print ARGC}' /etc/fstab /etc/inittabawk 'BEGIN {print ARGC}' /etc/fstab /etc/inittab

      ARGV:数组,保存了命令行参数本身;
            ARGV[index]
            ARGV[0],ARGV[1]
         如:

awk 'BEGIN {print ARGV[0]}' /etc/fstab /etc/inittabawk 'BEGIN {print ARGV[1]}' /etc/fstab /etc/inittab

2.2 自定义变量

(1) -v VAR_NAME=VALUE 变量名区分字符大小写
      如:awk -v test='hello gawk' '{print test}' /etc/fstab

这里写图片描述

(2)在program中自定义变量
      如:awk 'BEGIN{test="hello,gawk";print test}'
这里写图片描述

3. awk的输出命令之二:printf格式化输出

语法:

printf FORMAT,item1,item2,...

要点:
      (1)必须提供FORMAT
      (2)与print语句不同,printf不会自动换行,需要显式指定换行符:\n
      (3)FORMAT中需要分别为后面的每个item指定一个格式符,否则item无法显示;

格式符:都以%开头,后跟单个字符;
      %c:显示字符的ASCII码;
      %d,%i:显示为十进制整数;
      %e,%E:科学计数法显示数值;
      %f:显示为浮点数;
      %g,%G:以科学计数法或浮点数格式显示数值;
      %s:显示为字符串;
      %u:显示无符号整数;
      %%:显示%符号自身;

awk -F: '{printf "%s",$1}' /etc/passwd

这里写图片描述

[root@CentOS7 init.d]$awk -F: '{printf "%-20s %10d\n",$1,$3}' /etc/passwdroot                          0bin                           1daemon                        2adm                           3lp                            4sync                          5shutdown                      6halt                          7mail                          8operator                     11games                        12ftp                          14nobody                       99systemd-bus-proxy           999systemd-network             192dbus                         81polkitd                     998abrt                        173unbound                     997tss                          59libstoragemgmt              996rpc                          32colord                      995usbmuxd                     113saslauth                    994geoclue                     993rtkit                       172radvd                        75rpcuser                      29nfsnobody                 65534qemu                        107chrony                      992setroubleshoot              991pulse                       171gdm                          42gnome-initial-setup         990sshd                         74avahi                        70postfix                      89ntp                          38tcpdump                      72ghy                        1000puppet                       52apache                       48

4. awk的操作符

算术操作符:
      x+y, x-y, x*y, x/y, x^y, x%y
            -x: 转换为负数
            +x: 转换为数值

字符串操作符:没有符号的操作符,字符串连接
赋值操作符:
      =, +=, -=, *=, /=, %=, ^=
      ++, –

比较操作符:
      ==, !=, >, >=, <, <=

模式匹配符: ~:左边是否和右边匹配包含 !~:是否不匹配

awk '$0~"^root"' /etc/passwd

这里写图片描述

逻辑操作符: 与&&,或||,非!

示例:

[root@CentOS7 init.d]$awk -F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd rootbindaemonadmlpsyncshutdownhaltmailoperatorgamesftpnobodysystemd-bus-proxysystemd-networkdbuspolkitdabrtunboundtsslibstoragemgmtrpccolordusbmuxdsaslauthgeocluertkitradvdrpcuserqemuchronysetroubleshootpulsegdmgnome-initial-setupsshdavahipostfixntptcpdumpghypuppetapache
[root@CentOS7 init.d]$awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwdrootnfsnobodyghy
[root@CentOS7 init.d]$awk -F: '!($3==0) {print $1}' /etc/passwd bindaemonadmlpsyncshutdownhaltmailoperatorgamesftpnobodysystemd-bus-proxysystemd-networkdbuspolkitdabrtunboundtsslibstoragemgmtrpccolordusbmuxdsaslauthgeocluertkitradvdrpcusernfsnobodyqemuchronysetroubleshootpulsegdmgnome-initial-setupsshdavahipostfixntptcpdumpghypuppetapache
[root@CentOS7 init.d]$awk -F: '!($3>=500) {print $3}' /etc/passwd 0123456781112149919281173593211317275291071714274708938725248

函数调用: function_name(argu1, argu2, …)

条件表达式(三目表达式):

selector?if-true-expression:if-false-expression

示例:

[root@CentOS7 init.d]$awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd           root:Sysadmin or SysUser            bin:Sysadmin or SysUser         daemon:Sysadmin or SysUser            adm:Sysadmin or SysUser             lp:Sysadmin or SysUser           sync:Sysadmin or SysUser       shutdown:Sysadmin or SysUser           halt:Sysadmin or SysUser           mail:Sysadmin or SysUser       operator:Sysadmin or SysUser          games:Sysadmin or SysUser            ftp:Sysadmin or SysUser         nobody:Sysadmin or SysUsersystemd-bus-proxy:Sysadmin or SysUsersystemd-network:Sysadmin or SysUser           dbus:Sysadmin or SysUser        polkitd:Sysadmin or SysUser           abrt:Sysadmin or SysUser        unbound:Sysadmin or SysUser            tss:Sysadmin or SysUser libstoragemgmt:Sysadmin or SysUser            rpc:Sysadmin or SysUser         colord:Sysadmin or SysUser        usbmuxd:Sysadmin or SysUser       saslauth:Sysadmin or SysUser        geoclue:Sysadmin or SysUser          rtkit:Sysadmin or SysUser          radvd:Sysadmin or SysUser        rpcuser:Sysadmin or SysUser      nfsnobody:Common User           qemu:Sysadmin or SysUser         chrony:Sysadmin or SysUser setroubleshoot:Sysadmin or SysUser          pulse:Sysadmin or SysUser            gdm:Sysadmin or SysUsergnome-initial-setup:Sysadmin or SysUser           sshd:Sysadmin or SysUser          avahi:Sysadmin or SysUser        postfix:Sysadmin or SysUser            ntp:Sysadmin or SysUser        tcpdump:Sysadmin or SysUser            ghy:Common User         puppet:Sysadmin or SysUser         apache:Sysadmin or SysUser

后续内容更新中…

原创粉丝点击