awk进阶

awk:报告生成工具,能够将文本处理为比较直观理想的报表。主要是对文本结果的格式化,也能处理文本搜索,但是效率要比grep低的多的多。

用法格式:

awk [options] ‘script‘ file1,file2 . . .
‘PATTERN{ action }‘

一、分隔符:字段分隔符,行分隔符

-F: 输入分隔符,下面以:号为分隔符。

[[email protected] ~]#  awk -F: ‘{print $1,$7}‘ /etc/passwd
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
operator /sbin/nologin
games /sbin/nologin
gopher /sbin/nologin
ftp /sbin/nologin
nobody /sbin/nologin

BEGIN模式:正式awk处理文本之前做一些准备工作。#必须在awk处理之前

[[email protected] ~]# awk -F: ‘BEGIN {print "Username Shell"} {print $1,$7}‘ /etc/passwd
Username Shell
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
operator /sbin/nologin
games /sbin/nologin
gopher /sbin/nologin
[[email protected] ~]# awk  ‘BEGIN {FS=":"} {print $1,$7}‘ /etc/passwd
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
operator /sbin/nologin
games /sbin/nologin
gopher /sbin/nologin
ftp /sbin/nologin
nobody /sbin/nologin

OFS:输出格式,OFS=***** 输出格式如下:

[[email protected] ~]# awk  ‘BEGIN {FS=":"; OFS="*****"} {print $1,$7}‘ /etc/passwd
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
operator*****/sbin/nologin
games*****/sbin/nologin
gopher*****/sbin/nologin
ftp*****/sbin/nologin
nobody*****/sbin/nologin

END模式:

[[email protected] ~]# awk  ‘BEGIN {FS=":"; OFS=":"} {print $1,$7}  END{print "=========END=========="}‘ /etc/passwd
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
operator:/sbin/nologin
games:/sbin/nologin
gopher:/sbin/nologin
ftp:/sbin/nologin
nobody:/sbin/nologin
vcsa:/sbin/nologin
saslauth:/sbin/nologin
postfix:/sbin/nologin
sshd:/sbin/nologin
nginx:/sbin/nologin
apache:/sbin/nologin
=========END==========

完善一下

[[email protected] ~]# awk  ‘BEGIN {FS=":"; OFS=":"; print "Username  Shell"} {print $1,$7}  END{print "=========END=========="}‘ /etc/passwd
Username  Shell
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
operator:/sbin/nologin
games:/sbin/nologin
gopher:/sbin/nologin
ftp:/sbin/nologin
nobody:/sbin/nologin
vcsa:/sbin/nologin
saslauth:/sbin/nologin
postfix:/sbin/nologin
sshd:/sbin/nologin
nginx:/sbin/nologin
apache:/sbin/nologin
=========END==========

NF显示字段:

[[email protected] ~]# df -lh |awk ‘{print NF}‘
7
1
5
6
6

二、正则表达式:/PATERN/只匹配符合条件的行。

例:显示以sh结尾的行

[[email protected] ~]# awk  ‘BEGIN {FS=":"; OFS=":"; print "Username  Shell"} /sh$/ {print $1,$7}  END{print "=========END=========="}‘ /etc/passwd
Username  Shell
root:/bin/bash
=========END==========

表达式:>, <,>-,<=,~,!~

匹配ID号大于50的账号

[[email protected] ~]# awk -F: ‘$3>=50 {print $1,$3}‘ /etc/passwd
nobody 99
vcsa 69
saslauth 499
postfix 89
sshd 74
nginx 498

匹配/bin/bash账号

[[email protected] ~]# awk -F: ‘$7~/bash/ {print $1,$3}‘ /etc/passwd
root 0
test1 500
test2 501

不匹配/bin/bash账号

[[email protected] ~]# awk -F: ‘$7!~/bash/ {print $1,$3}‘ /etc/passwd
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
uucp 10
operator 11
games 12
gopher 13
ftp 14
nobody 99
vcsa 69
saslauth 499
postfix 89
sshd 74
nginx 498
apache 48

三、printf

printf命令的使用格式:

printf fromat,item1,item2...

要点:

1、其与print命令的最大不同是,printf所需要指定format;

2、format用于指定后面的每个item的输出格式;

3、printf语句不会自动打印换行符;\n

format格式的指示符都以%开头,后跟一个字符;如下:

%c;显示字符的ASCII码;

