linux命令_awk

编程

awk

linux命令_sed

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。

之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

学习具体使用前,先来看下 awk 能干些什么事情:

1. 能够将给定的文本内容,按照我们期望的格式输出显示,打印成报表。

2. 分析处理系统日志,快速地分析挖掘我们关心的数据,并生成统计信息;

3. 方便地用来统计数据,比如网站的访问量,访问的 IP 量等;

4. 通过各种工具的组合,快速地汇总分析系统的运行信息,让你对系统的运行了如指掌;

5. 强大的脚本语言表达能力,支持循环、条件、数组等语法,助你分析更加复杂的数据;

……

当然 awk 不仅能做这些事情,当你将它的用法融汇贯通时,可以随心所欲的按照你的意愿,来进行高效的数据分析和统计。

不过我们需要知道,awk 不是万能的,它比较擅长处理格式化的文本,比如 日志csv 格式数据等;

awk和sed的区别

sed的核心是正则,对于sed, 基本的两个概念是匹配和行为。

  1. 匹配是通过区域选择加上正则表达式实现,比如“3到6行以This开头的”
  2. 行为是增删改查。可以在某个位置新增或删除一行,可以通过正则表达式进行变量替换,可以显示满足某些条件的行。配合shell的批处理就会很强大, 比如我想把所有文件的开头添加一个注释,比如我想把所有文件的某一个变量进行替换,比如我想把所有文件满足某些条件的行进行合并和拆分。
  3. 同时,sed提供了一个保持空间(hold space)可以实现逆序输出等操作。
  4. 另外,sed的用法非常灵活,你可以将匹配和行为进行不同的嵌套,举个复杂的例子“将第某行到某行之间的满足A条件的里面满足B条件的行进行C操作和D操作并且将E条件的行进行F操作”这样的灵活组合方式怕是也只有sed了

awk,经常用于格式化输出,也就是将数据按照我们想要的方式来显示,并且可以做一些基本的统计工作。

  1. 它的运作模式是“预处理+逐行处理+最终处理”。一般我们只用“逐行处理”比如对于满足条件的某些行,我们打印某某列。通过指定分隔符,我们很容易的对列进行操作。
  2. 预处理来定义变量,逐行处理来修改变量,最终处理来打印变量。

awk的使用

awk "BEGIN{ commands } /pattern/ {commands} END{ commands }"

1、BEGIN{ commands }开始块就是在程序启动的时候执行的代码部分,并且它在整个过程中只执行一次。一般情况下,我们可以在开始块中初始化一些变量。

注意:开始块部分是可选的,你的程序可以没有开始块部分。

2、/pattern/ {commands}pattern 部分匹配该行内容成功后,才会执行commands 的内容。

3 END{ commands }结束块是在程序结束时执行的代码。

注意:结束块部分也是可选的

awk的语法

awk [选项参数] "script" var=value file(s)

awk [选项参数] -f scriptfile var=value file(s)

选项

-F fs or --field-separator fs

指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。

-v var=value or --asign var=value

-va=1赋值一个用户定义变量a的值为1

-f

-f scripfile,从脚本文件中读取awk命令

-mf nnn and -mr nnn

对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

-W compact or --compat, -W traditional or --traditional

在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。

-W copyleft or --copyleft, -W copyright or --copyright

打印简短的版权信息。

-W help or --help, -W usage or --usage

打印全部awk选项和每个选项的简短说明。

-W lint or --lint

打印不能向传统unix平台移植的结构的警告。

-W source program-text or --source program-text

使用program-text作为源代码,可与-f命令混用。

awk常用变量

变量

描述

$n

$1当前记录的第1个字段的内容。和sed中的$1不同,sed表示第一个参数

$0

整行数据的内容

FS

字段分隔符(默认是空格)

OFS

输出字段的分隔符(默认是空格)

RS

行分隔符(默认以

作为一行的结尾),单行分割成多行用到

NR

行号,从1开始,多文件时候也是连续接着计数

FNR

各文件分别计数的行号,多文件的时候会和NR不同,它会重新计数

NF

一行中字段数量,最后一个字段内容可以用$NF取出

ARGC

命令行参数的数目

ARGV

包含命令行参数的数组,第一个参数是命令awk

awk格式化

字符

功能

%d

十进制有整数符号

%u

十进制无整数符号

%f

浮点数

%s

字符串

%c

单个字符

%p

指针的值

%e

指数形式的浮点数

%x,%X

无符号以十六进制表示的整数

%0

无符号以八进制表示的整数

%g

自动选择合适的表示法

换行

f

清屏并换页

Tab符号

xhh

