shell学习四十天----awk的惊人表现

awk的惊人表现

awk可以胜任几乎所有的文本处理工作。

awk

调用

1.调用awk:

方式一:命令行方式

awk [-F field-separator ] ‘commands’ input-file(s)

[ -F域分隔符 ]是可选的,因为awk使用空格作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项,如果要浏览例如passwd文件.此文件名域以冒号作为分隔符,则必须指明-F选项,如:

awk -F ‘commands’ input-file

方式二:将所有awk命令插入一个文件,并使阿瓦库程序可执行,然后用awk命令解释器作为脚本的首行,以便通过键入脚本名成功来调用它.

方式三:将所有的awk命令插入一个单纯文件,然后调用:

awk -f awk-script-file input-file(s)

-f选项指明在文件awk_script_file中的awk脚本,input_file(s)是使用awk进行浏览的文件名.

模式和动作

任何awk语句都是有模式和动作组成.在一个awk脚本中可能有很多语句,模式部分决定动作语句何时触发以及出发时间.处理即对数据进行的操作.如果省略模式部分,动作将时刻保持执行状态.模式可以是任何条件语句或符合语句或正则表达式.模式包括两个特殊字段BEGIN和END.使用BEGIN语句设置计数和打印头.BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作一句输入文本开始执行.END语句用来在awk完成浏览动作后打印输出文本总数和结尾状态标识.

域和记录

使用$1,$3表示参照第一个和第三个域,注意这里使用逗号做域分割,如果希望打印一个有5个域的记录的所有域,可使用$0,意即所有域.

为打印一个域或所有域,使用printf命令,这是一个awk动作

模式和动作

模式:两个特殊段BEGIN和END

动作:实际动作大多在{}内指明

输出:

1.抽取域

命令:awk -F: ‘{print $1}‘ /etc/passwd

输出:打印/etc/passwd目录下的所有用户名

2.保存输出

awk -F: ‘{print $1}’ /etc/passwd |tee user  使用tee命令,在输出文件的同时,输出到屏幕

3.使用标准输出

awk -F : ‘{print $1}’ /etc/passwd > user3

 

4.打印所有记录

awk -F : ‘{print $0}’ /etc/passwd

5.打印单独记录

awk -F: ‘{print $1,$4}’ /etc/passwd

6.打印报告头

awk -F : ‘BEGIN{print “NAME\n”}{print $1}’ /etc/passwd

7.打印结尾

awk -F: ‘{print $1}END{print “this is all users\n”}’ /etc/passwd

条件操作符

1.匹配

awk -F : ‘{if($1~/root/) print}‘ /etc/passwd

分析:if($1~/roo/t) 表示如果file中包含root,打印他

2.精确匹配

使用符号==

awk -F: ‘{if($3==0) print}‘ /etc/passwd

3.不匹配

!~

awk -F: ‘{if($1!~/linuxone/) print}‘ /etc/passwd

精确不匹配

!=

awk -F: ‘{if($1!=/linuxone/) print}‘ /etc/passwd

4.小于

<

5.小于等于

<=

6.大于

>

7.设置大小写

awk ‘/[Rr]oot’ /etc/passwd

8.任意字符

awk -F : ‘{f($1~/^...t/) print}‘ /etc/passwd

分析:if($1~/^...t/)表示第四个字母是t

9.或关系匹配

awk -F : ‘{if($1~/(squid|nagios)/) print}‘ /etc/passwd

10.行首

awk ‘/^root/‘ /etc/passwd

分析:^root(行首包含root)

11 AND &&

awk -F : ‘{if($1=="root"&&$3=="0") print}‘ /etc/passwd

12.OR ||

内置变量:


变量名


含义


ARCC


命令行参数个数


ARGV


命令行参数列表


ENV |RON


支持队列中的系统环境变量的使用


FNR


浏览文件的记录数


FS


置顶分隔符,等价于-F


NF


浏览记录的域的个数


NR


一度的记录数


OFS


输出域分隔符


ORS


输出记录分隔符


RS


控制记录分隔符

案例:

打印有多少行记录

awk ‘END{print NR}‘ /etc/passwd

设置输入域到变量名

awk -F : ‘{name=$1;path=$7; if(name~/root/)print name"\tpath is : " path}‘ /etc/passwd

域值比较操作

awk ‘{if($6<$7) print $0}‘ input-file

修改文本域只显示修改的记录