%d,%i;十进制整数;

%e,%E;科学计数法数值;

%f;显示浮点数;

%g,%G;以科学计数法的格式或浮点格式显示数值;

%s;显示字符串;

%u:无符号整数;

%%;显示%自身;

修饰符:

N:显示宽度;

-:左对齐;

+:显示数值符号;

例子

[[email protected] ~]# awk -F: ‘{printf "%15s %i\n",$1,$3}‘ /etc/passwd
           root 0
            bin 1
         daemon 2
            adm 3
             lp 4
           sync 5
       shutdown 6
           halt 7
           mail 8
           uucp 10
       operator 11
          games 12
         gopher 13
            ftp 14
         nobody 99
           vcsa 69
       saslauth 499
        postfix 89
           sshd 74
          nginx 498
         apache 48
          test1 500
          test2 501

%u显示无符号整数,-%15s左对齐

[[email protected] ~]# awk -F: ‘{printf "%-15s %u\n",$1,$3}‘ /etc/passwd
root            0
bin             1
daemon          2
adm             3
lp              4
sync            5
shutdown        6
halt            7
mail            8
uucp            10
operator        11
games           12
gopher          13
ftp             14
nobody          99
vcsa            69
saslauth        499
postfix         89
sshd            74
nginx           498
apache          48
test1           500
test2           501

五、算术操作符:

-x:负值

+x:转换为数值:

x^y;

x**y 次方

x*y 乘法

x/y

x+y

x-y;

x%y

赋值操作符:

=

+=

-=

*=

/=

%=

^=

**=

++

--

