温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

shell三剑客之awk(一)

发布时间:2020-07-27 05:24:17 来源:网络 阅读:539 作者:chbo_yang 栏目:开发技术
  • 概述

  awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。   awk是一种优良的文本处理工具。简单来理解,awk逐行读入数据,将其赋给变量$0,然后对其进行切片处理,以$1,$2,..的切片形式,一段一段进行分析处理并输出。

  • 语法

  awk '{pattern + action}' 或者 awk 'pattern {action}'

  pattern 表示 AWK 在数据中查找的内容。

  action 是在找到匹配内容时所执行的一系列命令。 

  • 入门实例

1. 使用$0查看所要处理的文本内容


[root@chboa ~]# awk '{print $0}' test

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

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin


2. awk + pattern,只是输出匹配行,不做其他处理

[root@chboa ]# awk -F: '/root/' test

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

3. awk + action,对所有行进行处理

[root@chboa ]# awk -F: '{print $1}' test

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

uucp

4. awk '/pattern/{action}'匹配并处理输出

[root@chboa ]# awk -F: '/root/{print $7}' test

/bin/bash

5. 打印用户和所对应的bash,中间用tab分割

[root@chboa ~]# awk -F: '{print $1"\t"$7}' test 

root    /bin/bash

bin     /sbin/nologin

daemon  /sbin/nologin

adm     /sbin/nologin

lp      /sbin/nologin

sync    /bin/sync

shutdown        /sbin/shutdown

halt    /sbin/halt

mail    /sbin/nologin

uucp    /sbin/nologin

  • awk内建变量

gawk数据字段和数据行变量
变量

功能

FIELDWIDTHS用空格分隔开的定义了每个数据字段确切宽度的一列数字
FS输入字段分隔符
RS输入数据行分隔符
OFS输出字段分隔符
ORS输出数据行分隔符
  • 实例

  1. 使用FS指定输入字段默认分隔符

[root@chboa sed.test]# awk 'BEGIN{FS=":"}{print $1,$2}' test     

root x

bin x

daemon x

adm x

lp x

sync x

shutdown x

halt x

mail x

uucp x

2. 使用OFS指定输出字段分隔符,默认输出字段分隔符为空格

[root@chboa ~]# awk 'BEGIN{FS=":";OFS="-"}{print $1,$2,$3}' test

root-x-0

bin-x-1

daemon-x-2

adm-x-3

lp-x-4

sync-x-5

shutdown-x-6

halt-x-7

mail-x-8

uucp-x-10

3. 使用FIELDWIDTHS指定切分的固定宽度

[root@chboa ]# awk 'BEGIN{FIELDWIDTHS="6 2 3 3"}{print $1,$2,$3,$4}' test

root:x :0 :0: roo

bin:x: 1: 1:b in:

daemon :x :2: 2:d

adm:x: 3: 4:a dm:

lp:x:4 :7 :lp :/v

sync:x :5 :0: syn

shutdo wn :x: 6:0

halt:x :7 :0: hal

mail:x :8 :12 :ma

uucp:x :1 0:1 4:u

[root@chboa ~]# awk 'BEGIN{FIELDWIDTHS="6 5 8 2 1";OFS="--"}{print $1,$2,$3,$4,$5}' test

root:x--:0:0:--root:/ro--ot--:

bin:x:--1:1:b--in:/bin:--/s--b

daemon--:x:2:--2:daemon--:/--s

adm:x:--3:4:a--dm:/var/--ad--m

lp:x:4--:7:lp--:/var/sp--oo--l

sync:x--:5:0:--sync:/sb--in--:

shutdo--wn:x:--6:0:shut--do--w

halt:x--:7:0:--halt:/sb--in--:

mail:x--:8:12--:mail:/v--ar--/

uucp:x--:10:1--4:uucp:/--va--r

4. 有时候会遇到数据字段占用的多行的情况,经典例子:姓名,地址,电话号码在不同行。

目标:打印姓名,后面跟电话号码。

注解:下面这个实例awk把文件中的每一行都当成一个字段,空白行当做数据行分隔符。

[root@chboa ~]# cat phone 

Myke John

Nanjing Road

(123)110110100


Xiao Ming

Zhengzhou 

(456)120120100

[root@chboa ~]# awk 'BEGIN{FS="\n";RS=""}{print $1,$3}' phone 

Myke John (123)110110100

Xiao Ming (456)120120100

gawk数据变量
变量功能
ARGC当前命令行参数个数
ARGV包含命令行参数的数组
ENVIRON当前shell环境变量及其值组成的关联数组
FILENAME用作gawk输入数据的数据文件的文件名
IGNORECASE设成非零值时,忽略gawk命令中出现的字符串的字符大小写
FNR当前数据文件中的数据行数
NR已处理的输入数据行的数目
NF数据文件中的字段总数
  • 使用内部变量,打印报表

[root@chboa ~]# awk -F: '{print "filename:"FILENAME",linenumber:"NR",columns:"NF",linecontent:"$0}' test

filename:test,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash

filename:test,linenumber:2,columns:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin

filename:test,linenumber:3,columns:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/nologin

filename:test,linenumber:4,columns:7,linecontent:adm:x:3:4:adm:/var/adm:/sbin/nologin

filename:test,linenumber:5,columns:7,linecontent:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

filename:test,linenumber:6,columns:7,linecontent:sync:x:5:0:sync:/sbin:/bin/sync

filename:test,linenumber:7,columns:7,linecontent:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

filename:test,linenumber:8,columns:7,linecontent:halt:x:7:0:halt:/sbin:/sbin/halt

filename:test,linenumber:9,columns:7,linecontent:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

filename:test,linenumber:10,columns:7,linecontent:uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI