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

原创 2015年07月08日 16:38:36

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

 

域和记录

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

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

 

模式和动作

模式:两个特殊段BEGINEND

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

 

输出:

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)

在整个$0s替换r

gsub(r,s,t)

在整个ts替换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")}'  #查询oroot字符串中出现的第一位置

 

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

分析:printprintf两者效果不同

 

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脚本名后面加要处理的文件名作为参数即可。

 

[awk] 用-F指定多分隔符及正则表达式

命令行选项 -F"[@ /t]" 告诉awk @, 空格和Tab都是字段分隔符,例如:awk -F"[@ /t]" '{print $2,$3}' test以@,空格,Tab键分割test文件的每一行...
  • computer055maxi
  • computer055maxi
  • 2011年04月12日 09:44
  • 67983

awk -F 分隔符的正则表达式

1. awk 的分隔符也可以是正则表达式
  • caoshuming_500
  • caoshuming_500
  • 2014年09月03日 17:59
  • 2479

awk -F的用法

$  awk –F’,’ ’{print $1,$2}’ test.txt AWK命令类似于上面,test.txt内容如下 #!/bin/bash 2 this is a test 3 ...
  • sunflowerfsw
  • sunflowerfsw
  • 2016年08月18日 13:44
  • 585

AWK命令使用 小结

awk 最基本功能是在文件或字符串中基于指定规则浏览和抽取信息,它用于一行中分成数个“字段”来处理。适合处理 小型数据。  范例:      cat /etc/passwd | awk '...
  • wh_19910525
  • wh_19910525
  • 2013年01月11日 22:22
  • 14988

使用awk命令获取文本的某一行,某一列

1、打印文件的第一列(域)                 : awk '{print $1}' filename 2、打印文件的前两列(域)                 : awk '{prin...
  • aywb1314
  • aywb1314
  • 2016年08月18日 11:29
  • 11968

[awk] 用-F指定多分隔符,awk的for语句, BEGIN, END

[awk] 用-F指定多分隔符 echo $(pwd)  | awk  -F'[/.@]' '{pring $1,$2,$3,NF,NR}' 比如我的路径 $ pwd ...
  • wulong710
  • wulong710
  • 2014年12月11日 12:39
  • 2409

awk模式开关中多条件判断

一、文本内容测试用文本text内容如下:1 zhao zhao 2 qian qian 3 sun sun 4 li li二、脚本内容测试脚本(AWK语法和C语言类似)内容如下: 其中第一个awk中...
  • tterminator
  • tterminator
  • 2016年08月16日 23:34
  • 5582

Shell脚本之awk详解

Shell脚本之awk详解 一.基本介绍 1.awk:   awk是一个强大的文本分析工具,在对文本文件的处理以及生成报表,awk是无可替代的。awk认为文本文件都是结构化的,它将每...
  • imxiangzi
  • imxiangzi
  • 2015年11月10日 17:00
  • 2126

Shell脚本之awk篇

一、概述 1. 产品概述:     awk是一种编程语言,用于在linux/unix下对文本和数据进行扫描与处理。数据可以来自标准输入、文件、管道。     awk分别代表其作者姓氏的第一个字母。因为...
  • yakoo5
  • yakoo5
  • 2015年02月26日 14:18
  • 3428

shell中awk详解 (模式提取)

您正在学习 Linux 吗?本文对于非常有用的 AWK 文本操作工具进行了介绍,非常有价值。   AWK 实用工具带有其自己的自包含语言,它不仅是 Linux 中也是任何环境中现有的功能最强...
  • xiaoxinyu316
  • xiaoxinyu316
  • 2016年12月19日 21:55
  • 1020
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:shell学习四十天----awk的惊人表现
举报原因:
原因补充:

(最多只允许输入30个字)