需要注意的是,如果其模式为=号,此时使用/*/可能会有语法错误,应以/[=]/替代;

布尔值

awk 中任何非0值或非空字符串为真,反之就为假:

比较操作符

x<y            True if x is less than y.

x<=y          True if x less than or equal to y.

x>y            True if x is greater than y.

x>=y          True if x is greater than or equal to y.

x==y          True if x is equal to y.

x!=y           True if x is not equal to y .

x~y            True if the string x matches the regexp denoted by y.

x!~y            True if the string x does not match the regexp dented by y.

表达式建的逻辑关系符:

&&

||

例:显示ID号大于500并且是/bin/bash的账号。

[[email protected] ~]# awk -F:  ‘$3>=500 &&$7~/bash/ {printf "%-15s %i %s\n ",$1,$3,$7}‘ /etc/passwd
test1           500 /bin/bash
test2           501 /bin/bash

条件表达式:

selector?if-true-exp:if-false-exp

if selector;then

if-true-exp

else

if-false-exp

fi

函数调用:

function_name(para1,para2)

六、常用的模式类型:

1、Regexp:正则表达式,格式为/regular expression/

2、expression:表达式,其值非0或为空字符时满足条件,如:$1 ~/foo/ 或$1=="abc",用运算符~(匹配)和!~(不匹配)。

3、Ranges:指定的匹配范围,格式为Pat1,Pat2

4、BEGIN/END:特殊模式,仅在awk命令执行前一次或结束前运行一次。

5、Empty(空模式):匹配任意输入行;

常见的Action

1、Expression;

2、Control statements

3、Compound statements

4、Input statements

5、Output statements

/正则表达式/:使用通配符的扩展集

关系表达式:可以用下面运算符进行操作,可以是字符或数字比较,如$2>$1选择第二个字段比第一个字段长的行。

模式匹配表达式:

模式:指定一个行的范围,改语法不能包括BEGIN和END模式。

例:打印abc开始到aaa结束所匹配的行内容

[[email protected] ~]# cat test1.sh
mmm
opq
abc 1
cde 2
aaa 3
mnt 4
abc 5
hello 6
are 7
aaa 8
haow 9
are 10
you 11
abc 12
hello 13
world 14
[[email protected] ~]# awk ‘/abc/,/aaa/ {print $0}‘ test1.sh
abc 1
cde 2
aaa 3
abc 5
hello 6
are 7
aaa 8
abc 12
hello 13
world 14

七、控制语句:

if-else

语法:if(condition){then-body} else {[ else-body ]}

例子:如果用户的ID号是0,就是管理员。否则就是普通用户

[[email protected] ~]# awk -F: ‘{if ($1=="root") print $1, "Admin";else print $1,"Common User"}‘ /etc/passwd
root Admin
bin Common User
daemon Common User
adm Common User
lp Common User
sync Common User
shutdown Common User
halt Common User
mail Common User
uucp Common User
operator Common User
games Common User
gopher Common User
ftp Common User
nobody Common User
vcsa Common User
saslauth Common User
postfix Common User
sshd Common User
nginx Common User
apache Common User
test1 Common User
test2 Common User

显示ID号大于500的用户总数

[[email protected] ~]# awk -F: -v sum=0 ‘{if ($3>=500) sum++} END{print sum}‘ /etc/passwd
2

while

语法:while (condition) {statement1;statment2;...}

主要目的是每一个片中进行循环,不是每一行哦。

[[email protected] ~]# awk -F: ‘{i=1;while (i<3) {print $i;i++}}‘ /etc/passwd
root
x
bin
x
daemon
x
adm
x
lp
x
sync
x
shutdown
x
halt
x
mail
x
uucp
x
operator
x
games
x
gopher
x
ftp
x
nobody
x
vcsa
x
saslauth
x
postfix
x
sshd
x
nginx
x
apache
x
test1
x
test2
x
[[email protected] ~]# awk -F: ‘{i=1;while (i<=NF) {if (length($i)>=4) {print $i};i++}}‘ /etc/passwd
root
root
/root
/bin/bash
/bin
/sbin/nologin
daemon
daemon
/sbin
/sbin/nologin
/var/adm
/sbin/nologin
/var/spool/lpd
/sbin/nologin
sync
sync
/sbin
/bin/sync
shutdown
shutdown
/sbin
/sbin/shutdown
halt
halt
/sbin
/sbin/halt
mail
mail
/var/spool/mail
/sbin/nologin
uucp
uucp
/var/spool/uucp
/sbin/nologin
operator
operator
/root
/sbin/nologin
games
games
/usr/games
/sbin/nologin
gopher
gopher
/var/gopher
/sbin/nologin
FTP User
/var/ftp
/sbin/nologin
nobody
Nobody
/sbin/nologin
vcsa
virtual console memory owner
/dev
/sbin/nologin
saslauth
"Saslauthd user"
/var/empty/saslauth
/sbin/nologin
postfix
/var/spool/postfix
/sbin/nologin
sshd
Privilege-separated SSH
/var/empty/sshd
/sbin/nologin
nginx
Nginx web server
/var/lib/nginx
/sbin/nologin
apache
Apache
/var/www
/sbin/nologin
test1
/home/test1
/bin/bash
test2
/home/test2
/bin/bash
[[email protected] ~]# awk -F: ‘{i=1;while (i<=3) {printf "%s", $i;i++;};printf "\n"}‘ /etc/passwd
rootx0
binx1
daemonx2
admx3
lpx4
syncx5
shutdownx6
haltx7
mailx8
uucpx10
operatorx11
gamesx12
gopherx13
ftpx14
nobodyx99
vcsax69
saslauthx499
postfixx89
sshdx74
nginxx498
apachex48
test1x500
test2x501

打印大于100的数值,每行显示

[[email protected] ~]# cat test2.sh
89 746 38 8489 99
55 34
857 7384 75492
88
56
13 83
[[email protected] ~]# awk ‘{i=1;while (i<=NF) {if ($i>=100) print $i;i++}}‘ test2.sh
746
8489
857
7384
75492

do-while

语法:do{statemenet1,statement2,...} while(condition)

先执行一次,不管条件满足与否至少执行一次循环体。

[[email protected] ~]# awk -F: ‘{i=1;do {print $i;i++}while(i<=3)}‘ /etc/passwd

for

语法:for (variable assignment;condition;iteration process) {statement1,statement2,...}

[[email protected] ~]# awk -F: ‘{for(i=1;i<3;i++) print $i}‘ /etc/passwd
root
x
bin
x
daemon
x
adm
x
lp
x
sync
x
shutdown
[[email protected] ~]# awk -F: ‘{for(i=1;i<NF;i++) {if (length($i)>=4) {print $i}}}‘ /etc/passwd
root
root
/root
/bin
daemon
daemon
/sbin
/var/adm
/var/spool/lpd
sync
sync
/sbin
shutdown
shutdown
/sbin
halt
halt
/sbin
mail
mail
/var/spool/mail
uucp
uucp
/var/spool/uucp
operator
operator
/root
games
games
/usr/games
gopher
gopher
/var/gopher
时间: 2024-08-08 09:39:21

awk进阶的相关文章

第10章:awk进阶操作

第10章:awk进阶操作 在第4章:查找与替换简单的讲解了awk的使用,本章介绍详细讲解awk的使用.awk是一个强大的文本分析工具,简单的说awk就是把文件逐行的读入, 以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理.在shell脚本中文本处理功能awk功能其强大. 7.1.awk命令形式 awk命令在shell脚本基本形式通常由四部分组成: [-F|-f|-v] (参数选项).BEGIN语句块(初始化代码块).pattern{commadns}(能够使用模式匹配的通用语句块).E

awk之二、awk进阶

awk命令 awk [options] '/pattern{action}' options -F 工作遍历模式:迭代,循环 pattern: 定界:addr1,addr2 表达式:$3 > 500 /pattern/ 模式 BEGIN{}:在遍历操作开始之前执行一次 END{}:在遍历操作结束之后.命令退出自签执行一次 action:print,printf:用于能够实现格式化输出的工具 awk编程语言: 变量.数组 选择.循环 内置函数 自定义函数 awk的输出: 一.print print

linux命令---awk进阶

awk编程:    1.  变量:    在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义.变量的类型可以是数字.字符串.根据使用的不同,未初始化变量的值为0或空白字符串" ",这主要取决于变量应用的上下文.下面为变量的赋值负号列表: 符号 含义 等价形式 = a = 5 a = 5 += a = a + 5 a += 5 -= a = a - 5 a -= 5 *= a = a * 5 a *= 5 /= a = a / 5 a /= 5 %= a = a % 5 a %

awk进阶整理

BEGIN{写在前言,我英语不好,有许多地方直接使用的谷歌翻译.为了能理清awk工具使用的思路,详情还要看awk说明书(man awk) 或者http://www.gnu.org/software/gawk/manual/gawk.html#Regexp} awk初学之常见问题 http://bbs.chinaunix.net/thread-2309494-1-1.htmlawk介绍 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理. 数据可以来自标准输入(stdin).一

文本三剑客之awk进阶篇

此篇主要讲解awk控制语句,捎带说明getline和NR_FNR命令的使用.其中会用到awk基础知识,若有疑惑,可点击文本三剑客之awk基础篇进行翻阅. 示例文件 以下为通篇会用到的几个示例文件: [[email protected] awk_file]# cat file.txt name yu shu wai rick 80 86 90 long 68 89 78 jack 66 60 82 [[email protected] awk_file]# cat file.txt1 name y

shell编程awk进阶

awk操作符 算术操作符:  x+y, x-y, x*y, x/y, x^y, x%y      -x: 转换为负数      +x: 转换为数值 字符串操作符:没有符号的操作符,字符串连接 赋值操作符: =, +=, -=, *=, /=, %=, ^=  ++, -- 比较操作符: ==, !=, >, >=, <, <= awk  -F:   '!($3==0) {print $1}'   /etc/passwd 模式匹配符:  ~ 左边是否和右边匹配包含       !~

每日一题--5 awk进阶

每周绝望原数据文件: id=aa&bb&type&name=cc bb&id=aa&name=cc&type id=aa&type&bb&name=dd type&id=aa&cc&name=bb id=bb&cc&type&name=bb aa&id=bb&name=bb&type 整理并去重,得到效果: id=aa&bb&name=cc&

awk入门及awk数组相关实战

知识点: l 记录与字段 l 模式匹配:模式与动作 l 基本的awk执行过程 l awk常用内置变量(预定义变量) l awk数组(工作常用) l awk语法:循环.条件 l awk常用函数 l 向awk传递参数 l awk引用shell变量 l awk小程序及调试思路 [[email protected] ~]# awk --version|head -1 GNU Awk 3.1.7 第1章 记录和字段 record记录==行, field字段相当于列,字段==列. awk对每个要处理的输入数

不看绝对后悔的Linux三剑客之awk实战精讲

一.Linux三剑客之awk命令精讲 第1章 awk基础入门 1.1 awk简介 awk不仅仅时linux系统中的一个命令,而且是一种编程语言,可以用来处理数据和生成报告(excel).处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取标准输入,awk可以在命令行上直接编辑命令进行操作,也可以编写成awk程序来进行更为复杂的运用.本章主要讲解awk命令的运用 1.2 awk环境简介 [[email protected] ~]# cat /etc/redhat-release