表示一个ASCII码用16进表示,其中hh是1到2个16进制数

回车

示例

awk "{[pattern] action}" {filenames}   # 行匹配语句 awk "" 只能用单引号

awk [选项] "匹配规则和处理规则 " [处理文本路径]

标准输出 | awk [选项] "匹配规则和处理规则 "

BEGIN{} : BEGIN是在awk处理文本之前运行

// : 使用的匹配规则

{} :循环(每次只处理一行数据)

END{} :当所有的处理全部执行完毕之后,执行END中的相关操作

  • awk -F: "{print $1}" /etc/passwd

    [root@localhost Honeypot-deploy-steps] awk -F: "{print $1}" /etc/passwd

    root

    bin

    daemon

    adm

    lp

    sync

    shutdown

    halt

    mail

    operator

    games

    ftp

    nobody

    systemd-network

    dbus

    polkitd

    sshd

    postfix

    tss

    postgres

  • awk -F: "$3>50{print $0}" /etc/passwd 输出uid大于50的行

    [root@localhost] awk -F: "$3>50{print $0}" /etc/passwd

    nobody:x:99:99:Nobody:/:/sbin/nologin

    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

    dbus:x:81:81:System message bus:/:/sbin/nologin

    polkitd:x:999:998:User for polkitd:/:/sbin/nologin

    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

    postfix:x:89:89::/var/spool/postfix:/sbin/nologin

    tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin

    -F[]:指明输入字段分隔符; 不使用-F时默认以空格为字段分隔符

    [root@localhost Honeypot-deploy-steps] awk "{print $1,$3}"  /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

    sync:x:5:0:sync:/sbin:/bin/sync

    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

    halt:x:7:0:halt:/sbin:/sbin/halt

    ....

  • FS

    [root@localhost Honeypot-deploy-steps] awk  -v FS=":" "{print $1,$3}"  /etc/passwd     输入时的字段分隔符

    root 0

    bin 1

    daemon 2

    adm 3

    lp 4

    sync 5

    shutdown 6

    halt 7

    mail 8

    operator 11

    games 12

    ftp 14

    nobody 99

    systemd-network 192

  • RS awk -v RS=" " "{print $0}" /etc/passwd

  • NF

    [root@localhost Honeypot-deploy-steps] awk "{print NF}" /etc/passwd  输出字段个数

    1

    1

    1

    1

    1

    1

    1

    1

    1

    1

    1

    2

    1

    3

    3

    3

    2

    1

    11

    2

    [root@localhost Honeypot-deploy-steps] awk "{print $NF}" /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

    sync:x:5:0:sync:/sbin:/bin/sync

    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

    halt:x:7:0:halt:/sbin:/sbin/halt

    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

    operator:x:11:0:operator:/root:/sbin/nologin

    games:x:12:100:games:/usr/games:/sbin/nologin

    User:/var/ftp:/sbin/nologin

    nobody:x:99:99:Nobody:/:/sbin/nologin

    Management:/:/sbin/nologin

    bus:/:/sbin/nologin

    polkitd:/:/sbin/nologin

    SSH:/var/empty/sshd:/sbin/nologin

    postfix:x:89:89::/var/spool/postfix:/sbin/nologin

    daemon:/dev/null:/sbin/nologin

    Server:/var/lib/pgsql:/bin/bash

    [root@localhost Honeypot-deploy-steps] awk -F: "NR > 7 && NR < 14{print NR,$0}" /etc/passwd       输出第7行之后的内容且第14行之前的内容输出出来,包含行号

    8 halt:x:7:0:halt:/sbin:/sbin/halt

    9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

    10 operator:x:11:0:operator:/root:/sbin/nologin

    11 games:x:12:100:games:/usr/games:/sbin/nologin

    12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

    13 nobody:x:99:99:Nobody:/:/sbin/nologin

  • FNR:行数,各文件分别计数

    [root@localhost Honeypot-deploy-steps] awk "{print FNR}"  /etc/passwd /etc/issue

    1

    2

    3

    4

    5

    6

    7

    8

    9

    1

    2

    3

    [root@localhost Honeypot-deploy-steps]# awk "{print FNR,$0}" /etc/passwd /etc/issue

    1 root:x:0:0:root:/root:/bin/bash

    2 bin:x:1:1:bin:/bin:/sbin/nologin

    3 daemon:x:2:2:daemon:/sbin:/sbin/nologin

    4 adm:x:3:4:adm:/var/adm:/sbin/nologin

    5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

    6 sync:x:5:0:sync:/sbin:/bin/sync

    7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

    8 halt:x:7:0:halt:/sbin:/sbin/halt

    9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

    1 S

    2 Kernel on an m

    3

  • FILENAME:当前文件名;

    [root@localhost Honeypot-deploy-steps] awk "{print FILENAME,$0}" /etc/passwd /etc/issue

    /etc/passwd root:x:0:0:root:/root:/bin/bash

    /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin

    /etc/passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin

    /etc/passwd adm:x:3:4:adm:/var/adm:/sbin/nologin

    /etc/passwd lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

    /etc/passwd sync:x:5:0:sync:/sbin:/bin/sync

    /etc/passwd shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

    /etc/passwd halt:x:7:0:halt:/sbin:/sbin/halt

    /etc/passwd mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

    /etc/passwd operator:x:11:0:operator:/root:/sbin/nologin

    /etc/passwd games:x:12:100:games:/usr/games:/sbin/nologin

    /etc/passwd ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

    /etc/passwd nobody:x:99:99:Nobody:/:/sbin/nologin

    /etc/passwd systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

    /etc/passwd dbus:x:81:81:System message bus:/:/sbin/nologin

    /etc/passwd polkitd:x:999:998:User for polkitd:/:/sbin/nologin

    /etc/passwd sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

    /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin

    /etc/passwd tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin

    /etc/passwd postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash

    /etc/issue S

    /etc/issue Kernel on an m

    /etc/issue

  • -v

    [root@localhost Honeypot-deploy-steps] awk "{file="passwd";print file,$1}" /etc/passwd 两种方式是一样的

    passwd root:x:0:0:root:/root:/bin/bash

    passwd bin:x:1:1:bin:/bin:/sbin/nologin

    passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin

    passwd adm:x:3:4:adm:/var/adm:/sbin/nologin

    passwd lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

    [root@localhost Honeypot-deploy-steps] awk -v file="passwd" "{print file,$1}" /etc/passwd

    passwd root:x:0:0:root:/root:/bin/bash

    passwd bin:x:1:1:bin:/bin:/sbin/nologin

    passwd daemon:x:2:2:daemon:/sbin:/sbin/nologin

    passwd adm:x:3:4:adm:/var/adm:/sbin/nologin

    passwd lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

  • 模式匹配. 让$1匹配模式/root/

    [root@localhost Honeypot-deploy-steps] awk -F: "$1~/root/{print $7}" /etc/passwd

    /bin/bash

  • 条件表达式

    [root@localhost Honeypot-deploy-steps] awk -F: "{$3>=500?usertype="common user":usertype="sysuser or admin";printf "%20s:%-s

    ",$1,usertype}" /etc/passwd

    root:sysuser or admin

    bin:sysuser or admin

    daemon:sysuser or admin

    adm:sysuser or admin

    lp:sysuser or admin

    sync:sysuser or admin

    shutdown:sysuser or admin

    halt:sysuser or admin

    mail:sysuser or admin

    operator:sysuser or admin

    games:sysuser or admin

    ftp:sysuser or admin

    nobody:sysuser or admin

    systemd-network:sysuser or admin

    dbus:sysuser or admin

    polkitd:common user

    sshd:sysuser or admin

    postfix:sysuser or admin

    tss:sysuser or admin

    postgres:sysuser or admin

  • 通过管道符操作

    [root@localhost Honeypot-deploy-steps] cat -n /etc/passwd | awk -F: "{print $1}"

    1 root

    2 bin

    3 daemon

    4 adm

    5 lp

    6 sync

    7 shutdown

    8 halt

    9 mail

    10 operator

    11 games

    12 ftp

    13 nobody

    14 systemd-network

    15 dbus

    16 polkitd

    17 sshd

    18 postfix

    19 tss

    20 postgres

    • 格式化输出

      统计第一列字符的最大个数

      [root@localhost Honeypot-deploy-steps] awk -F: "BEGIN{num=0}{if(length($1)>num){num=length($1)}}END{print num}" /etc/passwd

      15

      要求输出第1列和最后一列,排版整齐

      [root@localhost Honeypot-deploy-steps] awk -F: "{printf "%-15s %s

      ",$1,$NF}" /etc/passwd

      root /bin/bash

      bin /sbin/nologin

      daemon /sbin/nologin

      adm /sbin/nologin

      lp /sbin/nologin

      在前7行前加7, 前14行前加14,其他原样输出

      参考资料

本文来自云海天,作者:ivanlee717,转载请注明原文链接:https://www.cnblogs.com/ivanlee717/p/16292056.html

以上是 linux命令_awk 的全部内容, 来源链接: utcz.com/z/520517.html

回到顶部