awk -F : ‘{if($1=="root"){$1="nagios server" ; print}}‘ /etc/passwd

文件长度相加

ls -l | awk ‘/^[^d]/ {print $9"\t" $5}{tot+=$5}\

END {print "total kb:"tot}‘

内置的字符串函数


gsub(r,s)


在整个$0中s替换r


gsub(r,s,t)


在整个t中s替换r


index(s,t)


返回s中字符串t的第一位置


length(s)


返回s长度


match(s,r)


测试s中是否包含匹配r的字符串


split(s,a,fs)


在fs上将s分成序列a


sub(s,)


用$0中最左边也是最长的字符串替代


subtr(s,p)


返回字符串s中从p开始的后缀部分


substr(s,p,n)


返回字符串s中从p开始长度为n的后缀部分

1.gsub

awk ‘gsub(/^root/,"netseek") {print}‘ /etc/passwd  #将以root开头的字符串替换为netseek并打印

awk ‘gsub(/0/,2){print}‘ /etc/passwd

awk ‘{print gsub(/0/,2) $0}‘ /etc/fstab

2.index

awk ‘BEGIN{print index("root","o")}‘  #查询o在root字符串中出现的第一位置

awk -F : ‘$1=="root" {print index($1,"o")" " $1}‘ /etc/passwd

awk -F : ‘{print index($1,"o") $1}‘ /etc/passwd

3.length

awk -F : ‘{print length($1)}‘ /etc/passwd

wk -F : ‘$1=="root"{print length($1)"\t" $0}‘ /etc/passwd

4.match(在ANCD中查找C的位置)

awk ‘BEGIN{print match("ANCD","C")}‘

5.split返回字符串数组元素个数

awk ‘BEGIN{print split("123#456#789",array,"#")}‘

6.sub只能替换指定域的第一个0

awk ‘sub(/0/,2){print }‘ /etc/fstab

7.substr 按照起始位置以及长度返回字符串的一部分

awk ‘BEGIN{print substr("www.baidu.com",5,9)}‘ #第五个子夫开始,取9个字符

awk ‘BEGIN{print substr("www.baidu.com",5)}‘  #第五个位置开始,一直到最后

字符串屏蔽序列


符号


含义


\b


退格符


\f


走纸换页


\n


新行


\r


回车


\t


tab键(四个空格)


\c


任意其他特殊字符


\ddd


八进制

案例:

awk -F : ‘{print $1,"\b" $2,"\t" $3}‘ /etc/passwd

分析:print和printf两者效果不同

printf修饰符

-  : 左对齐

width : 域的步长0表示0步长

.prec : 最大字符串长度,或小数点右边的位数

awk printf格式


符号


含义


%c


ASCII字符


%d


整数


%e


科学计数法


%f


浮点数


%g


awk决定使用哪种浮点数转换,e或者f


%o


八进制数


%s


字符串


%x


十六进制

1.字符串转换

echo "65" | awk ‘{printf "%c\n", $0}‘

awk ‘BEGIN{printf "%c\n" ,65}‘

awk ‘BEGIN{printf "%f\n",999}‘

2.格式化输出

awk -F : ‘{printf "%-15s %s\n",$1,$3}‘ /etc/passwd

awk -F : ‘BEGIN{printf "USER\t\tUID\n"}{printf "%-15s %s\n",$1,$3}‘ /etc/passwd

3.向一行awk命令传值

who | awk ‘{if ($1==user) print $1 " you are connected :" $2}‘ user=$LOGNAME

4.awk脚本文件(在文件名字后面加后缀.awk翻遍区分)

#!/bin/awk -f

BEGIN{

FS=":"

print "User\t\tUID"

print "----------------"

}

{printf "%-15s %s\n",$1,$3}

END{

print "end"

}

分析:awk脚本文件开头一般都是这样的:#!/bin/awk -f

已经指明了 -f 选项。

执行时,直接在awk脚本名后面加要处理的文件名作为参数即可。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-03 08:15:15

shell学习四十天----awk的惊人表现的相关文章

shell学习四十九天----进程建立

进程 前言:进程指的是运行中程序的一个实例.新进程由fork()与execve()等系统调用所起始,然后运行,知道他们下达exit()系统调用为止. linux系统都支持多进程.尽管计算机看起来像是一次做了非常多事,但除非是他拥有多个CPU,否则一次做了好多事仅仅是个错觉.其实,每一个进程仅容许在一个极短的期间运行,我们称为时间片段,之后进程会先临时搁置,让其它等待中进程运行.时间片段极短,通常仅仅有几微妙,所以人们非常少感觉到进程将控制权交回内核,再交给还有一个进程的这样的文本切换.进程本身不

shell学习四十五天----xargs

执行命令:xargs 当find产生一个文件列表时,该列表提供给另一个命令有时是很有用的. 案例: $touch abc.c erd.c oiy.c $ll ./erd.c ./abc.c ./oiy.c $find -name '*.c'| rm rm: 缺少操作数 请尝试执行"rm --help"来获取更多信息. $find -name '*.c'| xargs rm $find -name '*.c' 无任何显示,说明已成功删除. 1.简介,之所以能用到这个命令,关键是由于很多命

shell学习四十六天----文件系统的空间信息df和du命令

文件系统的空间信息 df命令 df命令提供单行摘要,一行显示一个加载的问价系统的已使用的和可用的空间.其单位视系统而定,有些使用块,有些则是KB.大部分现代实现都支持-k选项,也就是强制使用KB单位,以及-l(小写字母L)选项,仅显示本地文件系统,排除网络加载的文件系统. df命令详解 语法: df [选项] [文件或目录] 用途: 显示一个或多个文件系统内部的inode或空间使用情况 主要选项: -i 显示inode技术,而非空间 -k 显示空间时,以KB为单位,而非块 -l 小写L,仅显示本

shell学习三十四天----printf详解

printf 先来看一个简单的例子:使用命令printf "hello,world\n", 输出:hello,world 再使用echo "hello,world\n",输出为:hello,world\n 案例二:使用命令printf "%s\n" hello,world 输出结果为:hello,world printf命令的完整语法有两个部分: printg format-string [arguments] 第一部分为描述格式规格的字符串,他

shell学习五十四天----进程系统调用的追踪strace

strace 前言:strace常用来跟踪进程执行时的系统调用的所接受的信号.在linux世界,进程是不能直接访问硬件设备,当进程需要访问硬件(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备.strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间,有其在调试的时候,strace能帮助你追踪到一个程序所执行的系统调用.当你想知道程序和操作系统是如何交互的时候,这是极其方便的,比如你想知道执行了哪些系统调用,并且以何种顺序执

shell学习五十六天----延迟进程调度

延迟进程调度 前言:大部分时候,我们都希望进程快点開始,开点结束,别卡.而shell的运行,也是在前一个命令后,立即接着运行下一个命令.命令完毕的速度是与资源的限制有关,且不在shell的权限下. 在交谈模式中使用下,有时不必等到命令完毕才干运行还有一个.这是shell提供的一个简单方式:全部的命令仅仅要在最后加上&字符,都可起始于后台运行,无需等待.仅仅有在少数情况下,必须等待后台进程完毕. 稍稍有四种情况须要延时进程事实上,知道未来的某个事件才运行. 第一种 sleep sleep命令经常使

shell学习四十八天----进程建立

进程 前言:进程指的是执行中程序的一个实例.新进程由fork()与execve()等系统调用所起始,然后执行,知道他们下达exit()系统调用为止. linux系统都支持多进程.虽然计算机看起来像是一次做了很多事,但除非是他拥有多个CPU,否则一次做了好多事只是个错觉.事实上,每个进程仅容许在一个极短的期间执行,我们称为时间片段,之后进程会先暂时搁置,让其他等待中进程执行.时间片段极短,通常只有几微妙,所以人们很少感觉到进程将控制权交回内核,再交给另一个进程的这种文本切换.进程本身不会管理文本切

shell学习四十一天----列出文件ls和od命令

列出文件 首先恶臭命令提供简单的方式列出匹配模式的文件: 命令: echo /bin/*sh #显示/bin下的shell 输出:/bin/bash /bin/csh /bin/dash /bin/sh /bin/tcsh 分析:shell将通配符字符模式替换为匹配的文件列表,echo以空格区分文件列表,在单一行上显示他们.echp不会更近一部解释他的参数,因此与文件系统里的文件也没有任何关系. ls命令则比echo能做更多的处理,因为他纸袋自己的参数应该是文件.未提供命令行选项时,ls只会验证

SHELL编程四剑客练习--awk

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本. awk是三个人名的缩写,他们是:Aho.(Peter)Weinberg和(Brain)Kernighan.正是这三个人创造了awk---一个 优秀的样式扫描与处理